diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2022-05-06 01:14:15 -0400 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2022-05-06 01:14:15 -0400 |
commit | 2c25319fb85e077f27c3a4cd0bfdc8f503c6020d (patch) | |
tree | e92422ddcb896fb6b5bb75576138100c4f32f43d /src/discord/discord.cpp | |
parent | 7daa0a250c76247c883cf536a3d339016a3852b4 (diff) | |
download | abaddon-portaudio-2c25319fb85e077f27c3a4cd0bfdc8f503c6020d.tar.gz abaddon-portaudio-2c25319fb85e077f27c3a4cd0bfdc8f503c6020d.zip |
clear tabs when access lost, show blanks for missing channels
Diffstat (limited to 'src/discord/discord.cpp')
-rw-r--r-- | src/discord/discord.cpp | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/src/discord/discord.cpp b/src/discord/discord.cpp index dda4b81..c3961b5 100644 --- a/src/discord/discord.cpp +++ b/src/discord/discord.cpp @@ -1622,18 +1622,27 @@ void DiscordClient::HandleGatewayChannelDelete(const GatewayMessage &msg) { it->second.erase(id); m_store.ClearChannel(id); m_signal_channel_delete.emit(id); + m_signal_channel_accessibility_changed.emit(id, false); } void DiscordClient::HandleGatewayChannelUpdate(const GatewayMessage &msg) { const auto id = msg.Data.at("id").get<Snowflake>(); auto cur = m_store.GetChannel(id); if (cur.has_value()) { + const bool old_perms = HasChannelPermission(m_user_data.ID, id, Permission::VIEW_CHANNEL); + cur->update_from_json(msg.Data); m_store.SetChannel(id, *cur); if (cur->PermissionOverwrites.has_value()) for (const auto &p : *cur->PermissionOverwrites) m_store.SetPermissionOverwrite(id, p.ID, p); m_signal_channel_update.emit(id); + + const bool new_perms = HasChannelPermission(m_user_data.ID, id, Permission::VIEW_CHANNEL); + if (old_perms && !new_perms) + m_signal_channel_accessibility_changed.emit(id, false); + else if (!old_perms && new_perms) + m_signal_channel_accessibility_changed.emit(id, true); } } @@ -1660,8 +1669,26 @@ void DiscordClient::HandleGatewayGuildUpdate(const GatewayMessage &msg) { void DiscordClient::HandleGatewayGuildRoleUpdate(const GatewayMessage &msg) { GuildRoleUpdateObject data = msg.Data; + + const auto channels = GetChannelsInGuild(data.GuildID); + std::unordered_set<Snowflake> accessible; + for (auto channel : channels) { + if (HasChannelPermission(m_user_data.ID, channel, Permission::VIEW_CHANNEL)) + accessible.insert(channel); + } + m_store.SetRole(data.GuildID, data.Role); m_signal_role_update.emit(data.GuildID, data.Role.ID); + + for (auto channel : channels) { + const bool old_perms = accessible.find(channel) != accessible.end(); + const bool new_perms = HasChannelPermission(m_user_data.ID, channel, Permission::VIEW_CHANNEL); + if (old_perms && !new_perms) { + m_signal_channel_accessibility_changed.emit(channel, false); + } else if (!old_perms && new_perms) { + m_signal_channel_accessibility_changed.emit(channel, true); + } + } } void DiscordClient::HandleGatewayGuildRoleCreate(const GatewayMessage &msg) { @@ -2152,7 +2179,7 @@ void DiscordClient::HandleGatewayGuildCreate(const GatewayMessage &msg) { void DiscordClient::HandleGatewayGuildDelete(const GatewayMessage &msg) { Snowflake id = msg.Data.at("id"); - bool unavailable = msg.Data.contains("unavilable") && msg.Data.at("unavailable").get<bool>(); + bool unavailable = msg.Data.contains("unavailable") && msg.Data.at("unavailable").get<bool>(); if (unavailable) printf("guild %" PRIu64 " became unavailable\n", static_cast<uint64_t>(id)); @@ -2165,9 +2192,12 @@ void DiscordClient::HandleGatewayGuildDelete(const GatewayMessage &msg) { } m_store.ClearGuild(id); - if (guild->Channels.has_value()) - for (const auto &c : *guild->Channels) + if (guild->Channels.has_value()) { + for (const auto &c : *guild->Channels) { m_store.ClearChannel(c.ID); + m_signal_channel_accessibility_changed.emit(c.ID, false); + } + } m_signal_guild_delete.emit(id); } @@ -2657,6 +2687,10 @@ DiscordClient::type_signal_guild_unmuted DiscordClient::signal_guild_unmuted() { return m_signal_guild_unmuted; } +DiscordClient::type_signal_channel_accessibility_changed DiscordClient::signal_channel_accessibility_changed() { + return m_signal_channel_accessibility_changed; +} + DiscordClient::type_signal_message_send_fail DiscordClient::signal_message_send_fail() { return m_signal_message_send_fail; } |