diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2020-10-19 20:35:10 -0400 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2020-10-19 20:35:10 -0400 |
commit | cb73bba135933357878dc47f6e7a6bec3168d001 (patch) | |
tree | 0bcced1046c53b6322a6d680db4aca7edbc9371f /discord/discord.cpp | |
parent | 49a6e581375fdf0b5f5e82f981ca2d7cb419267f (diff) | |
download | abaddon-portaudio-cb73bba135933357878dc47f6e7a6bec3168d001.tar.gz abaddon-portaudio-cb73bba135933357878dc47f6e7a6bec3168d001.zip |
CHANNEL_CREATE, CHANNEL_UPDATE, CHANNEL_DELETE
Diffstat (limited to 'discord/discord.cpp')
-rw-r--r-- | discord/discord.cpp | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/discord/discord.cpp b/discord/discord.cpp index c296aee..9f07259 100644 --- a/discord/discord.cpp +++ b/discord/discord.cpp @@ -246,6 +246,13 @@ std::unordered_set<Snowflake> DiscordClient::GetRolesInGuild(Snowflake id) const return ret; } +std::unordered_set<Snowflake> DiscordClient::GetChannelsInGuild(Snowflake id) const { + auto it = m_guild_to_channels.find(id); + if (it != m_guild_to_channels.end()) + return it->second; + return std::unordered_set<Snowflake>(); +} + bool DiscordClient::HasGuildPermission(Snowflake user_id, Snowflake guild_id, Permission perm) const { const auto base = ComputePermissions(user_id, guild_id); return (base & perm) == perm; @@ -506,6 +513,15 @@ void DiscordClient::HandleGatewayMessage(std::string str) { case GatewayEvent::PRESENCE_UPDATE: { HandleGatewayPresenceUpdate(m); } break; + case GatewayEvent::CHANNEL_DELETE: { + HandleGatewayChannelDelete(m); + } break; + case GatewayEvent::CHANNEL_UPDATE: { + HandleGatewayChannelUpdate(m); + } break; + case GatewayEvent::CHANNEL_CREATE: { + HandleGatewayChannelCreate(m); + } break; } } break; default: @@ -527,6 +543,7 @@ void DiscordClient::ProcessNewGuild(Guild &guild) { for (auto &c : guild.Channels) { c.GuildID = guild.ID; m_store.SetChannel(c.ID, c); + m_guild_to_channels[guild.ID].insert(c.ID); for (auto &p : c.PermissionOverwrites) { m_store.SetPermissionOverwrite(c.ID, p.ID, p); } @@ -594,6 +611,34 @@ void DiscordClient::HandleGatewayPresenceUpdate(const GatewayMessage &msg) { User::update_from_json(data.User, *cur); } +void DiscordClient::HandleGatewayChannelDelete(const GatewayMessage &msg) { + const auto id = msg.Data.at("id").get<Snowflake>(); + const auto *channel = GetChannel(id); + auto it = m_guild_to_channels.find(channel->GuildID); + if (it != m_guild_to_channels.end()) + it->second.erase(id); + m_store.ClearChannel(id); + m_signal_channel_delete.emit(id); +} + +void DiscordClient::HandleGatewayChannelUpdate(const GatewayMessage &msg) { + const auto id = msg.Data.at("id").get<Snowflake>(); + auto *cur = m_store.GetChannel(id); + if (cur != nullptr) { + cur->update_from_json(msg.Data); + m_signal_channel_update.emit(id); + } +} + +void DiscordClient::HandleGatewayChannelCreate(const GatewayMessage &msg) { + Channel data = msg.Data; + m_store.SetChannel(data.ID, data); + m_guild_to_channels[data.GuildID].insert(data.ID); + for (const auto &p : data.PermissionOverwrites) + m_store.SetPermissionOverwrite(data.ID, p.ID, p); + m_signal_channel_create.emit(data.ID); +} + void DiscordClient::HandleGatewayMessageUpdate(const GatewayMessage &msg) { Snowflake id = msg.Data.at("id"); @@ -723,6 +768,9 @@ void DiscordClient::LoadEventMap() { m_event_map["MESSAGE_DELETE_BULK"] = GatewayEvent::MESSAGE_DELETE_BULK; m_event_map["GUILD_MEMBER_UPDATE"] = GatewayEvent::GUILD_MEMBER_UPDATE; m_event_map["PRESENCE_UPDATE"] = GatewayEvent::PRESENCE_UPDATE; + m_event_map["CHANNEL_DELETE"] = GatewayEvent::CHANNEL_DELETE; + m_event_map["CHANNEL_UPDATE"] = GatewayEvent::CHANNEL_UPDATE; + m_event_map["CHANNEL_CREATE"] = GatewayEvent::CHANNEL_CREATE; } DiscordClient::type_signal_gateway_ready DiscordClient::signal_gateway_ready() { @@ -756,3 +804,15 @@ DiscordClient::type_signal_guild_create DiscordClient::signal_guild_create() { DiscordClient::type_signal_guild_delete DiscordClient::signal_guild_delete() { return m_signal_guild_delete; } + +DiscordClient::type_signal_channel_delete DiscordClient::signal_channel_delete() { + return m_signal_channel_delete; +} + +DiscordClient::type_signal_channel_update DiscordClient::signal_channel_update() { + return m_signal_channel_update; +} + +DiscordClient::type_signal_channel_create DiscordClient::signal_channel_create() { + return m_signal_channel_create; +} |