Skip to content

Commit

Permalink
feat: ✨ add more API methods; update example; fix ActivityParty struc…
Browse files Browse the repository at this point in the history
…t; refactor HttpClient
  • Loading branch information
jontitorr committed Nov 4, 2023
1 parent a0098c1 commit b6af576
Show file tree
Hide file tree
Showing 10 changed files with 179 additions and 14 deletions.
20 changes: 17 additions & 3 deletions examples/simple_with_logging.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#include "ekizu/embed_builder.hpp"
#include <dotenv/dotenv.h>
#include <ekizu/embed_builder.hpp>
#include <ekizu/http_client.hpp>
#include <ekizu/shard.hpp>
#include <nlohmann/json.hpp>
Expand Down Expand Up @@ -104,7 +104,7 @@ std::function<void(Event)> handle_event(HttpClient &http)
{ "https://avatars.githubusercontent.com/u/59069386?v=4" })
.build();

const auto res =
auto res =
http.create_message(
msg.channel_id)
.content(fmt::format(
Expand All @@ -120,10 +120,24 @@ std::function<void(Event)> handle_event(HttpClient &http)
.send();

if (!res) {
fmt::println(
logger->error(
"Failed to send message: {}",
res.error().message());
}

if (msg.content == "delete me") {
res = http.delete_message(
msg.channel_id,
msg.id)
.send();

if (!res) {
logger->error(
"Failed to delete message: {}",
res.error()
.message());
}
}
},
[&logger](const Log &log) {
logger->debug("Log: {}", log.message);
Expand Down
9 changes: 9 additions & 0 deletions include/ekizu/http_client.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,30 @@
#define EKIZU_HTTP_CLIENT_HPP

#include <ekizu/rate_limiter.hpp>
#include <ekizu/request/bulk_delete_messages.hpp>
#include <ekizu/request/create_message.hpp>
#include <ekizu/request/delete_message.hpp>

namespace ekizu
{
struct HttpClient {
explicit HttpClient(std::string_view token);

[[nodiscard]] CreateMessage create_message(Snowflake channel_id);
[[nodiscard]] DeleteMessage delete_message(Snowflake channel_id,
Snowflake message_id);
[[nodiscard]] BulkDeleteMessages
bulk_delete_messages(Snowflake channel_id,
const std::vector<Snowflake> &message_ids);

private:
/// Function which sends an HTTP request. This is wrapped around a ratelimiter and passed around to other structs which need the functionality.
[[nodiscard]] Result<net::HttpResponse> send(net::HttpRequest req);

std::optional<net::HttpConnection> m_http;
RateLimiter m_rate_limiter;
std::function<Result<net::HttpResponse>(net::HttpRequest)>
m_rate_limiter_make_request;
std::optional<std::string> m_token;
};
} // namespace ekizu
Expand Down
4 changes: 2 additions & 2 deletions include/ekizu/presence.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,9 @@ EKIZU_EXPORT void from_json(const nlohmann::json &j, ActivityEmoji &e);

struct ActivityParty {
/// Party id
std::optional<Snowflake> id;
std::optional<std::string> id;
/// Party size
std::optional<uint32_t> size;
std::optional<std::array<uint64_t, 2> > size;
};

EKIZU_EXPORT void to_json(nlohmann::json &j, const ActivityParty &p);
Expand Down
28 changes: 28 additions & 0 deletions include/ekizu/request/bulk_delete_messages.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#ifndef EKIZU_REQUEST_BULK_DELETE_MESSAGES_HPP
#define EKIZU_REQUEST_BULK_DELETE_MESSAGES_HPP

#include <ekizu/snowflake.hpp>
#include <net/http.hpp>

namespace ekizu
{
struct BulkDeleteMessages {
BulkDeleteMessages(
const std::function<Result<net::HttpResponse>(net::HttpRequest)>
&make_request,
Snowflake channel_id,
const std::vector<Snowflake> &message_ids);

operator net::HttpRequest() const;

[[nodiscard]] Result<net::HttpResponse> send();

private:
Snowflake m_channel_id;
std::vector<Snowflake> m_message_ids;
std::function<Result<net::HttpResponse>(net::HttpRequest)>
m_make_request;
};
} // namespace ekizu

#endif // EKIZU_REQUEST_BULK_DELETE_MESSAGES_HPP
6 changes: 4 additions & 2 deletions include/ekizu/request/create_message.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,10 @@ EKIZU_EXPORT void to_json(nlohmann::json &j, const CreateMessageFields &f);
EKIZU_EXPORT void from_json(const nlohmann::json &j, CreateMessageFields &f);

struct CreateMessage {
CreateMessage(std::function<Result<net::HttpResponse>(net::HttpRequest)>,
Snowflake channel_id);
CreateMessage(
const std::function<Result<net::HttpResponse>(net::HttpRequest)>
&make_request,
Snowflake channel_id);

operator net::HttpRequest() const;

Expand Down
27 changes: 27 additions & 0 deletions include/ekizu/request/delete_message.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#ifndef EKIZU_REQUEST_DELETE_MESSAGE_HPP
#define EKIZU_REQUEST_DELETE_MESSAGE_HPP

#include <ekizu/snowflake.hpp>
#include <net/http.hpp>

namespace ekizu
{
struct DeleteMessage {
DeleteMessage(
const std::function<Result<net::HttpResponse>(net::HttpRequest)>
&make_request,
Snowflake channel_id, Snowflake message_id);

operator net::HttpRequest() const;

[[nodiscard]] Result<net::HttpResponse> send();

private:
Snowflake m_channel_id;
Snowflake m_message_id;
std::function<Result<net::HttpResponse>(net::HttpRequest)>
m_make_request;
};
} // namespace ekizu

#endif // EKIZU_REQUEST_DELETE_MESSAGE_HPP
24 changes: 19 additions & 5 deletions src/http_client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,31 @@ HttpClient::HttpClient(std::string_view token)
: m_rate_limiter{ [this](net::HttpRequest req) {
return send(std::move(req));
} }
, m_rate_limiter_make_request{ [this](net::HttpRequest req) {
return m_rate_limiter.send({ std::move(req) });
} }
, m_token{ token }
{
}

CreateMessage HttpClient::create_message(Snowflake channel_id)
{
return CreateMessage{ [this](net::HttpRequest req) {
return m_rate_limiter.send(
{ std::move(req) });
},
channel_id };
return CreateMessage{ m_rate_limiter_make_request, channel_id };
}

DeleteMessage HttpClient::delete_message(Snowflake channel_id,
Snowflake message_id)
{
return DeleteMessage{ m_rate_limiter_make_request, channel_id,
message_id };
}

BulkDeleteMessages
HttpClient::bulk_delete_messages(Snowflake channel_id,
const std::vector<Snowflake> &message_ids)
{
return BulkDeleteMessages{ m_rate_limiter_make_request, channel_id,
message_ids };
}

Result<net::HttpResponse> HttpClient::send(net::HttpRequest req)
Expand Down
35 changes: 35 additions & 0 deletions src/request/bulk_delete_messages.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#include <ekizu/request/bulk_delete_messages.hpp>
#include <nlohmann/json.hpp>

namespace ekizu
{
BulkDeleteMessages::BulkDeleteMessages(
const std::function<Result<net::HttpResponse>(net::HttpRequest)>
&make_request,
Snowflake channel_id, const std::vector<Snowflake> &message_ids)
: m_channel_id{ channel_id }
, m_message_ids{ message_ids }
, m_make_request{ make_request }
{
}

BulkDeleteMessages::operator net::HttpRequest() const
{
return {
net::HttpMethod::Post,
fmt::format("/channels/{}/messages/bulk-delete", m_channel_id),
nlohmann::json{ { "messages", m_message_ids } }.dump(),
{},
};
}

Result<net::HttpResponse> BulkDeleteMessages::send()
{
if (!m_make_request) {
return tl::make_unexpected(std::make_error_code(
std::errc::operation_not_permitted));
}

return m_make_request(*this);
}
} // namespace ekizu
5 changes: 3 additions & 2 deletions src/request/create_message.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,11 @@ void from_json(const nlohmann::json &j, CreateMessageFields &f)
}

CreateMessage::CreateMessage(
std::function<Result<net::HttpResponse>(net::HttpRequest)> make_request,
const std::function<Result<net::HttpResponse>(net::HttpRequest)>
&make_request,
Snowflake channel_id)
: m_channel_id{ channel_id }
, m_make_request{ std::move(make_request) }
, m_make_request{ make_request }
{
}

Expand Down
35 changes: 35 additions & 0 deletions src/request/delete_message.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#include <ekizu/request/delete_message.hpp>

namespace ekizu
{
DeleteMessage::DeleteMessage(
const std::function<Result<net::HttpResponse>(net::HttpRequest)>
&make_request,
Snowflake channel_id, Snowflake message_id)
: m_channel_id{ channel_id }
, m_message_id{ message_id }
, m_make_request{ make_request }
{
}

DeleteMessage::operator net::HttpRequest() const
{
return {
net::HttpMethod::Delete,
fmt::format("/channels/{}/messages/{}", m_channel_id,
m_message_id),
{},
{},
};
}

Result<net::HttpResponse> DeleteMessage::send()
{
if (!m_make_request) {
return tl::make_unexpected(std::make_error_code(
std::errc::operation_not_permitted));
}

return m_make_request(*this);
}
} // namespace ekizu

0 comments on commit b6af576

Please sign in to comment.