diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2023-08-28 21:47:04 -0400 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2023-08-28 21:47:04 -0400 |
commit | 36f2ec0996d937400e2fce028c3da729ad951f31 (patch) | |
tree | 5d0450c3bdae803ee9441c2bc8cea8131953ef7e /src/components | |
parent | 97240237585db9abac22eb214f1865694706af1e (diff) | |
download | abaddon-portaudio-36f2ec0996d937400e2fce028c3da729ad951f31.tar.gz abaddon-portaudio-36f2ec0996d937400e2fce028c3da729ad951f31.zip |
fix webhook messages not using right username + avatar (fixes #209)
Diffstat (limited to 'src/components')
-rw-r--r-- | src/components/chatlist.cpp | 16 | ||||
-rw-r--r-- | src/components/chatmessage.cpp | 40 |
2 files changed, 46 insertions, 10 deletions
diff --git a/src/components/chatlist.cpp b/src/components/chatlist.cpp index ba18c0a..4dde8a3 100644 --- a/src/components/chatlist.cpp +++ b/src/components/chatlist.cpp @@ -67,8 +67,22 @@ void ChatList::ProcessNewMessage(const Message &data, bool prepend) { if (last_row != nullptr) { const uint64_t diff = std::max(data.ID, last_row->NewestID) - std::min(data.ID, last_row->NewestID); - if (last_row->UserID == data.Author.ID && (prepend || (diff < SnowflakeSplitDifference * Snowflake::SecondsInterval))) + if (last_row->UserID == data.Author.ID && (prepend || (diff < SnowflakeSplitDifference * Snowflake::SecondsInterval))) { should_attach = true; + } + // Separate webhooks if the usernames or avatar URLs are different + if (data.IsWebhook() && last_row->UserID == data.Author.ID) { + const auto last_message = discord.GetMessage(last_row->NewestID); + if (last_message.has_value() && last_message->IsWebhook()) { + const auto last_webhook_data = last_message->GetWebhookData(); + const auto next_webhook_data = data.GetWebhookData(); + if (last_webhook_data.has_value() && next_webhook_data.has_value()) { + if (last_webhook_data->Username != next_webhook_data->Username || last_webhook_data->Avatar != next_webhook_data->Avatar) { + should_attach = false; + } + } + } + } } } diff --git a/src/components/chatmessage.cpp b/src/components/chatmessage.cpp index d1d9f72..09083e3 100644 --- a/src/components/chatmessage.cpp +++ b/src/components/chatmessage.cpp @@ -918,11 +918,22 @@ ChatMessageHeader::ChatMessageHeader(const Message &data) const auto author = Abaddon::Get().GetDiscordClient().GetUser(UserID); auto &img = Abaddon::Get().GetImageManager(); + std::string avatar_url; + if (data.IsWebhook()) { + const auto webhook_data = Abaddon::Get().GetDiscordClient().GetWebhookMessageData(data.ID); + if (webhook_data.has_value()) { + avatar_url = webhook_data->GetAvatarURL(); + } + } + if (avatar_url.empty()) { + avatar_url = author->GetAvatarURL(data.GuildID); + } + auto cb = [this](const Glib::RefPtr<Gdk::Pixbuf> &pb) { m_static_avatar = pb->scale_simple(AvatarSize, AvatarSize, Gdk::INTERP_BILINEAR); m_avatar.property_pixbuf() = m_static_avatar; }; - img.LoadFromURL(author->GetAvatarURL(data.GuildID), sigc::track_obj(cb, *this)); + img.LoadFromURL(avatar_url, sigc::track_obj(cb, *this)); if (author->HasAnimatedAvatar(data.GuildID)) { auto cb = [this](const Glib::RefPtr<Gdk::PixbufAnimation> &pb) { @@ -955,10 +966,11 @@ ChatMessageHeader::ChatMessageHeader(const Message &data) m_extra->set_can_focus(false); m_extra->set_use_markup(true); } - if (author->IsABot()) - m_extra->set_markup("<b>BOT</b>"); - else if (data.WebhookID.has_value()) + if (data.IsWebhook()) { m_extra->set_markup("<b>Webhook</b>"); + } else if (author->IsABot()) { + m_extra->set_markup("<b>BOT</b>"); + } m_timestamp.set_text(data.ID.GetLocalTimestamp()); m_timestamp.set_hexpand(true); @@ -1018,11 +1030,21 @@ ChatMessageHeader::ChatMessageHeader(const Message &data) show_all(); auto &discord = Abaddon::Get().GetDiscordClient(); - auto role_update_cb = [this](...) { UpdateName(); }; - discord.signal_role_update().connect(sigc::track_obj(role_update_cb, *this)); - auto guild_member_update_cb = [this](const auto &, const auto &) { UpdateName(); }; - discord.signal_guild_member_update().connect(sigc::track_obj(guild_member_update_cb, *this)); - UpdateName(); + if (data.IsWebhook()) { + const auto webhook_data = discord.GetWebhookMessageData(data.ID); + if (webhook_data.has_value()) { + const auto name = Glib::Markup::escape_text(webhook_data->Username); + m_author.set_markup("<span weight='bold'>" + name + "</span>"); + } else { + UpdateName(); + } + } else { + auto role_update_cb = [this](...) { UpdateName(); }; + discord.signal_role_update().connect(sigc::track_obj(role_update_cb, *this)); + auto guild_member_update_cb = [this](const auto &, const auto &) { UpdateName(); }; + discord.signal_guild_member_update().connect(sigc::track_obj(guild_member_update_cb, *this)); + UpdateName(); + } AttachUserMenuHandler(m_meta_ev); AttachUserMenuHandler(m_avatar_ev); } |