some better member/role update handling

This commit is contained in:
ouwou
2021-01-18 01:34:47 -05:00
parent 4fd7f9d75e
commit 42252aa6aa
5 changed files with 25 additions and 11 deletions

View File

@@ -1071,6 +1071,11 @@ ChatMessageHeader::ChatMessageHeader(const Message *data) {
show_all();
auto &discord = Abaddon::Get().GetDiscordClient();
auto role_update_cb = [this](const auto &) { UpdateNameColor(); };
discord.signal_role_update().connect(sigc::track_obj(role_update_cb, *this));
auto guild_member_update_cb = [this](const auto &, const auto &) { UpdateNameColor(); };
discord.signal_guild_member_update().connect(sigc::track_obj(guild_member_update_cb, *this));
UpdateNameColor();
AttachUserMenuHandler(*m_meta_ev);
AttachUserMenuHandler(*m_avatar_ev);

View File

@@ -735,8 +735,12 @@ void DiscordClient::HandleGatewayMessageDeleteBulk(const GatewayMessage &msg) {
void DiscordClient::HandleGatewayGuildMemberUpdate(const GatewayMessage &msg) {
GuildMemberUpdateMessage data = msg.Data;
auto member = GuildMember::from_update_json(msg.Data); // meh
m_store.SetGuildMember(data.GuildID, data.User.ID, member);
auto cur = m_store.GetGuildMember(data.GuildID, data.User.ID);
if (cur.has_value()) {
cur->update_from_json(msg.Data);
m_store.SetGuildMember(data.GuildID, data.User.ID, *cur);
}
m_signal_guild_member_update.emit(data.GuildID, data.User.ID);
}
void DiscordClient::HandleGatewayPresenceUpdate(const GatewayMessage &msg) {
@@ -1224,3 +1228,7 @@ DiscordClient::type_signal_reaction_remove DiscordClient::signal_reaction_remove
DiscordClient::type_signal_typing_start DiscordClient::signal_typing_start() {
return m_signal_typing_start;
}
DiscordClient::type_signal_guild_member_update DiscordClient::signal_guild_member_update() {
return m_signal_guild_member_update;
}

View File

@@ -218,6 +218,7 @@ public:
typedef sigc::signal<void, Snowflake, Glib::ustring> type_signal_reaction_add;
typedef sigc::signal<void, Snowflake, Glib::ustring> type_signal_reaction_remove;
typedef sigc::signal<void, Snowflake, Snowflake> type_signal_typing_start; // user id, channel id
typedef sigc::signal<void, Snowflake, Snowflake> type_signal_guild_member_update; // guild id, user id
typedef sigc::signal<void, bool> type_signal_disconnected; // bool true if reconnecting
typedef sigc::signal<void> type_signal_connected;
@@ -238,6 +239,7 @@ public:
type_signal_reaction_add signal_reaction_add();
type_signal_reaction_remove signal_reaction_remove();
type_signal_typing_start signal_typing_start();
type_signal_guild_member_update signal_guild_member_update();
type_signal_disconnected signal_disconnected();
type_signal_connected signal_connected();
@@ -259,6 +261,7 @@ protected:
type_signal_reaction_add m_signal_reaction_add;
type_signal_reaction_remove m_signal_reaction_remove;
type_signal_typing_start m_signal_typing_start;
type_signal_guild_member_update m_signal_guild_member_update;
type_signal_disconnected m_signal_disconnected;
type_signal_connected m_signal_connected;
};

View File

@@ -26,12 +26,10 @@ std::vector<RoleData> GuildMember::GetSortedRoles() const {
return roles;
}
GuildMember GuildMember::from_update_json(const nlohmann::json &j) {
GuildMember ret;
JS_D("roles", ret.Roles);
JS_D("user", ret.User);
JS_ON("nick", ret.Nickname);
JS_D("joined_at", ret.JoinedAt);
JS_ON("premium_since", ret.PremiumSince);
return ret;
void GuildMember::update_from_json(const nlohmann::json &j) {
JS_RD("roles", Roles);
JS_RD("user", User);
JS_RD("nick", Nickname);
JS_RD("joined_at", JoinedAt);
JS_RD("premium_since", PremiumSince);
}

View File

@@ -17,6 +17,6 @@ struct GuildMember {
std::vector<RoleData> GetSortedRoles() const;
void update_from_json(const nlohmann::json &j);
friend void from_json(const nlohmann::json &j, GuildMember &m);
static GuildMember from_update_json(const nlohmann::json &j);
};