From f66bc37368f33a8c1983e64332118a3b92704fae Mon Sep 17 00:00:00 2001 From: pajlada Date: Thu, 24 Oct 2024 10:26:20 +0200 Subject: [PATCH 1/2] fix: use static version of 7tv badges (#5674) --- CHANGELOG.md | 1 + src/providers/seventv/SeventvBadges.cpp | 2 +- src/providers/seventv/SeventvEmotes.cpp | 37 +++++++++++++++++++------ src/providers/seventv/SeventvEmotes.hpp | 4 ++- 4 files changed, 33 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2992cd350..189ebadcf 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) 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..3df627934 100644 --- a/src/providers/seventv/SeventvEmotes.cpp +++ b/src/providers/seventv/SeventvEmotes.cpp @@ -106,12 +106,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 +433,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 +470,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_; From 74a385dfee4913da3bff63dfa998a5ccd1a922b7 Mon Sep 17 00:00:00 2001 From: nerix Date: Sun, 27 Oct 2024 12:56:37 +0100 Subject: [PATCH 2/2] fix: escape 7TV emote names (#5677) --- CHANGELOG.md | 1 + src/providers/seventv/SeventvEmotes.cpp | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 189ebadcf..d11309f2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,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/SeventvEmotes.cpp b/src/providers/seventv/SeventvEmotes.cpp index 3df627934..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)}; }