diff --git a/CHANGELOG.md b/CHANGELOG.md index 55e86861..84f33b59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ - Minor: Added the ability to open an entire tab as a popup. (#3082) - Minor: Added optional parameter to /usercard command for opening a usercard in a different channel context. (#3172) - Minor: Added regex option to Nicknames. (#3146) +- Minor: Highlight usernames in /mods and /vips messages (#3187) - Minor: Added `/raw` command. (#3189) - Minor: Colorizing usernames on IRC, originally made for Mm2PL/dankerino (#3206) - Minor: Fixed `/streamlink` command not stripping leading @'s or #'s (#3215) diff --git a/src/providers/twitch/IrcMessageHandler.cpp b/src/providers/twitch/IrcMessageHandler.cpp index 636bc7f7..6c427dad 100644 --- a/src/providers/twitch/IrcMessageHandler.cpp +++ b/src/providers/twitch/IrcMessageHandler.cpp @@ -834,6 +834,31 @@ void IrcMessageHandler::handleNoticeMessage(Communi::IrcNoticeMessage *message) hostOn); channel->addMessage(builder.release()); } + else if (tags == "room_mods" || tags == "vips_success") + { + // /mods and /vips + // room_mods: The moderators of this channel are: ampzyh, antichriststollen, apa420, ... + // vips_success: The VIPs of this channel are: 8008, aiden, botfactory, ... + + QString noticeText = msg->messageText; + if (tags == "vips_success") + { + // this one has a trailing period, need to get rid of it. + noticeText.chop(1); + } + + QStringList msgParts = noticeText.split(':'); + MessageBuilder builder; + + auto tc = dynamic_cast(channel.get()); + assert(tc != nullptr && + "IrcMessageHandler::handleNoticeMessage. Twitch specific " + "functionality called in non twitch channel"); + + TwitchMessageBuilder::modsOrVipsSystemMessage( + msgParts.at(0), msgParts.at(1).split(", "), tc, &builder); + channel->addMessage(builder.release()); + } else { channel->addMessage(msg); diff --git a/src/providers/twitch/TwitchMessageBuilder.cpp b/src/providers/twitch/TwitchMessageBuilder.cpp index e50feb9f..337edb64 100644 --- a/src/providers/twitch/TwitchMessageBuilder.cpp +++ b/src/providers/twitch/TwitchMessageBuilder.cpp @@ -1438,4 +1438,49 @@ void TwitchMessageBuilder::deletionMessage(const DeleteAction &action, builder->message().timeoutUser = "msg:" + action.messageId; } +void TwitchMessageBuilder::modsOrVipsSystemMessage(QString prefix, + QStringList users, + TwitchChannel *channel, + MessageBuilder *builder) +{ + builder->emplace(); + builder->message().flags.set(MessageFlag::System); + builder->message().flags.set(MessageFlag::DoNotTriggerNotification); + builder->emplace(prefix, MessageElementFlag::Text, + MessageColor::System); + bool isFirst = true; + for (const QString &username : users) + { + if (!isFirst) + { + // this is used to add the ", " after each but the last entry + builder->emplace(",", MessageElementFlag::Text, + MessageColor::System); + } + isFirst = false; + + MessageColor color = MessageColor::System; + + if (getSettings()->colorUsernames) + { + if (auto userColor = channel->getUserColor(username); + userColor.isValid()) + { + color = MessageColor(userColor); + } + } + + builder + ->emplace(username, MessageElementFlag::BoldUsername, + color, FontStyle::ChatMediumBold) + ->setLink({Link::UserInfo, username}) + ->setTrailingSpace(false); + builder + ->emplace(username, + MessageElementFlag::NonBoldUsername, color) + ->setLink({Link::UserInfo, username}) + ->setTrailingSpace(false); + } +} + } // namespace chatterino diff --git a/src/providers/twitch/TwitchMessageBuilder.hpp b/src/providers/twitch/TwitchMessageBuilder.hpp index 8f1217c8..f4448b5a 100644 --- a/src/providers/twitch/TwitchMessageBuilder.hpp +++ b/src/providers/twitch/TwitchMessageBuilder.hpp @@ -64,6 +64,9 @@ public: MessageBuilder *builder); static void deletionMessage(const DeleteAction &action, MessageBuilder *builder); + static void modsOrVipsSystemMessage(QString prefix, QStringList users, + TwitchChannel *channel, + MessageBuilder *builder); private: void parseUsernameColor() override;