handle GUILD_UPDATE
This commit is contained in:
@@ -29,6 +29,7 @@ Abaddon::Abaddon()
|
||||
m_discord.signal_channel_delete().connect(sigc::mem_fun(*this, &Abaddon::DiscordOnChannelDelete));
|
||||
m_discord.signal_channel_update().connect(sigc::mem_fun(*this, &Abaddon::DiscordOnChannelUpdate));
|
||||
m_discord.signal_channel_create().connect(sigc::mem_fun(*this, &Abaddon::DiscordOnChannelCreate));
|
||||
m_discord.signal_guild_update().connect(sigc::mem_fun(*this, &Abaddon::DiscordOnGuildUpdate));
|
||||
}
|
||||
|
||||
Abaddon::~Abaddon() {
|
||||
@@ -175,6 +176,10 @@ void Abaddon::DiscordOnChannelCreate(Snowflake channel_id) {
|
||||
m_main_window->UpdateChannelsCreateChannel(channel_id);
|
||||
}
|
||||
|
||||
void Abaddon::DiscordOnGuildUpdate(Snowflake guild_id) {
|
||||
m_main_window->UpdateChannelsUpdateGuild(guild_id);
|
||||
}
|
||||
|
||||
const SettingsManager &Abaddon::GetSettings() const {
|
||||
return m_settings;
|
||||
}
|
||||
|
@@ -66,6 +66,7 @@ public:
|
||||
void DiscordOnChannelDelete(Snowflake channel_id);
|
||||
void DiscordOnChannelUpdate(Snowflake channel_id);
|
||||
void DiscordOnChannelCreate(Snowflake channel_id);
|
||||
void DiscordOnGuildUpdate(Snowflake guild_id);
|
||||
|
||||
const SettingsManager &GetSettings() const;
|
||||
|
||||
|
@@ -385,6 +385,30 @@ void ChannelList::UpdateCreateChannel(Snowflake id) {
|
||||
m_list->insert(*row, pos);
|
||||
}
|
||||
|
||||
void ChannelList::UpdateGuild(Snowflake id) {
|
||||
// the only thing changed is the row containing the guild item so just recreate it
|
||||
const auto *data = Abaddon::Get().GetDiscordClient().GetGuild(id);
|
||||
if (data == nullptr) return;
|
||||
auto it = m_guild_id_to_row.find(id);
|
||||
if (it == m_guild_id_to_row.end()) return;
|
||||
auto *row = dynamic_cast<ChannelListRowGuild *>(it->second);
|
||||
const auto children = row->Children;
|
||||
const auto index = row->get_index();
|
||||
const bool old_collapsed = row->IsUserCollapsed;
|
||||
const bool old_gindex = row->GuildIndex;
|
||||
delete row;
|
||||
auto *new_row = Gtk::manage(new ChannelListRowGuild(data));
|
||||
new_row->IsUserCollapsed = old_collapsed;
|
||||
new_row->GuildIndex = old_gindex;
|
||||
m_guild_id_to_row[new_row->ID] = new_row;
|
||||
AttachGuildMenuHandler(new_row);
|
||||
new_row->Children = children;
|
||||
for (auto child : children)
|
||||
child->Parent = new_row;
|
||||
new_row->show_all();
|
||||
m_list->insert(*new_row, index);
|
||||
}
|
||||
|
||||
void ChannelList::Clear() {
|
||||
//std::scoped_lock<std::mutex> guard(m_update_mutex);
|
||||
m_update_dispatcher.emit();
|
||||
|
@@ -91,6 +91,7 @@ public:
|
||||
void UpdateRemoveChannel(Snowflake id);
|
||||
void UpdateChannel(Snowflake id);
|
||||
void UpdateCreateChannel(Snowflake id);
|
||||
void UpdateGuild(Snowflake id);
|
||||
void Clear();
|
||||
|
||||
protected:
|
||||
|
@@ -522,6 +522,9 @@ void DiscordClient::HandleGatewayMessage(std::string str) {
|
||||
case GatewayEvent::CHANNEL_CREATE: {
|
||||
HandleGatewayChannelCreate(m);
|
||||
} break;
|
||||
case GatewayEvent::GUILD_UPDATE: {
|
||||
HandleGatewayGuildUpdate(m);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
default:
|
||||
@@ -639,6 +642,14 @@ void DiscordClient::HandleGatewayChannelCreate(const GatewayMessage &msg) {
|
||||
m_signal_channel_create.emit(data.ID);
|
||||
}
|
||||
|
||||
void DiscordClient::HandleGatewayGuildUpdate(const GatewayMessage &msg) {
|
||||
Snowflake id = msg.Data.at("id");
|
||||
auto *current = m_store.GetGuild(id);
|
||||
if (current == nullptr) return;
|
||||
current->update_from_json(msg.Data);
|
||||
m_signal_guild_update.emit(id);
|
||||
}
|
||||
|
||||
void DiscordClient::HandleGatewayMessageUpdate(const GatewayMessage &msg) {
|
||||
Snowflake id = msg.Data.at("id");
|
||||
|
||||
@@ -771,6 +782,7 @@ void DiscordClient::LoadEventMap() {
|
||||
m_event_map["CHANNEL_DELETE"] = GatewayEvent::CHANNEL_DELETE;
|
||||
m_event_map["CHANNEL_UPDATE"] = GatewayEvent::CHANNEL_UPDATE;
|
||||
m_event_map["CHANNEL_CREATE"] = GatewayEvent::CHANNEL_CREATE;
|
||||
m_event_map["GUILD_UPDATE"] = GatewayEvent::GUILD_UPDATE;
|
||||
}
|
||||
|
||||
DiscordClient::type_signal_gateway_ready DiscordClient::signal_gateway_ready() {
|
||||
@@ -816,3 +828,7 @@ DiscordClient::type_signal_channel_update DiscordClient::signal_channel_update()
|
||||
DiscordClient::type_signal_channel_create DiscordClient::signal_channel_create() {
|
||||
return m_signal_channel_create;
|
||||
}
|
||||
|
||||
DiscordClient::type_signal_guild_update DiscordClient::signal_guild_update() {
|
||||
return m_signal_guild_update;
|
||||
}
|
||||
|
@@ -129,6 +129,7 @@ private:
|
||||
void HandleGatewayChannelDelete(const GatewayMessage &msg);
|
||||
void HandleGatewayChannelUpdate(const GatewayMessage &msg);
|
||||
void HandleGatewayChannelCreate(const GatewayMessage &msg);
|
||||
void HandleGatewayGuildUpdate(const GatewayMessage &msg);
|
||||
void HeartbeatThread();
|
||||
void SendIdentify();
|
||||
|
||||
@@ -180,6 +181,7 @@ public:
|
||||
typedef sigc::signal<void, Snowflake> type_signal_channel_delete;
|
||||
typedef sigc::signal<void, Snowflake> type_signal_channel_update;
|
||||
typedef sigc::signal<void, Snowflake> type_signal_channel_create;
|
||||
typedef sigc::signal<void, Snowflake> type_signal_guild_update;
|
||||
|
||||
type_signal_gateway_ready signal_gateway_ready();
|
||||
type_signal_channel_list_refresh signal_channel_list_refresh();
|
||||
@@ -192,6 +194,7 @@ public:
|
||||
type_signal_channel_delete signal_channel_delete();
|
||||
type_signal_channel_update signal_channel_update();
|
||||
type_signal_channel_create signal_channel_create();
|
||||
type_signal_guild_update signal_guild_update();
|
||||
|
||||
protected:
|
||||
type_signal_gateway_ready m_signal_gateway_ready;
|
||||
@@ -205,4 +208,5 @@ protected:
|
||||
type_signal_channel_delete m_signal_channel_delete;
|
||||
type_signal_channel_update m_signal_channel_update;
|
||||
type_signal_channel_create m_signal_channel_create;
|
||||
type_signal_guild_update m_signal_guild_update;
|
||||
};
|
||||
|
@@ -58,6 +58,62 @@ void from_json(const nlohmann::json &j, Guild &m) {
|
||||
JS_O("approximate_presence_count", m.ApproximatePresenceCount);
|
||||
}
|
||||
|
||||
void Guild::update_from_json(const nlohmann::json &j) {
|
||||
if (j.contains("unavailable")) {
|
||||
IsUnavailable = true;
|
||||
return;
|
||||
}
|
||||
|
||||
JS_RD("name", Name);
|
||||
JS_RD("icon", Icon);
|
||||
JS_RD("splash", Splash);
|
||||
JS_RD("discovery_splash", DiscoverySplash);
|
||||
JS_RD("owner", IsOwner);
|
||||
JS_RD("owner_id", OwnerID);
|
||||
std::string tmp;
|
||||
JS_RD("permissions", tmp);
|
||||
if (tmp != "")
|
||||
Permissions = std::stoull(tmp);
|
||||
JS_RD("region", VoiceRegion);
|
||||
JS_RD("afk_channel_id", AFKChannelID);
|
||||
JS_RD("afk_timeout", AFKTimeout);
|
||||
JS_RD("embed_enabled", IsEmbedEnabled);
|
||||
JS_RD("embed_channel_id", EmbedChannelID);
|
||||
JS_RD("verification_level", VerificationLevel);
|
||||
JS_RD("default_message_notifications", DefaultMessageNotifications);
|
||||
JS_RD("explicit_content_filter", ExplicitContentFilter);
|
||||
JS_RD("roles", Roles);
|
||||
JS_RD("emojis", Emojis);
|
||||
JS_RD("features", Features);
|
||||
JS_RD("mfa_level", MFALevel);
|
||||
JS_RD("application_id", ApplicationID);
|
||||
JS_RD("widget_enabled", IsWidgetEnabled);
|
||||
JS_RD("widget_channel_id", WidgetChannelID);
|
||||
JS_RD("system_channel_id", SystemChannelID);
|
||||
JS_RD("system_channel_flags", SystemChannelFlags);
|
||||
JS_RD("rules_channel_id", RulesChannelID);
|
||||
JS_RD("joined_at", JoinedAt);
|
||||
JS_RD("large", IsLarge);
|
||||
JS_RD("unavailable", IsUnavailable);
|
||||
JS_RD("member_count", MemberCount);
|
||||
// JS_O("voice_states", m.VoiceStates);
|
||||
// JS_O("members", m.Members);
|
||||
JS_RD("channels", Channels);
|
||||
// JS_O("presences", m.Presences);
|
||||
JS_RD("max_presences", MaxPresences);
|
||||
JS_RD("max_members", MaxMembers);
|
||||
JS_RD("vanity_url_code", VanityURL);
|
||||
JS_RD("description", Description);
|
||||
JS_RD("banner", BannerHash);
|
||||
JS_RD("premium_tier", PremiumTier);
|
||||
JS_RD("premium_subscription_count", PremiumSubscriptionCount);
|
||||
JS_RD("preferred_locale", PreferredLocale);
|
||||
JS_RD("public_updates_channel_id", PublicUpdatesChannelID);
|
||||
JS_RD("max_video_channel_users", MaxVideoChannelUsers);
|
||||
JS_RD("approximate_member_count", ApproximateMemberCount);
|
||||
JS_RD("approximate_presence_count", ApproximatePresenceCount);
|
||||
}
|
||||
|
||||
bool Guild::HasIcon() const {
|
||||
return Icon != "";
|
||||
}
|
||||
|
@@ -65,6 +65,7 @@ struct Guild {
|
||||
// * - documentation says only sent in GUILD_CREATE, but these can be sent anyways in the READY event
|
||||
|
||||
friend void from_json(const nlohmann::json &j, Guild &m);
|
||||
void update_from_json(const nlohmann::json &j);
|
||||
|
||||
bool HasIcon() const;
|
||||
std::string GetIconURL(std::string ext = "png", std::string size = "32") const;
|
||||
|
@@ -40,6 +40,7 @@ enum class GatewayEvent : int {
|
||||
CHANNEL_DELETE,
|
||||
CHANNEL_UPDATE,
|
||||
CHANNEL_CREATE,
|
||||
GUILD_UPDATE,
|
||||
};
|
||||
|
||||
struct GatewayMessage {
|
||||
@@ -196,10 +197,10 @@ struct MessageEditObject {
|
||||
};
|
||||
|
||||
struct GuildMemberUpdateMessage {
|
||||
Snowflake GuildID; //
|
||||
Snowflake GuildID; //
|
||||
std::vector<Snowflake> Roles; //
|
||||
User User; //
|
||||
std::string Nick; // opt, null
|
||||
User User; //
|
||||
std::string Nick; // opt, null
|
||||
std::string JoinedAt;
|
||||
std::string PremiumSince; // opt, null
|
||||
|
||||
@@ -208,15 +209,15 @@ struct GuildMemberUpdateMessage {
|
||||
|
||||
struct ClientStatus {
|
||||
std::string Desktop; // opt
|
||||
std::string Mobile; // opt
|
||||
std::string Web; // opt
|
||||
std::string Mobile; // opt
|
||||
std::string Web; // opt
|
||||
|
||||
friend void from_json(const nlohmann::json &j, ClientStatus &m);
|
||||
};
|
||||
|
||||
struct PresenceUpdateMessage {
|
||||
nlohmann::json User; // the client updates an existing object from this data
|
||||
Snowflake GuildID; // opt
|
||||
Snowflake GuildID; // opt
|
||||
std::string Status;
|
||||
// std::vector<Activity> Activities;
|
||||
ClientStatus ClientStatus;
|
||||
|
@@ -136,6 +136,10 @@ void MainWindow::UpdateChannelsCreateChannel(Snowflake id) {
|
||||
m_channel_list.UpdateCreateChannel(id);
|
||||
}
|
||||
|
||||
void MainWindow::UpdateChannelsUpdateGuild(Snowflake id) {
|
||||
m_channel_list.UpdateGuild(id);
|
||||
}
|
||||
|
||||
void MainWindow::UpdateChatWindowContents() {
|
||||
auto &discord = Abaddon::Get().GetDiscordClient();
|
||||
auto allmsgs = discord.GetMessagesForChannel(m_chat.GetActiveChannel());
|
||||
|
@@ -16,6 +16,7 @@ public:
|
||||
void UpdateChannelsRemoveChannel(Snowflake id);
|
||||
void UpdateChannelsUpdateChannel(Snowflake id);
|
||||
void UpdateChannelsCreateChannel(Snowflake id);
|
||||
void UpdateChannelsUpdateGuild(Snowflake id);
|
||||
void UpdateChatWindowContents();
|
||||
void UpdateChatActiveChannel(Snowflake id);
|
||||
Snowflake GetChatActiveChannel() const;
|
||||
|
Reference in New Issue
Block a user