From 0d7a05e62fbaa787b0245a35830d78b452b6f76d Mon Sep 17 00:00:00 2001 From: nerix Date: Sun, 23 Feb 2025 17:23:29 +0100 Subject: [PATCH] chore(eventsub): simplify building for system messages (#5980) --- CHANGELOG.md | 2 +- src/providers/twitch/eventsub/Connection.cpp | 38 +++--- .../twitch/eventsub/MessageBuilder.cpp | 125 +++++++----------- .../twitch/eventsub/MessageBuilder.hpp | 35 +++-- 4 files changed, 89 insertions(+), 111 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a083d631..d0ff89c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,7 +29,7 @@ - Bugfix: Fixed channel point redemptions with messages not showing up if PubSub is disconnected. (#5948) - Bugfix: Fixed the input font not immediately updating when zooming in/out. (#5960) - Dev: Subscriptions to PubSub channel points redemption topics now use no auth token, making it continue to work during PubSub shutdown. (#5947) -- Dev: Add initial experimental EventSub support. (#5837, #5895, #5897, #5904, #5910, #5903, #5915, #5916, #5930, #5935, #5932, #5943, #5952, #5953, #5968, #5973, #5974) +- Dev: Add initial experimental EventSub support. (#5837, #5895, #5897, #5904, #5910, #5903, #5915, #5916, #5930, #5935, #5932, #5943, #5952, #5953, #5968, #5973, #5974, #5980) - Dev: Remove unneeded platform specifier for toasts. (#5914) - Dev: Highlight checks now use non-capturing groups for the boundaries. (#5784) - Dev: Removed unused PubSub whisper code. (#5898) diff --git a/src/providers/twitch/eventsub/Connection.cpp b/src/providers/twitch/eventsub/Connection.cpp index d04136b1..1ab18619 100644 --- a/src/providers/twitch/eventsub/Connection.cpp +++ b/src/providers/twitch/eventsub/Connection.cpp @@ -20,9 +20,20 @@ namespace { +using namespace chatterino; +using namespace chatterino::eventsub; + // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables) const auto &LOG = chatterinoTwitchEventSub; +template +concept CanMakeModMessage = + requires(EventSubMessageBuilder &builder, + const lib::payload::channel_moderate::v2::Event &event, + const std::remove_cvref_t &action) { + makeModerateMessage(builder, event, action); + }; + } // namespace namespace chatterino::eventsub { @@ -178,29 +189,12 @@ void Connection::onChannelModerate( std::visit( [&](auto &&action) { using Action = std::remove_cvref_t; - if constexpr (std::is_same_v< - Action, lib::payload::channel_moderate::v2::Vip>) + if constexpr (CanMakeModMessage) { - auto msg = makeVipMessage(channel, now, payload.event, action); - runInGuiThread([channel, msg] { - channel->addMessage(msg, MessageContext::Original); - }); - } - else if constexpr (std::is_same_v< - Action, - lib::payload::channel_moderate::v2::Unvip>) - { - auto msg = - makeUnvipMessage(channel, now, payload.event, action); - runInGuiThread([channel, msg] { - channel->addMessage(msg, MessageContext::Original); - }); - } - else if constexpr (std::is_same_v< - Action, - lib::payload::channel_moderate::v2::Warn>) - { - auto msg = makeWarnMessage(channel, now, payload.event, action); + EventSubMessageBuilder builder(channel, now); + builder->loginName = payload.event.moderatorUserLogin.qt(); + makeModerateMessage(builder, payload.event, action); + auto msg = builder.release(); runInGuiThread([channel, msg] { channel->addMessage(msg, MessageContext::Original); }); diff --git a/src/providers/twitch/eventsub/MessageBuilder.cpp b/src/providers/twitch/eventsub/MessageBuilder.cpp index b54c6ad3..b89787f4 100644 --- a/src/providers/twitch/eventsub/MessageBuilder.cpp +++ b/src/providers/twitch/eventsub/MessageBuilder.cpp @@ -1,111 +1,82 @@ #include "providers/twitch/eventsub/MessageBuilder.hpp" +#include "messages/Message.hpp" #include "messages/MessageBuilder.hpp" namespace chatterino::eventsub { -MessagePtr makeVipMessage( - TwitchChannel *channel, const QDateTime &time, - const lib::payload::channel_moderate::v2::Event &event, - const lib::payload::channel_moderate::v2::Vip &action) +EventSubMessageBuilder::EventSubMessageBuilder(TwitchChannel *channel, + const QDateTime &time) + : channel(channel) { - MessageBuilder builder; + this->emplace(); + this->message().flags.set(MessageFlag::System); + this->message().flags.set(MessageFlag::Timeout); // do we need this? + this->message().serverReceivedTime = time; +} +EventSubMessageBuilder::~EventSubMessageBuilder() = default; + +void EventSubMessageBuilder::appendUser(const lib::String &userName, + const lib::String &userLogin, + QString &text, bool trailingSpace) +{ + auto login = userLogin.qt(); + auto *el = this->emplace(userName.qt(), login, + MessageColor::System, + channel->getUserColor(login)); + text.append(login); + + if (trailingSpace) + { + text.append(u' '); + } + else + { + el->setTrailingSpace(false); + } +} + +void makeModerateMessage(EventSubMessageBuilder &builder, + const lib::payload::channel_moderate::v2::Event &event, + const lib::payload::channel_moderate::v2::Vip &action) +{ QString text; - builder.emplace(); - builder->flags.set(MessageFlag::System); - builder->flags.set(MessageFlag::Timeout); - builder->loginName = event.moderatorUserLogin.qt(); - - builder.emplace( - event.moderatorUserName.qt(), event.moderatorUserLogin.qt(), - MessageColor::System, - channel->getUserColor(event.moderatorUserLogin.qt())); - text.append(event.moderatorUserLogin.qt() + " "); - + builder.appendUser(event.moderatorUserName, event.moderatorUserLogin, text); builder.emplaceSystemTextAndUpdate("has added", text); - - builder.emplace( - action.userName.qt(), action.userLogin.qt(), MessageColor::System, - channel->getUserColor(action.userLogin.qt())); - text.append(action.userLogin.qt() + " "); - + builder.appendUser(action.userName, action.userLogin, text); builder.emplaceSystemTextAndUpdate("as a VIP of this channel.", text); builder.message().messageText = text; builder.message().searchText = text; - - builder.message().serverReceivedTime = time; - - return builder.release(); } -MessagePtr makeUnvipMessage( - TwitchChannel *channel, const QDateTime &time, +void makeModerateMessage( + EventSubMessageBuilder &builder, const lib::payload::channel_moderate::v2::Event &event, const lib::payload::channel_moderate::v2::Unvip &action) { - MessageBuilder builder; - QString text; - builder.emplace(); - builder->flags.set(MessageFlag::System); - builder->flags.set(MessageFlag::Timeout); - builder->loginName = event.moderatorUserLogin.qt(); - - builder.emplace( - event.moderatorUserName.qt(), event.moderatorUserLogin.qt(), - MessageColor::System, - channel->getUserColor(event.moderatorUserLogin.qt())); - text.append(event.moderatorUserLogin.qt() + " "); - + builder.appendUser(event.moderatorUserName, event.moderatorUserLogin, text); builder.emplaceSystemTextAndUpdate("has removed", text); - - builder.emplace( - action.userName.qt(), action.userLogin.qt(), MessageColor::System, - channel->getUserColor(action.userLogin.qt())); - text.append(action.userLogin.qt() + " "); - + builder.appendUser(action.userName, action.userLogin, text); builder.emplaceSystemTextAndUpdate("as a VIP of this channel.", text); builder.message().messageText = text; builder.message().searchText = text; - - builder.message().serverReceivedTime = time; - - return builder.release(); } -MessagePtr makeWarnMessage( - TwitchChannel *channel, const QDateTime &time, - const lib::payload::channel_moderate::v2::Event &event, - const lib::payload::channel_moderate::v2::Warn &action) +void makeModerateMessage(EventSubMessageBuilder &builder, + const lib::payload::channel_moderate::v2::Event &event, + const lib::payload::channel_moderate::v2::Warn &action) { - MessageBuilder builder; - QString text; - builder.emplace(); - builder->flags.set(MessageFlag::System); - builder->flags.set(MessageFlag::Timeout); - builder->loginName = event.moderatorUserLogin.qt(); - - builder.emplace( - event.moderatorUserName.qt(), event.moderatorUserLogin.qt(), - MessageColor::System, - channel->getUserColor(event.moderatorUserLogin.qt())); - text.append(event.moderatorUserLogin.qt() + " "); - + builder.appendUser(event.moderatorUserName, event.moderatorUserLogin, text); builder.emplaceSystemTextAndUpdate("has warned", text); - - builder - .emplace(action.userName.qt(), action.userLogin.qt(), - MessageColor::System, - channel->getUserColor(action.userLogin.qt())) - ->setTrailingSpace(false); - text.append(action.userLogin.qt()); + builder.appendUser(action.userName, action.userLogin, text, false); QStringList reasons; @@ -134,10 +105,6 @@ MessagePtr makeWarnMessage( builder.message().messageText = text; builder.message().searchText = text; - - builder.message().serverReceivedTime = time; - - return builder.release(); } } // namespace chatterino::eventsub diff --git a/src/providers/twitch/eventsub/MessageBuilder.hpp b/src/providers/twitch/eventsub/MessageBuilder.hpp index a2db7ec2..664c7d25 100644 --- a/src/providers/twitch/eventsub/MessageBuilder.hpp +++ b/src/providers/twitch/eventsub/MessageBuilder.hpp @@ -1,6 +1,6 @@ #pragma once -#include "messages/Message.hpp" +#include "messages/MessageBuilder.hpp" #include "providers/twitch/TwitchChannel.hpp" #include "twitch-eventsub-ws/payloads/channel-moderate-v2.hpp" @@ -8,21 +8,38 @@ namespace chatterino::eventsub { +class EventSubMessageBuilder : public MessageBuilder +{ +public: + EventSubMessageBuilder(TwitchChannel *channel, const QDateTime &time); + ~EventSubMessageBuilder(); + + EventSubMessageBuilder(const EventSubMessageBuilder &) = delete; + EventSubMessageBuilder(EventSubMessageBuilder &&) = delete; + EventSubMessageBuilder &operator=(const EventSubMessageBuilder &) = delete; + EventSubMessageBuilder &operator=(EventSubMessageBuilder &&) = delete; + + void appendUser(const lib::String &userName, const lib::String &userLogin, + QString &text, bool trailingSpace = true); + +private: + TwitchChannel *channel; +}; + /// has added as a VIP of this channel. -MessagePtr makeVipMessage( - TwitchChannel *channel, const QDateTime &time, - const lib::payload::channel_moderate::v2::Event &event, - const lib::payload::channel_moderate::v2::Vip &action); +void makeModerateMessage(EventSubMessageBuilder &builder, + const lib::payload::channel_moderate::v2::Event &event, + const lib::payload::channel_moderate::v2::Vip &action); /// has removed as a VIP of this channel. -MessagePtr makeUnvipMessage( - TwitchChannel *channel, const QDateTime &time, +void makeModerateMessage( + EventSubMessageBuilder &builder, const lib::payload::channel_moderate::v2::Event &event, const lib::payload::channel_moderate::v2::Unvip &action); /// has warned : -MessagePtr makeWarnMessage( - TwitchChannel *channel, const QDateTime &time, +void makeModerateMessage( + EventSubMessageBuilder &builder, const lib::payload::channel_moderate::v2::Event &event, const lib::payload::channel_moderate::v2::Warn &action);