diff --git a/src/messages/MessageElement.hpp b/src/messages/MessageElement.hpp index 0e18f6a2..7d1a00c6 100644 --- a/src/messages/MessageElement.hpp +++ b/src/messages/MessageElement.hpp @@ -103,6 +103,10 @@ enum class MessageElementFlag { LowercaseLink = (1 << 29), OriginalLink = (1 << 30), + // ZeroWidthEmotes are emotes that are supposed to overlay over any pre-existing emotes + // e.g. BTTV's SoSnowy during christmas season + ZeroWidthEmote = (1 << 31), + Default = Timestamp | Badges | Username | BitsStatic | FfzEmoteImage | BttvEmoteImage | TwitchEmoteImage | BitsAmount | Text | AlwaysShow, diff --git a/src/messages/layouts/MessageLayoutContainer.cpp b/src/messages/layouts/MessageLayoutContainer.cpp index 91eb22e8..9c46e0c2 100644 --- a/src/messages/layouts/MessageLayoutContainer.cpp +++ b/src/messages/layouts/MessageLayoutContainer.cpp @@ -115,15 +115,27 @@ void MessageLayoutContainer::_addElement(MessageLayoutElement *element, // update line height this->lineHeight_ = std::max(this->lineHeight_, newLineHeight); + auto xOffset = 0; + + if (element->getCreator().getFlags().has( + MessageElementFlag::ZeroWidthEmote)) + { + xOffset -= element->getRect().width() + this->spaceWidth_; + } + // set move element - element->setPosition( - QPoint(this->currentX_, this->currentY_ - element->getRect().height())); + element->setPosition(QPoint(this->currentX_ + xOffset, + this->currentY_ - element->getRect().height())); // add element this->elements_.push_back(std::unique_ptr(element)); // set current x - this->currentX_ += element->getRect().width(); + if (!element->getCreator().getFlags().has( + MessageElementFlag::ZeroWidthEmote)) + { + this->currentX_ += element->getRect().width(); + } if (element->hasTrailingSpace()) { diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index ab65d84c..ad95ecd0 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -28,6 +28,10 @@ namespace { +const QStringList zeroWidthEmotes{ + "SoSnowy", "IceCold", "SantaHat", "TopHat", "ReinDeer", "CandyCane", +}; + QColor getRandomColor(const QVariant &userId) { static const std::vector twitchUsernameColors = { @@ -1162,6 +1166,11 @@ Outcome TwitchMessageBuilder::tryAppendEmote(const EmoteName &name) else if ((emote = globalBttvEmotes.emote(name))) { flags = MessageElementFlag::BttvEmote; + + if (zeroWidthEmotes.contains(name.string)) + { + flags.set(MessageElementFlag::ZeroWidthEmote); + } } if (emote)