diff --git a/CHANGELOG.md b/CHANGELOG.md index 986cdb3f..92d20b13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ - Minor: Overlay windows now inherit the global zoom level and can be zoomed independently. (#6016) - Minor: The `/watching` channel is now supported on all platforms. (#6031) - Minor: The font weight of chat messages can now be changed. (#6037) +- Minor: Messages from suspicious users can now be hidden when in streamer mode. This is enabled by default. (#6042) - Bugfix: Fixed a potential way to escape the Lua Plugin sandbox. (#5846) - Bugfix: Fixed a crash relating to Lua HTTP. (#5800) - Bugfix: Fixed a crash that could occur on Linux and macOS when clicking "Install" from the update prompt. (#5818) diff --git a/mocks/include/mocks/DisabledStreamerMode.hpp b/mocks/include/mocks/DisabledStreamerMode.hpp index 20409d46..40127faa 100644 --- a/mocks/include/mocks/DisabledStreamerMode.hpp +++ b/mocks/include/mocks/DisabledStreamerMode.hpp @@ -15,6 +15,11 @@ public: return false; } + bool shouldHideSuspiciousUsers() const override + { + return false; + } + void start() override { } diff --git a/src/messages/layouts/MessageLayout.cpp b/src/messages/layouts/MessageLayout.cpp index 184db353..43547c2f 100644 --- a/src/messages/layouts/MessageLayout.cpp +++ b/src/messages/layouts/MessageLayout.cpp @@ -166,6 +166,17 @@ void MessageLayout::actuallyLayout(const MessageLayoutContext &ctx) continue; } + if (this->message_->flags.hasAny(MessageFlag::RestrictedMessage, + MessageFlag::MonitoredMessage)) + { + if (getApp()->getStreamerMode()->shouldHideSuspiciousUsers()) + { + // Message is being hidden because the source is a + // restricted or monitored user + continue; + } + } + if (this->message_->flags.has(MessageFlag::ModerationAction)) { if (hideModerationActions || diff --git a/src/providers/twitch/eventsub/MessageBuilder.cpp b/src/providers/twitch/eventsub/MessageBuilder.cpp index 93375c4d..fa21b88c 100644 --- a/src/providers/twitch/eventsub/MessageBuilder.cpp +++ b/src/providers/twitch/eventsub/MessageBuilder.cpp @@ -704,10 +704,12 @@ MessagePtr makeSuspiciousUserMessageHeader( if (event.lowTrustStatus == lib::suspicious_users::Status::Restricted) { headerMessage = u"Restricted"_s; + builder->flags.set(MessageFlag::RestrictedMessage); } else { headerMessage = u"Monitored"_s; + builder->flags.set(MessageFlag::MonitoredMessage); } auto hasType = [&](lib::suspicious_users::Type type) { diff --git a/src/singletons/Settings.hpp b/src/singletons/Settings.hpp index 6484b872..1e303cf6 100644 --- a/src/singletons/Settings.hpp +++ b/src/singletons/Settings.hpp @@ -346,6 +346,12 @@ public: BoolSetting lowercaseDomains = {"/links/linkLowercase", true}; /// Streamer Mode + // TODO: Should these settings be converted to booleans that live outside of + // streamer mode? + // Something like: + // - "Hide when streamer mode is enabled" + // - "Always hide" + // - "Don't hide" EnumSetting enableStreamerMode = { "/streamerMode/enabled", StreamerModeSetting::DetectStreamingSoftware}; BoolSetting streamerModeHideUsercardAvatars = { @@ -356,6 +362,10 @@ public: "/streamerMode/hideViewerCountAndDuration", false}; BoolSetting streamerModeHideModActions = {"/streamerMode/hideModActions", true}; + BoolSetting streamerModeHideSuspiciousUsers = { + "/streamerMode/hideSuspiciousUsers", + true, + }; BoolSetting streamerModeMuteMentions = {"/streamerMode/muteMentions", true}; BoolSetting streamerModeSuppressLiveNotifications = { "/streamerMode/supressLiveNotifications", false}; diff --git a/src/singletons/StreamerMode.cpp b/src/singletons/StreamerMode.cpp index 1548365a..7d4b594c 100644 --- a/src/singletons/StreamerMode.cpp +++ b/src/singletons/StreamerMode.cpp @@ -207,6 +207,11 @@ bool StreamerMode::shouldHideModActions() const return getSettings()->streamerModeHideModActions && this->isEnabled(); } +bool StreamerMode::shouldHideSuspiciousUsers() const +{ + return getSettings()->streamerModeHideSuspiciousUsers && this->isEnabled(); +} + void StreamerMode::start() { this->private_->start(); diff --git a/src/singletons/StreamerMode.hpp b/src/singletons/StreamerMode.hpp index 1f736d0b..c759a0d6 100644 --- a/src/singletons/StreamerMode.hpp +++ b/src/singletons/StreamerMode.hpp @@ -23,6 +23,9 @@ public: /// Returns true if streamer mode is enabled & the settings to hide mod actions is enabled [[nodiscard]] virtual bool shouldHideModActions() const = 0; + /// Returns true if streamer mode is enabled & the settings to hide messages from suspicious users is enabled + [[nodiscard]] virtual bool shouldHideSuspiciousUsers() const = 0; + virtual void start() = 0; Q_SIGNALS: @@ -43,6 +46,7 @@ public: bool isEnabled() const override; bool shouldHideModActions() const override; + bool shouldHideSuspiciousUsers() const override; void start() override; diff --git a/src/singletons/WindowManager.cpp b/src/singletons/WindowManager.cpp index 089a2fa4..9bca93d3 100644 --- a/src/singletons/WindowManager.cpp +++ b/src/singletons/WindowManager.cpp @@ -147,6 +147,8 @@ WindowManager::WindowManager(const Paths &paths, Settings &settings, this->forceLayoutChannelViewsListener.add(settings.hideModerated); this->forceLayoutChannelViewsListener.add( settings.streamerModeHideModActions); + this->forceLayoutChannelViewsListener.add( + settings.streamerModeHideSuspiciousUsers); this->layoutChannelViewsListener.add(settings.timestampFormat); this->layoutChannelViewsListener.add(fonts.fontChanged); diff --git a/src/widgets/settingspages/GeneralPage.cpp b/src/widgets/settingspages/GeneralPage.cpp index 240d3232..991062ea 100644 --- a/src/widgets/settingspages/GeneralPage.cpp +++ b/src/widgets/settingspages/GeneralPage.cpp @@ -732,6 +732,13 @@ void GeneralPage::initLayout(GeneralPageView &layout) layout.addCheckbox( "Hide moderation actions", s.streamerModeHideModActions, false, "Hide bans, timeouts, and automod messages from appearing in chat."); + + SettingWidget::checkbox("Hide messages from suspicious users", + s.streamerModeHideSuspiciousUsers) + ->setTooltip("Suspicious users are users who are marked as either " + "restricted or monitored by you or Twitch's AutoMod") + ->addTo(layout); + layout.addCheckbox( "Hide blocked terms", s.streamerModeHideBlockedTermText, false, "Hide blocked terms from showing up in places like AutoMod messages. " diff --git a/tests/snapshots/EventSub/channel-suspicious-user-message/restricted-emote.json b/tests/snapshots/EventSub/channel-suspicious-user-message/restricted-emote.json index 5d689469..3d18b33f 100644 --- a/tests/snapshots/EventSub/channel-suspicious-user-message/restricted-emote.json +++ b/tests/snapshots/EventSub/channel-suspicious-user-message/restricted-emote.json @@ -88,7 +88,7 @@ ] } ], - "flags": "LowTrustUsers|EventSub", + "flags": "LowTrustUsers|RestrictedMessage|EventSub", "id": "", "localizedName": "", "loginName": "", diff --git a/tests/snapshots/EventSub/channel-suspicious-user-message/restricted.json b/tests/snapshots/EventSub/channel-suspicious-user-message/restricted.json index d89714a7..354305d7 100644 --- a/tests/snapshots/EventSub/channel-suspicious-user-message/restricted.json +++ b/tests/snapshots/EventSub/channel-suspicious-user-message/restricted.json @@ -85,7 +85,7 @@ ] } ], - "flags": "LowTrustUsers|EventSub", + "flags": "LowTrustUsers|RestrictedMessage|EventSub", "id": "", "localizedName": "", "loginName": "",