mirror of
https://github.com/celisej567/abaddon.git
synced 2026-09-13 20:18:50 +03:00
clear tabs when access lost, show blanks for missing channels
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user