diff --git a/src/components/chatmessage.cpp b/src/components/chatmessage.cpp index e5a65cd..d34730b 100644 --- a/src/components/chatmessage.cpp +++ b/src/components/chatmessage.cpp @@ -1,7 +1,7 @@ -#include "chatmessage.hpp" #include "abaddon.hpp" -#include "util.hpp" +#include "chatmessage.hpp" #include "lazyimage.hpp" +#include "util.hpp" #include constexpr static int EmojiSize = 24; // settings eventually @@ -1068,11 +1068,11 @@ ChatMessageHeader::ChatMessageHeader(const Message &data) }; img.LoadFromURL(author->GetAvatarURL(data.GuildID), sigc::track_obj(cb, *this)); - if (author->HasAnimatedAvatar()) { + if (author->HasAnimatedAvatar(data.GuildID)) { auto cb = [this](const Glib::RefPtr &pb) { m_anim_avatar = pb; }; - img.LoadAnimationFromURL(author->GetAvatarURL("gif"), AvatarSize, AvatarSize, sigc::track_obj(cb, *this)); + img.LoadAnimationFromURL(author->GetAvatarURL(data.GuildID, "gif"), AvatarSize, AvatarSize, sigc::track_obj(cb, *this)); } get_style_context()->add_class("message-container"); diff --git a/src/discord/user.cpp b/src/discord/user.cpp index fae212d..6df53aa 100644 --- a/src/discord/user.cpp +++ b/src/discord/user.cpp @@ -6,22 +6,41 @@ bool UserData::IsDeleted() const { } bool UserData::HasAvatar() const { - return Avatar.size() > 0; + return !Avatar.empty(); } -bool UserData::HasAnimatedAvatar() const { - return Avatar.size() > 0 && Avatar[0] == 'a' && Avatar[1] == '_'; +bool UserData::HasAnimatedAvatar() const noexcept { + return !Avatar.empty() && Avatar[0] == 'a' && Avatar[1] == '_'; +} + +bool UserData::HasAnimatedAvatar(Snowflake guild_id) const { + const auto member = Abaddon::Get().GetDiscordClient().GetMember(ID, guild_id); + if (member.has_value() && member->Avatar.has_value() && member->Avatar.value()[0] == 'a' && member->Avatar.value()[1] == '_') + return true; + else if (!member->Avatar.has_value()) + return HasAnimatedAvatar(); + return false; +} + +bool UserData::HasAnimatedAvatar(const std::optional &guild_id) const { + if (guild_id.has_value()) + return HasAnimatedAvatar(*guild_id); + else + return HasAnimatedAvatar(); } std::string UserData::GetAvatarURL(Snowflake guild_id, std::string ext, std::string size) const { const auto member = Abaddon::Get().GetDiscordClient().GetMember(ID, guild_id); - if (member.has_value() && member->Avatar.has_value()) + if (member.has_value() && member->Avatar.has_value()) { + if (ext == "gif" && !(member->Avatar.value()[0] == 'a' && member->Avatar.value()[1] == '_')) + return GetAvatarURL(ext, size); return "https://cdn.discordapp.com/guilds/" + std::to_string(guild_id) + "/users/" + std::to_string(ID) + "/avatars/" + *member->Avatar + "." + ext + "?" + "size=" + size; - else + } else { return GetAvatarURL(ext, size); + } } std::string UserData::GetAvatarURL(const std::optional &guild_id, std::string ext, std::string size) const { diff --git a/src/discord/user.hpp b/src/discord/user.hpp index d4711fa..c058ea1 100644 --- a/src/discord/user.hpp +++ b/src/discord/user.hpp @@ -62,7 +62,9 @@ struct UserData { bool IsDeleted() const; bool HasAvatar() const; - bool HasAnimatedAvatar() const; + bool HasAnimatedAvatar() const noexcept; + bool HasAnimatedAvatar(Snowflake guild_id) const; + bool HasAnimatedAvatar(const std::optional &guild_id) const; std::string GetAvatarURL(Snowflake guild_id, std::string ext = "png", std::string size = "32") const; std::string GetAvatarURL(const std::optional &guild_id, std::string ext = "png", std::string size = "32") const; std::string GetAvatarURL(std::string ext = "png", std::string size = "32") const;