diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2020-09-21 18:47:34 -0400 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2020-09-21 18:47:34 -0400 |
commit | 3b4edbfa16861b5013663396e1af827ba889e9df (patch) | |
tree | 51686baf5997c32a3e3aac0aa20368c404f6f3f1 /discord | |
parent | 23b32f8de957204597308f2c1823d5e89f632610 (diff) | |
download | abaddon-portaudio-3b4edbfa16861b5013663396e1af827ba889e9df.tar.gz abaddon-portaudio-3b4edbfa16861b5013663396e1af827ba889e9df.zip |
join/leave guild
Diffstat (limited to 'discord')
-rw-r--r-- | discord/discord.cpp | 97 | ||||
-rw-r--r-- | discord/discord.hpp | 14 | ||||
-rw-r--r-- | discord/http.cpp | 1 | ||||
-rw-r--r-- | discord/invite.cpp | 14 | ||||
-rw-r--r-- | discord/invite.hpp | 15 | ||||
-rw-r--r-- | discord/objects.hpp | 3 | ||||
-rw-r--r-- | discord/store.cpp | 8 | ||||
-rw-r--r-- | discord/store.hpp | 3 |
8 files changed, 141 insertions, 14 deletions
diff --git a/discord/discord.cpp b/discord/discord.cpp index 3b74fd8..9d1842a 100644 --- a/discord/discord.cpp +++ b/discord/discord.cpp @@ -108,6 +108,19 @@ std::set<Snowflake> DiscordClient::GetMessagesForChannel(Snowflake id) const { return ret; } +void DiscordClient::FetchInviteData(std::string code, std::function<void(Invite)> cb, std::function<void(bool)> err) { + //printf("test: %s\n", code.c_str()); + //err(true); + m_http.MakeGET("/invites/" + code + "?with_counts=true", [this, cb, err](cpr::Response r) { + if (!CheckCode(r)) { + err(r.status_code == 404); + return; + }; + + cb(nlohmann::json::parse(r.text)); + }); +} + void DiscordClient::UpdateSettingsGuildPositions(const std::vector<Snowflake> &pos) { nlohmann::json body; body["guild_positions"] = pos; @@ -247,6 +260,14 @@ void DiscordClient::SendLazyLoad(Snowflake id) { m_websocket.Send(j); } +void DiscordClient::JoinGuild(std::string code) { + m_http.MakePOST("/invites/" + code, "", [](auto) {}); +} + +void DiscordClient::LeaveGuild(Snowflake id) { + m_http.MakeDELETE("/users/@me/guilds/" + std::to_string(id), [](auto) {}); +} + void DiscordClient::UpdateToken(std::string token) { m_token = token; m_http.SetAuth(token); @@ -332,6 +353,12 @@ void DiscordClient::HandleGatewayMessage(std::string str) { case GatewayEvent::GUILD_MEMBER_LIST_UPDATE: { HandleGatewayGuildMemberListUpdate(m); } break; + case GatewayEvent::GUILD_CREATE: { + HandleGatewayGuildCreate(m); + } break; + case GatewayEvent::GUILD_DELETE: { + HandleGatewayGuildDelete(m); + } break; } } break; default: @@ -343,23 +370,27 @@ void DiscordClient::HandleGatewayMessage(std::string str) { } } +void DiscordClient::ProcessNewGuild(Guild &guild) { + if (guild.IsUnavailable) { + printf("guild (%lld) unavailable\n", static_cast<uint64_t>(guild.ID)); + return; + } + + m_store.SetGuild(guild.ID, guild); + for (auto &c : guild.Channels) { + c.GuildID = guild.ID; + m_store.SetChannel(c.ID, c); + } + + for (auto &r : guild.Roles) + m_store.SetRole(r.ID, r); +} + void DiscordClient::HandleGatewayReady(const GatewayMessage &msg) { m_ready_received = true; ReadyEventData data = msg.Data; - for (auto &g : data.Guilds) { - if (g.IsUnavailable) - printf("guild (%lld) unavailable\n", (uint64_t)g.ID); - else { - m_store.SetGuild(g.ID, g); - for (auto &c : g.Channels) { - c.GuildID = g.ID; - m_store.SetChannel(c.ID, c); - } - - for (auto &r : g.Roles) - m_store.SetRole(r.ID, r); - } - } + for (auto &g : data.Guilds) + ProcessNewGuild(g); for (const auto &dm : data.PrivateChannels) { m_store.SetChannel(dm.ID, dm); @@ -419,6 +450,34 @@ void DiscordClient::HandleGatewayGuildMemberListUpdate(const GatewayMessage &msg m_signal_guild_member_list_update.emit(data.GuildID); } +void DiscordClient::HandleGatewayGuildCreate(const GatewayMessage &msg) { + Guild data = msg.Data; + ProcessNewGuild(data); + + m_signal_guild_create.emit(data.ID); +} + +void DiscordClient::HandleGatewayGuildDelete(const GatewayMessage &msg) { + Snowflake id = msg.Data.at("id"); + bool unavailable = msg.Data.contains("unavilable") && msg.Data.at("unavailable").get<bool>(); + + if (unavailable) + printf("guild %llu became unavailable\n", static_cast<uint64_t>(id)); + + auto *guild = m_store.GetGuild(id); + if (guild == nullptr) { + m_store.ClearGuild(id); + m_signal_guild_delete.emit(id); + return; + } + + m_store.ClearGuild(id); + for (const auto &c : guild->Channels) + m_store.ClearChannel(c.ID); + + m_signal_guild_delete.emit(id); +} + void DiscordClient::AddMessageToChannel(Snowflake msg_id, Snowflake channel_id) { m_chan_to_message_map[channel_id].insert(msg_id); } @@ -480,6 +539,8 @@ void DiscordClient::LoadEventMap() { m_event_map["MESSAGE_DELETE"] = GatewayEvent::MESSAGE_DELETE; m_event_map["MESSAGE_UPDATE"] = GatewayEvent::MESSAGE_UPDATE; m_event_map["GUILD_MEMBER_LIST_UPDATE"] = GatewayEvent::GUILD_MEMBER_LIST_UPDATE; + m_event_map["GUILD_CREATE"] = GatewayEvent::GUILD_CREATE; + m_event_map["GUILD_DELETE"] = GatewayEvent::GUILD_DELETE; } DiscordClient::type_signal_gateway_ready DiscordClient::signal_gateway_ready() { @@ -505,3 +566,11 @@ DiscordClient::type_signal_message_update DiscordClient::signal_message_update() DiscordClient::type_signal_guild_member_list_update DiscordClient::signal_guild_member_list_update() { return m_signal_guild_member_list_update; } + +DiscordClient::type_signal_guild_create DiscordClient::signal_guild_create() { + return m_signal_guild_create; +} + +DiscordClient::type_signal_guild_delete DiscordClient::signal_guild_delete() { + return m_signal_guild_delete; +} diff --git a/discord/discord.hpp b/discord/discord.hpp index 93f5527..cda3854 100644 --- a/discord/discord.hpp +++ b/discord/discord.hpp @@ -68,6 +68,7 @@ public: std::set<Snowflake> GetMessagesForChannel(Snowflake id) const; std::set<Snowflake> GetPrivateChannels() const; + void FetchInviteData(std::string code, std::function<void(Invite)> cb, std::function<void(bool)> err); void UpdateSettingsGuildPositions(const std::vector<Snowflake> &pos); void FetchMessagesInChannel(Snowflake id, std::function<void(const std::vector<Snowflake> &)> cb); void FetchMessagesInChannelBefore(Snowflake channel_id, Snowflake before_id, std::function<void(const std::vector<Snowflake> &)> cb); @@ -83,6 +84,8 @@ public: void DeleteMessage(Snowflake channel_id, Snowflake id); void EditMessage(Snowflake channel_id, Snowflake id, std::string content); void SendLazyLoad(Snowflake id); + void JoinGuild(std::string code); + void LeaveGuild(Snowflake id); void UpdateToken(std::string token); @@ -91,6 +94,9 @@ private: std::vector<uint8_t> m_compressed_buf; std::vector<uint8_t> m_decompress_buf; z_stream m_zstream; + + void ProcessNewGuild(Guild &guild); + void HandleGatewayMessageRaw(std::string str); void HandleGatewayMessage(std::string str); void HandleGatewayReady(const GatewayMessage &msg); @@ -98,6 +104,8 @@ private: void HandleGatewayMessageDelete(const GatewayMessage &msg); void HandleGatewayMessageUpdate(const GatewayMessage &msg); void HandleGatewayGuildMemberListUpdate(const GatewayMessage &msg); + void HandleGatewayGuildCreate(const GatewayMessage &msg); + void HandleGatewayGuildDelete(const GatewayMessage &msg); void HeartbeatThread(); void SendIdentify(); @@ -137,6 +145,8 @@ public: typedef sigc::signal<void, Snowflake, Snowflake> type_signal_message_delete; typedef sigc::signal<void, Snowflake, Snowflake> type_signal_message_update; typedef sigc::signal<void, Snowflake> type_signal_guild_member_list_update; + typedef sigc::signal<void, Snowflake> type_signal_guild_create; + typedef sigc::signal<void, Snowflake> type_signal_guild_delete; type_signal_gateway_ready signal_gateway_ready(); type_signal_channel_list_refresh signal_channel_list_refresh(); @@ -144,6 +154,8 @@ public: type_signal_message_delete signal_message_delete(); type_signal_message_update signal_message_update(); type_signal_guild_member_list_update signal_guild_member_list_update(); + type_signal_guild_create signal_guild_create(); + type_signal_guild_delete signal_guild_delete(); protected: type_signal_gateway_ready m_signal_gateway_ready; @@ -152,4 +164,6 @@ protected: type_signal_message_delete m_signal_message_delete; type_signal_message_update m_signal_message_update; type_signal_guild_member_list_update m_signal_guild_member_list_update; + type_signal_guild_create m_signal_guild_create; + type_signal_guild_delete m_signal_guild_delete; }; diff --git a/discord/http.cpp b/discord/http.cpp index 1e9b786..b4a0f4b 100644 --- a/discord/http.cpp +++ b/discord/http.cpp @@ -1,5 +1,6 @@ #include "http.hpp" +//#define USE_LOCAL_PROXY HTTPClient::HTTPClient(std::string api_base) : m_api_base(api_base) {} diff --git a/discord/invite.cpp b/discord/invite.cpp new file mode 100644 index 0000000..a08bdef --- /dev/null +++ b/discord/invite.cpp @@ -0,0 +1,14 @@ +#include "invite.hpp" + +void from_json(const nlohmann::json &j, Invite &m) { + JS_D("code", m.Code); + JS_O("channel", m.Channel); + JS_O("inviter", m.Inviter); + JS_O("approximate_member_count", m.Members); + + if (j.contains("guild")) { + auto x = j.at("guild"); + x.at("id").get_to(m.Guild.ID); + x.at("name").get_to(m.Guild.Name); + } +} diff --git a/discord/invite.hpp b/discord/invite.hpp new file mode 100644 index 0000000..486ecad --- /dev/null +++ b/discord/invite.hpp @@ -0,0 +1,15 @@ +#pragma once +#include "json.hpp" +#include "guild.hpp" +#include <string> + +class Invite { +public: + std::string Code; // + Guild Guild; // opt + Channel Channel; // opt + User Inviter; // opt + int Members = -1; // opt + + friend void from_json(const nlohmann::json &j, Invite &m); +}; diff --git a/discord/objects.hpp b/discord/objects.hpp index 4714c85..e2526fe 100644 --- a/discord/objects.hpp +++ b/discord/objects.hpp @@ -11,6 +11,7 @@ #include "guild.hpp" #include "usersettings.hpp" #include "message.hpp" +#include "invite.hpp" // most stuff below should just be objects that get processed and thrown away immediately @@ -29,6 +30,8 @@ enum class GatewayEvent : int { MESSAGE_DELETE, MESSAGE_UPDATE, GUILD_MEMBER_LIST_UPDATE, + GUILD_CREATE, + GUILD_DELETE, }; struct GatewayMessage { diff --git a/discord/store.cpp b/discord/store.cpp index fb0bec1..92ccaa0 100644 --- a/discord/store.cpp +++ b/discord/store.cpp @@ -114,6 +114,14 @@ const GuildMember *Store::GetGuildMemberData(Snowflake guild_id, Snowflake user_ return &mit->second; } +void Store::ClearGuild(Snowflake id) { + m_guilds.erase(id); +} + +void Store::ClearChannel(Snowflake id) { + m_channels.erase(id); +} + const Store::channels_type &Store::GetChannels() const { return m_channels; } diff --git a/discord/store.hpp b/discord/store.hpp index 45b1c41..6477b50 100644 --- a/discord/store.hpp +++ b/discord/store.hpp @@ -29,6 +29,9 @@ public: const Message *GetMessage(Snowflake id) const; const GuildMember *GetGuildMemberData(Snowflake guild_id, Snowflake user_id) const; + void ClearGuild(Snowflake id); + void ClearChannel(Snowflake id); + using users_type = std::unordered_map<Snowflake, User>; using channels_type = std::unordered_map<Snowflake, Channel>; using guilds_type = std::unordered_map<Snowflake, Guild>; |