From 0d227ab2f571d108f91cf774dc4f043a9e14ec26 Mon Sep 17 00:00:00 2001 From: apa420 <17131426+apa420@users.noreply.github.com> Date: Thu, 19 Dec 2019 21:36:02 +0100 Subject: [PATCH] Various bits fixes (#1443) We now make sure we don't render any fake bits Bits now show their real value properly --- src/providers/twitch/TwitchChannel.cpp | 1 + src/providers/twitch/TwitchEmotes.hpp | 1 + src/providers/twitch/TwitchMessageBuilder.cpp | 34 ++++++++++++++++++- src/providers/twitch/TwitchMessageBuilder.hpp | 1 + 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/providers/twitch/TwitchChannel.cpp b/src/providers/twitch/TwitchChannel.cpp index 051a7228..27fe8bd3 100644 --- a/src/providers/twitch/TwitchChannel.cpp +++ b/src/providers/twitch/TwitchChannel.cpp @@ -759,6 +759,7 @@ void TwitchChannel::refreshCheerEmotes() cheerEmote.color = QColor(tier.color); cheerEmote.minBits = tier.minBits; + cheerEmote.regex = cheerEmoteSet.regex; // TODO(pajlada): We currently hardcode dark here :| // We will continue to do so for now since we haven't had to diff --git a/src/providers/twitch/TwitchEmotes.hpp b/src/providers/twitch/TwitchEmotes.hpp index 808d86db..d0986cfe 100644 --- a/src/providers/twitch/TwitchEmotes.hpp +++ b/src/providers/twitch/TwitchEmotes.hpp @@ -18,6 +18,7 @@ using EmotePtr = std::shared_ptr; struct CheerEmote { QColor color; int minBits; + QRegularExpression regex; EmotePtr animatedEmote; EmotePtr staticEmote; diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index 23ebff20..13785e17 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -346,6 +346,7 @@ MessagePtr TwitchMessageBuilder::build() if (iterator != this->tags.end()) { this->hasBits_ = true; + this->bitsLeft = iterator.value().toInt(); this->bits = iterator.value().toString(); } @@ -1263,12 +1264,41 @@ void TwitchMessageBuilder::appendChatterinoBadges() Outcome TwitchMessageBuilder::tryParseCheermote(const QString &string) { + if (this->bitsLeft == 0) + { + return Failure; + } + auto cheerOpt = this->twitchChannel->cheerEmote(string); + if (!cheerOpt) { return Failure; } + auto &cheerEmote = *cheerOpt; + auto match = cheerEmote.regex.match(string); + + if (!match.hasMatch()) + { + return Failure; + } + + int cheerValue = match.captured(1).toInt(); + + if (this->bitsLeft >= cheerValue) + { + this->bitsLeft -= cheerValue; + } + else + { + QString newString = string; + newString.chop(QString::number(cheerValue).length()); + newString += QString::number(cheerValue - this->bitsLeft); + + return tryParseCheermote(newString); + } + if (cheerEmote.staticEmote) { this->emplace(cheerEmote.staticEmote, @@ -1281,9 +1311,11 @@ Outcome TwitchMessageBuilder::tryParseCheermote(const QString &string) } if (cheerEmote.color != QColor()) { - this->emplace(this->bits, MessageElementFlag::BitsAmount, + this->emplace(match.captured(1), + MessageElementFlag::BitsAmount, cheerEmote.color); } + return Success; } diff --git a/src/providers/twitch/TwitchMessageBuilder.hpp b/src/providers/twitch/TwitchMessageBuilder.hpp index df06a252..b91f1a83 100644 --- a/src/providers/twitch/TwitchMessageBuilder.hpp +++ b/src/providers/twitch/TwitchMessageBuilder.hpp @@ -81,6 +81,7 @@ private: QString roomID_; bool hasBits_ = false; QString bits; + int bitsLeft; bool historicalMessage_ = false; QString userId_;