diff --git a/CHANGELOG.md b/CHANGELOG.md
index 98fa2632c..a811097e2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -54,6 +54,7 @@
- Bugfix: Fixed event emotes not showing up in autocomplete and popups. (#5239, #5580, #5582, #5632)
- Bugfix: Fixed tab visibility being controllable in the emote popup. (#5530)
- Bugfix: Fixed account switch not being saved if no other settings were changed. (#5558)
+- Bugfix: Fixed 7TV badges being inadvertently animated. (#5674)
- Bugfix: Fixed some tooltips not being readable. (#5578)
- Bugfix: Fixed log files being locked longer than needed. (#5592)
- Bugfix: Fixed global badges not showing in anonymous mode. (#5599)
@@ -61,6 +62,7 @@
- Bugfix: Fixed incorrect message being disabled in some cases upon approving or denying an automod caught message. (#5611)
- Bugfix: Fixed double-click selection not working when clicking outside a message. (#5617)
- Bugfix: Fixed emotes starting with ":" not tab-completing. (#5603)
+- Bugfix: Fixed 7TV emotes messing with Qt's HTML. (#5677)
- Dev: Update Windows build from Qt 6.5.0 to Qt 6.7.1. (#5420)
- Dev: Update vcpkg build Qt from 6.5.0 to 6.7.0, boost from 1.83.0 to 1.85.0, openssl from 3.1.3 to 3.3.0. (#5422)
- Dev: Unsingletonize `ISoundController`. (#5462)
diff --git a/src/providers/seventv/SeventvBadges.cpp b/src/providers/seventv/SeventvBadges.cpp
index 2f09bd087..e217fa914 100644
--- a/src/providers/seventv/SeventvBadges.cpp
+++ b/src/providers/seventv/SeventvBadges.cpp
@@ -59,7 +59,7 @@ void SeventvBadges::registerBadge(const QJsonObject &badgeJson)
auto emote = Emote{
.name = EmoteName{},
- .images = SeventvEmotes::createImageSet(badgeJson),
+ .images = SeventvEmotes::createImageSet(badgeJson, true),
.tooltip = Tooltip{badgeJson["tooltip"].toString()},
.homePage = Url{},
.id = EmoteId{badgeID},
diff --git a/src/providers/seventv/SeventvEmotes.cpp b/src/providers/seventv/SeventvEmotes.cpp
index 969b0e5f5..b19a61304 100644
--- a/src/providers/seventv/SeventvEmotes.cpp
+++ b/src/providers/seventv/SeventvEmotes.cpp
@@ -79,7 +79,8 @@ bool isZeroWidthRecommended(const QJsonObject &emoteData)
Tooltip createTooltip(const QString &name, const QString &author, bool isGlobal)
{
return Tooltip{QString("%1
%2 7TV Emote
By: %3")
- .arg(name, isGlobal ? "Global" : "Channel",
+ .arg(name.toHtmlEscaped(),
+ isGlobal ? "Global" : "Channel",
author.isEmpty() ? "" : author)};
}
@@ -87,7 +88,8 @@ Tooltip createAliasedTooltip(const QString &name, const QString &baseName,
const QString &author, bool isGlobal)
{
return Tooltip{QString("%1
Alias of %2
%3 7TV Emote
By: %4")
- .arg(name, baseName, isGlobal ? "Global" : "Channel",
+ .arg(name.toHtmlEscaped(), baseName.toHtmlEscaped(),
+ isGlobal ? "Global" : "Channel",
author.isEmpty() ? "" : author)};
}
@@ -106,12 +108,18 @@ CreateEmoteResult createEmote(const QJsonObject &activeEmote,
? createAliasedTooltip(emoteName.string, baseEmoteName.string,
author.string, isGlobal)
: createTooltip(emoteName.string, author.string, isGlobal);
- auto imageSet = SeventvEmotes::createImageSet(emoteData);
+ auto imageSet = SeventvEmotes::createImageSet(emoteData, false);
- auto emote =
- Emote({emoteName, imageSet, tooltip,
- Url{EMOTE_LINK_FORMAT.arg(emoteId.string)}, zeroWidth, emoteId,
- author, makeConditionedOptional(aliasedName, baseEmoteName)});
+ auto emote = Emote({
+ emoteName,
+ imageSet,
+ tooltip,
+ Url{EMOTE_LINK_FORMAT.arg(emoteId.string)},
+ zeroWidth,
+ emoteId,
+ author,
+ makeConditionedOptional(aliasedName, baseEmoteName),
+ });
return {emote, emoteId, emoteName, !emote.images.getImage1()->isEmpty()};
}
@@ -427,7 +435,8 @@ void SeventvEmotes::getEmoteSet(
});
}
-ImageSet SeventvEmotes::createImageSet(const QJsonObject &emoteData)
+ImageSet SeventvEmotes::createImageSet(const QJsonObject &emoteData,
+ bool useStatic)
{
auto host = emoteData["host"].toObject();
// "//cdn.7tv[...]"
@@ -463,9 +472,21 @@ ImageSet SeventvEmotes::createImageSet(const QJsonObject &emoteData)
baseWidth = width;
}
- auto image = Image::fromUrl(
- {QString("https:%1/%2").arg(baseUrl, file["name"].toString())},
- scale, {static_cast(width), file["height"].toInt(16)});
+ auto name = [&] {
+ if (useStatic)
+ {
+ auto staticName = file["static_name"].toString();
+ if (!staticName.isEmpty())
+ {
+ return staticName;
+ }
+ }
+ return file["name"].toString();
+ }();
+
+ auto image =
+ Image::fromUrl({QString("https:%1/%2").arg(baseUrl, name)}, scale,
+ {static_cast(width), file["height"].toInt(16)});
sizes.at(nextSize) = image;
nextSize++;
diff --git a/src/providers/seventv/SeventvEmotes.hpp b/src/providers/seventv/SeventvEmotes.hpp
index 03b966f9c..79a8500a9 100644
--- a/src/providers/seventv/SeventvEmotes.hpp
+++ b/src/providers/seventv/SeventvEmotes.hpp
@@ -153,8 +153,10 @@ public:
* Creates an image set from a 7TV emote or badge.
*
* @param emoteData { host: { files: [], url } }
+ * @param useStatic use static version if possible
*/
- static ImageSet createImageSet(const QJsonObject &emoteData);
+ static ImageSet createImageSet(const QJsonObject &emoteData,
+ bool useStatic);
private:
Atomic> global_;