diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-06-04 02:39:35 -0400 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-06-04 02:39:35 -0400 |
commit | 43ea62d444b41e9ffff785ede2620b2e64fbb3b7 (patch) | |
tree | 95ccd96da8a15a4ce6586b8a065277770999087a /discord | |
parent | 79c00c68e5845b496f6d3163d6fbc6e1c6de56ae (diff) | |
parent | 28b33d1b220aef5558ef58eb1326510ccccf5361 (diff) | |
download | abaddon-portaudio-43ea62d444b41e9ffff785ede2620b2e64fbb3b7.tar.gz abaddon-portaudio-43ea62d444b41e9ffff785ede2620b2e64fbb3b7.zip |
merge
Diffstat (limited to 'discord')
-rw-r--r-- | discord/discord.cpp | 23 | ||||
-rw-r--r-- | discord/discord.hpp | 7 | ||||
-rw-r--r-- | discord/httpclient.cpp | 7 | ||||
-rw-r--r-- | discord/httpclient.hpp | 4 | ||||
-rw-r--r-- | discord/member.cpp | 2 | ||||
-rw-r--r-- | discord/member.hpp | 3 | ||||
-rw-r--r-- | discord/permissions.hpp | 23 | ||||
-rw-r--r-- | discord/store.cpp | 5 | ||||
-rw-r--r-- | discord/user.cpp | 26 | ||||
-rw-r--r-- | discord/user.hpp | 6 |
10 files changed, 87 insertions, 19 deletions
diff --git a/discord/discord.cpp b/discord/discord.cpp index 0e06e39..c879501 100644 --- a/discord/discord.cpp +++ b/discord/discord.cpp @@ -1,10 +1,10 @@ #include "discord.hpp" #include <cassert> #include "../util.hpp" +#include "../abaddon.hpp" DiscordClient::DiscordClient(bool mem_store) - : m_http(DiscordAPI) - , m_decompress_buf(InflateChunkSize) + : m_decompress_buf(InflateChunkSize) , m_store(mem_store) { m_msg_dispatch.connect(sigc::mem_fun(*this, &DiscordClient::MessageDispatch)); auto dispatch_cb = [this]() { @@ -24,13 +24,15 @@ DiscordClient::DiscordClient(bool mem_store) } void DiscordClient::Start() { + m_http.SetBase(GetAPIURL()); + std::memset(&m_zstream, 0, sizeof(m_zstream)); inflateInit2(&m_zstream, MAX_WBITS + 32); m_last_sequence = -1; m_heartbeat_acked = true; m_client_connected = true; - m_websocket.StartConnection(DiscordGateway); + m_websocket.StartConnection(GetGatewayURL()); } void DiscordClient::Stop() { @@ -1104,6 +1106,17 @@ void DiscordClient::HandleGatewayHello(const GatewayMessage &msg) { SendIdentify(); } +// perhaps this should be set by the main class +std::string DiscordClient::GetAPIURL() { + static const auto url = Abaddon::Get().GetSettings().GetAPIBaseURL(); + return url; +} + +std::string DiscordClient::GetGatewayURL() { + static const auto url = Abaddon::Get().GetSettings().GetGatewayURL(); + return url; +} + DiscordError DiscordClient::GetCodeFromResponse(const http::response_type &response) { try { // pull me somewhere else? @@ -1576,7 +1589,7 @@ void DiscordClient::HandleGatewayReconnect(const GatewayMessage &msg) { std::memset(&m_zstream, 0, sizeof(m_zstream)); inflateInit2(&m_zstream, MAX_WBITS + 32); - m_websocket.StartConnection(DiscordGateway); + m_websocket.StartConnection(GetGatewayURL()); } void DiscordClient::HandleGatewayInvalidSession(const GatewayMessage &msg) { @@ -1597,7 +1610,7 @@ void DiscordClient::HandleGatewayInvalidSession(const GatewayMessage &msg) { m_websocket.Stop(1000); - m_websocket.StartConnection(DiscordGateway); + m_websocket.StartConnection(GetGatewayURL()); } void DiscordClient::HandleGatewayMessageUpdate(const GatewayMessage &msg) { diff --git a/discord/discord.hpp b/discord/discord.hpp index ff4fe2e..029cc71 100644 --- a/discord/discord.hpp +++ b/discord/discord.hpp @@ -50,10 +50,6 @@ class DiscordClient { friend class Abaddon; public: - static const constexpr char *DiscordGateway = "wss://gateway.discord.gg/?v=9&encoding=json&compress=zlib-stream"; - static const constexpr char *DiscordAPI = "https://discord.com/api/v9"; - -public: DiscordClient(bool mem_store = false); void Start(); void Stop(); @@ -191,6 +187,9 @@ private: std::vector<uint8_t> m_decompress_buf; z_stream m_zstream; + std::string GetAPIURL(); + std::string GetGatewayURL(); + static DiscordError GetCodeFromResponse(const http::response_type &response); void ProcessNewGuild(GuildData &guild); diff --git a/discord/httpclient.cpp b/discord/httpclient.cpp index 7297643..05474df 100644 --- a/discord/httpclient.cpp +++ b/discord/httpclient.cpp @@ -1,11 +1,14 @@ #include "httpclient.hpp" //#define USE_LOCAL_PROXY -HTTPClient::HTTPClient(std::string api_base) - : m_api_base(api_base) { +HTTPClient::HTTPClient() { m_dispatcher.connect(sigc::mem_fun(*this, &HTTPClient::RunCallbacks)); } +void HTTPClient::SetBase(const std::string &url) { + m_api_base = url; +} + void HTTPClient::SetUserAgent(std::string agent) { m_agent = agent; } diff --git a/discord/httpclient.hpp b/discord/httpclient.hpp index 8038334..81723b8 100644 --- a/discord/httpclient.hpp +++ b/discord/httpclient.hpp @@ -11,7 +11,9 @@ class HTTPClient { public: - HTTPClient(std::string api_base); + HTTPClient(); + + void SetBase(const std::string &url); void SetUserAgent(std::string agent); void SetAuth(std::string auth); diff --git a/discord/member.cpp b/discord/member.cpp index fee007f..c7d2e4a 100644 --- a/discord/member.cpp +++ b/discord/member.cpp @@ -10,6 +10,7 @@ void from_json(const nlohmann::json &j, GuildMember &m) { JS_D("deaf", m.IsDeafened); JS_D("mute", m.IsMuted); JS_O("user_id", m.UserID); + JS_ON("avatar", m.Avatar); } std::vector<RoleData> GuildMember::GetSortedRoles() const { @@ -33,4 +34,5 @@ void GuildMember::update_from_json(const nlohmann::json &j) { JS_RD("nick", Nickname); JS_RD("joined_at", JoinedAt); JS_RD("premium_since", PremiumSince); + JS_RD("avatar", Avatar); } diff --git a/discord/member.hpp b/discord/member.hpp index 5910f18..ae93524 100644 --- a/discord/member.hpp +++ b/discord/member.hpp @@ -16,6 +16,9 @@ struct GuildMember { bool IsMuted; std::optional<Snowflake> UserID; // present in merged_members + // undocuemtned moment !!!1 + std::optional<std::string> Avatar; + std::vector<RoleData> GetSortedRoles() const; void update_from_json(const nlohmann::json &j); diff --git a/discord/permissions.hpp b/discord/permissions.hpp index d9cff11..5609135 100644 --- a/discord/permissions.hpp +++ b/discord/permissions.hpp @@ -40,10 +40,11 @@ enum class Permission : uint64_t { MANAGE_EMOJIS = (1ULL << 30), // Allows management and editing of emojis USE_SLASH_COMMANDS = (1ULL << 31), // Allows members to use slash commands in text channels REQUEST_TO_SPEAK = (1ULL << 32), // Allows for requesting to speak in stage channels - USE_THREADS = (1ULL << 33), // Allows for creating and participating in threads - USE_PRIVATE_THREADS = (1ULL << 34), // Allows for creating and participating in private threads + MANAGE_THREADS = (1ULL << 34), // Allows for deleting and archiving threads, and viewing all private threads + USE_PUBLIC_THREADS = (1ULL << 35), // Allows for creating and participating in threads + USE_PRIVATE_THREADS = (1ULL << 36), // Allows for creating and participating in private threads - ALL = 0x7FFFFFFFFULL, + ALL = 0x1FFFFFFFFFULL, }; template<> struct Bitwise<Permission> { @@ -107,7 +108,7 @@ constexpr const char *GetPermissionString(Permission perm) { case Permission::USE_EXTERNAL_EMOJIS: return "Use External Emojis"; case Permission::VIEW_GUILD_INSIGHTS: - return "View Guild Insights"; + return "View Server Insights"; case Permission::CONNECT: return "Connect to Voice"; case Permission::SPEAK: @@ -132,6 +133,12 @@ constexpr const char *GetPermissionString(Permission perm) { return "Manage Emojis"; case Permission::USE_SLASH_COMMANDS: return "Use Slash Commands"; + case Permission::MANAGE_THREADS: + return "Manage Threads"; + case Permission::USE_PUBLIC_THREADS: + return "Use Public Threads"; + case Permission::USE_PRIVATE_THREADS: + return "Use Private Threads"; default: return "Unknown Permission"; } @@ -180,7 +187,7 @@ constexpr const char *GetPermissionDescription(Permission perm) { case Permission::USE_EXTERNAL_EMOJIS: return "Allows members to use emoji from other servers, if they're a Discord Nitro member"; case Permission::VIEW_GUILD_INSIGHTS: - return ""; + return "Allows members to view Server Insights, which shows data on community growth, engagement, and more."; case Permission::CONNECT: return "Allows members to join voice channels and hear others."; case Permission::SPEAK: @@ -205,6 +212,12 @@ constexpr const char *GetPermissionDescription(Permission perm) { return "Allows members to add or remove custom emojis in this server."; case Permission::USE_SLASH_COMMANDS: return "Allows members to use slash commands in text channels."; + case Permission::MANAGE_THREADS: + return "Allows members to rename, delete, archive/unarchive, and turn on slow mode for threads."; + case Permission::USE_PUBLIC_THREADS: + return "Allows members to talk in threads. The \"Send Messages\" permission must be enabled for members to start new threads; if it's disabled, they can only respond to existing threads."; + case Permission::USE_PRIVATE_THREADS: + return "Allows members to create and chat in private threads. The \"Send Messages\" permission must be enabled for members to start new private threads; if it's disabled, they can only respond to private threads they're added to."; default: return ""; } diff --git a/discord/store.cpp b/discord/store.cpp index bd9ad32..e7699ba 100644 --- a/discord/store.cpp +++ b/discord/store.cpp @@ -210,6 +210,7 @@ void Store::SetGuildMember(Snowflake guild_id, Snowflake user_id, const GuildMem Bind(m_set_member_stmt, 6, data.PremiumSince); Bind(m_set_member_stmt, 7, data.IsDeafened); Bind(m_set_member_stmt, 8, data.IsMuted); + Bind(m_set_member_stmt, 9, data.Avatar); if (!RunInsert(m_set_member_stmt)) fprintf(stderr, "member insert failed: %s\n", sqlite3_errstr(m_db_err)); @@ -520,6 +521,7 @@ std::optional<GuildMember> Store::GetGuildMember(Snowflake guild_id, Snowflake u Get(m_get_member_stmt, 5, ret.PremiumSince); Get(m_get_member_stmt, 6, ret.IsDeafened); Get(m_get_member_stmt, 7, ret.IsMuted); + Get(m_get_member_stmt, 8, ret.Avatar); Reset(m_get_member_stmt); @@ -823,6 +825,7 @@ bool Store::CreateTables() { premium_since TEXT, deaf BOOL NOT NULL, mute BOOL NOT NULL, + avatar TEXT, PRIMARY KEY(user_id, guild_id) ) )"; @@ -1039,7 +1042,7 @@ bool Store::CreateStatements() { constexpr const char *set_member = R"( REPLACE INTO members VALUES ( - ?, ?, ?, ?, ?, ?, ?, ? + ?, ?, ?, ?, ?, ?, ?, ?, ? ) )"; diff --git a/discord/user.cpp b/discord/user.cpp index a0bce0b..a68346e 100644 --- a/discord/user.cpp +++ b/discord/user.cpp @@ -13,11 +13,33 @@ bool UserData::HasAnimatedAvatar() const { return Avatar.size() > 0 && Avatar[0] == 'a' && Avatar[1] == '_'; } +std::string UserData::GetAvatarURL(Snowflake guild_id, std::string ext, std::string size) const { + const auto member = Abaddon::Get().GetDiscordClient().GetMember(ID, guild_id); + if (member.has_value() && member->Avatar.has_value()) + return "https://cdn.discordapp.com/guilds/" + + std::to_string(guild_id) + "/users/" + std::to_string(ID) + + "/avatars/" + *member->Avatar + "." + + ext + "?" + "size=" + size; + else + return GetAvatarURL(ext, size); +} + +std::string UserData::GetAvatarURL(const std::optional<Snowflake> &guild_id, std::string ext, std::string size) const { + if (guild_id.has_value()) + return GetAvatarURL(*guild_id, ext, size); + else + return GetAvatarURL(ext, size); +} + std::string UserData::GetAvatarURL(std::string ext, std::string size) const { if (HasAvatar()) return "https://cdn.discordapp.com/avatars/" + std::to_string(ID) + "/" + Avatar + "." + ext + "?size=" + size; else - return "https://cdn.discordapp.com/embed/avatars/" + std::to_string(std::stoul(Discriminator) % 5) + ".png"; // size isn't respected by the cdn + return GetDefaultAvatarURL(); +} + +std::string UserData::GetDefaultAvatarURL() const { + return "https://cdn.discordapp.com/embed/avatars/" + std::to_string(std::stoul(Discriminator) % 5) + ".png"; // size isn't respected by the cdn } Snowflake UserData::GetHoistedRole(Snowflake guild_id, bool with_color) const { @@ -58,6 +80,8 @@ void from_json(const nlohmann::json &j, UserData &m) { JS_O("mobile", m.IsMobile); JS_ON("nsfw_allowed", m.IsNSFWAllowed); JS_ON("phone", m.Phone); + JS_ON("bio", m.Bio); + JS_ON("banner", m.BannerHash); } void to_json(nlohmann::json &j, const UserData &m) { diff --git a/discord/user.hpp b/discord/user.hpp index dc3223d..d4711fa 100644 --- a/discord/user.hpp +++ b/discord/user.hpp @@ -52,6 +52,9 @@ struct UserData { std::optional<bool> IsMobile; std::optional<bool> IsNSFWAllowed; // null std::optional<std::string> Phone; // null? + // for now (unserialized) + std::optional<std::string> BannerHash; // null + std::optional<std::string> Bio; // null friend void from_json(const nlohmann::json &j, UserData &m); friend void to_json(nlohmann::json &j, const UserData &m); @@ -60,7 +63,10 @@ struct UserData { bool IsDeleted() const; bool HasAvatar() const; bool HasAnimatedAvatar() const; + std::string GetAvatarURL(Snowflake guild_id, std::string ext = "png", std::string size = "32") const; + std::string GetAvatarURL(const std::optional<Snowflake> &guild_id, std::string ext = "png", std::string size = "32") const; std::string GetAvatarURL(std::string ext = "png", std::string size = "32") const; + std::string GetDefaultAvatarURL() const; Snowflake GetHoistedRole(Snowflake guild_id, bool with_color = false) const; std::string GetMention() const; std::string GetEscapedName() const; |