Changed Streamer Mode settings (#2001)

There's now a new (yet another, sigh) section in Settings -> General, which lets you set streamer mode to 'enable/disable/detect obs' and there are also separate settings for each of the things that streamer mode covers. I just have to add ping sounds and PR is ready to be merged :)

* Show "Streamer Mode" image as link thumbnails if applicable

* Moved hideViewerCountAndDuration to streamerMode settings

Set it to false by default (just how it used to be under /misc settings, also reworked live tooltip to be a bit prettier and say "<Streamer Mode>" in gray instead of "Live with <hidden> for <hidden> viewers"
This commit is contained in:
Paweł 2020-10-11 13:52:14 +02:00 committed by GitHub
parent 56828f2d81
commit 2232c6d925
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 164 additions and 66 deletions

View file

@ -2,7 +2,8 @@
## Unversioned ## Unversioned
- Minor: Made the current channels emotes appear at the top of the emote picker popup. - Major: Added Streamer Mode configuration (under `Settings -> General`), where you can select which features of Chatterino should behave differently when you are in Streamer Mode. (#2001)
- Minor: Made the current channels emotes appear at the top of the emote picker popup. (#2057)
- Minor: Added viewer list button to twitch channel header. (#1978) - Minor: Added viewer list button to twitch channel header. (#1978)
- Minor: Added followage and subage information to usercard. (#2023) - Minor: Added followage and subage information to usercard. (#2023)
- Minor: Added an option to only open channels specified in command line with `-c` parameter. You can also use `--help` to display short help message (#1940) - Minor: Added an option to only open channels specified in command line with `-c` parameter. You can also use `--help` to display short help message (#1940)

View file

@ -7,6 +7,7 @@
#include "providers/twitch/TwitchCommon.hpp" #include "providers/twitch/TwitchCommon.hpp"
#include "singletons/Settings.hpp" #include "singletons/Settings.hpp"
#include "singletons/WindowManager.hpp" #include "singletons/WindowManager.hpp"
#include "util/StreamerMode.hpp"
namespace chatterino { namespace chatterino {
@ -365,6 +366,12 @@ void SharedMessageBuilder::triggerHighlights()
{ {
static QUrl currentPlayerUrl; static QUrl currentPlayerUrl;
if (isInStreamerMode() && getSettings()->streamerModeMuteMentions)
{
// We are in streamer mode with muting mention sounds enabled. Do nothing.
return;
}
if (getCSettings().isMutedChannel(this->channel->getName())) if (getCSettings().isMutedChannel(this->channel->getName()))
{ {
// Do nothing. Pings are muted in this channel. // Do nothing. Pings are muted in this channel.

View file

@ -32,12 +32,11 @@ void LinkResolver::getLinkInfo(
auto statusCode = root.value("status").toInt(); auto statusCode = root.value("status").toInt();
QString response = QString(); QString response = QString();
QString linkString = url; QString linkString = url;
ImagePtr thumbnail = nullptr; ImagePtr thumbnail =
Image::fromUrl({root.value("thumbnail").toString()});
if (statusCode == 200) if (statusCode == 200)
{ {
response = root.value("tooltip").toString(); response = root.value("tooltip").toString();
thumbnail =
Image::fromUrl({root.value("thumbnail").toString()});
if (getSettings()->unshortLinks) if (getSettings()->unshortLinks)
{ {
linkString = root.value("link").toString(); linkString = root.value("link").toString();

View file

@ -9,6 +9,7 @@
#include "controllers/highlights/HighlightPhrase.hpp" #include "controllers/highlights/HighlightPhrase.hpp"
#include "controllers/moderationactions/ModerationAction.hpp" #include "controllers/moderationactions/ModerationAction.hpp"
#include "singletons/Toasts.hpp" #include "singletons/Toasts.hpp"
#include "util/StreamerMode.hpp"
#include "widgets/Notebook.hpp" #include "widgets/Notebook.hpp"
using TimeoutButton = std::pair<QString, int>; using TimeoutButton = std::pair<QString, int>;
@ -177,7 +178,18 @@ public:
BoolSetting unshortLinks = {"/links/unshortLinks", false}; BoolSetting unshortLinks = {"/links/unshortLinks", false};
BoolSetting lowercaseDomains = {"/links/linkLowercase", true}; BoolSetting lowercaseDomains = {"/links/linkLowercase", true};
/// Ignored phrases /// Streamer Mode
EnumSetting<StreamerModeSetting> enableStreamerMode = {
"/streamerMode/enabled", StreamerModeSetting::DetectObs};
BoolSetting streamerModeHideUsercardAvatars = {
"/streamerMode/hideUsercardAvatars", true};
BoolSetting streamerModeHideLinkThumbnails = {
"/streamerMode/hideLinkThumbnails", true};
BoolSetting streamerModeHideViewerCountAndDuration = {
"/streamerMode/hideViewerCountAndDuration", false};
BoolSetting streamerModeMuteMentions = {"/streamerMode/muteMentions", true};
/// Ignored Phrases
QStringSetting ignoredPhraseReplace = {"/ignore/ignoredPhraseReplace", QStringSetting ignoredPhraseReplace = {"/ignore/ignoredPhraseReplace",
"***"}; "***"};
@ -314,8 +326,6 @@ public:
BoolSetting restartOnCrash = {"/misc/restartOnCrash", false}; BoolSetting restartOnCrash = {"/misc/restartOnCrash", false};
BoolSetting attachExtensionToAnyProcess = { BoolSetting attachExtensionToAnyProcess = {
"/misc/attachExtensionToAnyProcess", false}; "/misc/attachExtensionToAnyProcess", false};
BoolSetting hideViewerCountAndDuration = {
"/misc/hideViewerCountAndDuration", false};
BoolSetting askOnImageUpload = {"/misc/askOnImageUpload", true}; BoolSetting askOnImageUpload = {"/misc/askOnImageUpload", true};
/// Debug /// Debug

View file

@ -1,5 +1,7 @@
#include "StreamerMode.hpp" #include "StreamerMode.hpp"
#include "singletons/Settings.hpp"
#ifdef USEWINSDK #ifdef USEWINSDK
# include <Windows.h> # include <Windows.h>
@ -24,9 +26,19 @@ const QStringList &broadcastingBinaries()
bool isInStreamerMode() bool isInStreamerMode()
{ {
#ifdef USEWINSDK switch (getSettings()->enableStreamerMode.getEnum())
if (IsWindowsVistaOrGreater())
{ {
case StreamerModeSetting::Enabled:
return true;
case StreamerModeSetting::Disabled:
return false;
}
#ifdef USEWINSDK
if (!IsWindowsVistaOrGreater())
{
return false;
}
static bool cache = false; static bool cache = false;
static QDateTime time = QDateTime(); static QDateTime time = QDateTime();
@ -59,12 +71,12 @@ bool isInStreamerMode()
} }
if (pWPIs) if (pWPIs)
{
WTSFreeMemory(pWPIs); WTSFreeMemory(pWPIs);
}
cache = false; cache = false;
}
#endif #endif
return false; return false;
} }

View file

@ -2,6 +2,8 @@
namespace chatterino { namespace chatterino {
enum StreamerModeSetting { Disabled = 0, Enabled = 1, DetectObs = 2 };
const QStringList &broadcastingBinaries(); const QStringList &broadcastingBinaries();
bool isInStreamerMode(); bool isInStreamerMode();

View file

@ -586,7 +586,8 @@ void UserInfoPopup::updateUserData()
[] { [] {
// failure // failure
}); });
if (isInStreamerMode()) if (isInStreamerMode() &&
getSettings()->streamerModeHideUsercardAvatars)
{ {
this->ui_.avatarButton->setPixmap(getResources().streamerMode); this->ui_.avatarButton->setPixmap(getResources().streamerMode);
} }

View file

@ -1314,13 +1314,21 @@ void ChannelView::mouseMoveEvent(QMouseEvent *event)
{ {
auto element = &hoverLayoutElement->getCreator(); auto element = &hoverLayoutElement->getCreator();
auto thumbnailSize = getSettings()->thumbnailSize; auto thumbnailSize = getSettings()->thumbnailSize;
if (thumbnailSize == 0 || isInStreamerMode()) if (!thumbnailSize)
{ {
tooltipPreviewImage.setImage(nullptr); tooltipPreviewImage.setImage(nullptr);
} }
else else
{ {
tooltipPreviewImage.setImage(element->getThumbnail()); const auto isHideLink =
isInStreamerMode() &&
getSettings()->streamerModeHideLinkThumbnails &&
(!element->getThumbnail()->url().string.isEmpty());
auto thumb =
isHideLink ? Image::fromPixmap(getResources().streamerMode)
: element->getThumbnail();
tooltipPreviewImage.setImage(std::move(thumb));
if (element->getThumbnailType() == if (element->getThumbnailType() ==
MessageElement::ThumbnailType::Link_Thumbnail) MessageElement::ThumbnailType::Link_Thumbnail)
{ {

View file

@ -13,6 +13,7 @@
#include "util/FuzzyConvert.hpp" #include "util/FuzzyConvert.hpp"
#include "util/Helpers.hpp" #include "util/Helpers.hpp"
#include "util/IncognitoBrowser.hpp" #include "util/IncognitoBrowser.hpp"
#include "util/StreamerMode.hpp"
#include "widgets/BaseWindow.hpp" #include "widgets/BaseWindow.hpp"
#include "widgets/dialogs/ColorPickerDialog.hpp" #include "widgets/dialogs/ColorPickerDialog.hpp"
#include "widgets/helper/ColorButton.hpp" #include "widgets/helper/ColorButton.hpp"
@ -529,6 +530,31 @@ void GeneralPage::initLayout(SettingsLayout &layout)
return fuzzyToInt(args.value, 0); return fuzzyToInt(args.value, 0);
}); });
layout.addTitle("Streamer Mode");
layout.addDescription(
"Chatterino can automatically change behavior if it "
"detects that \"OBS Studio\" is running.\nSelect which "
"things you want to change while streaming");
ComboBox *dankDropdown =
layout.addDropdown<std::underlying_type<StreamerModeSetting>::type>(
"Enable Streamer Mode", {"No", "Yes", "Detect OBS (Windows only)"},
s.enableStreamerMode, [](int value) { return value; },
[](DropdownArgs args) {
return static_cast<StreamerModeSetting>(args.index);
},
false);
dankDropdown->setMinimumWidth(dankDropdown->minimumSizeHint().width() + 10);
layout.addCheckbox("Hide usercard avatars",
s.streamerModeHideUsercardAvatars);
layout.addCheckbox("Hide link thumbnails",
s.streamerModeHideLinkThumbnails);
layout.addCheckbox(
"Hide viewer count and stream length while hovering over split header",
s.streamerModeHideViewerCountAndDuration);
layout.addCheckbox("Mute mention sounds", s.streamerModeMuteMentions);
layout.addTitle("Emotes"); layout.addTitle("Emotes");
layout.addCheckbox("Enable", s.enableEmoteImages); layout.addCheckbox("Enable", s.enableEmoteImages);
layout.addCheckbox("Animate", s.animateEmotes); layout.addCheckbox("Animate", s.animateEmotes);
@ -732,9 +758,6 @@ void GeneralPage::initLayout(SettingsLayout &layout)
s.enableExperimentalIrc); s.enableExperimentalIrc);
layout.addCheckbox("Show unhandled IRC messages", layout.addCheckbox("Show unhandled IRC messages",
s.showUnhandledIrcMessages); s.showUnhandledIrcMessages);
layout.addCheckbox(
"Hide viewercount and stream length while hovering the split",
s.hideViewerCountAndDuration);
layout.addDropdown<int>( layout.addDropdown<int>(
"Stack timeouts", {"Stack", "Stack until timeout", "Don't stack"}, "Stack timeouts", {"Stack", "Stack until timeout", "Don't stack"},
s.timeoutStackStyle, [](int index) { return index; }, s.timeoutStackStyle, [](int index) { return index; },

View file

@ -12,6 +12,7 @@
#include "singletons/WindowManager.hpp" #include "singletons/WindowManager.hpp"
#include "util/LayoutCreator.hpp" #include "util/LayoutCreator.hpp"
#include "util/LayoutHelper.hpp" #include "util/LayoutHelper.hpp"
#include "util/StreamerMode.hpp"
#include "widgets/Label.hpp" #include "widgets/Label.hpp"
#include "widgets/TooltipWidget.hpp" #include "widgets/TooltipWidget.hpp"
#include "widgets/dialogs/SettingsDialog.hpp" #include "widgets/dialogs/SettingsDialog.hpp"
@ -86,30 +87,64 @@ namespace {
} }
auto formatTooltip(const TwitchChannel::StreamStatus &s, QString thumbnail) auto formatTooltip(const TwitchChannel::StreamStatus &s, QString thumbnail)
{ {
return QString("<style>.center { text-align: center; }</style> \ auto title = [&s]() -> QString {
<p class=\"center\">%1%2%3%4%5%6 for %7 with %8 viewers</p>") if (s.title.isEmpty())
.arg(s.title.toHtmlEscaped()) {
.arg(s.title.isEmpty() ? QString() : "<br><br>") return QStringLiteral("");
.arg(getSettings()->thumbnailSizeStream.getValue() > 0 }
? ((thumbnail.isEmpty()
? "Couldn't fetch thumbnail" return s.title.toHtmlEscaped() + "<br><br>";
: "<img src=\"data:image/jpg;base64, " + }();
thumbnail + "\"/>") +
"<br>") auto tooltip = [&thumbnail]() -> QString {
: QString()) if (getSettings()->thumbnailSizeStream.getValue() == 0)
.arg(s.game.toHtmlEscaped()) {
.arg(s.game.isEmpty() ? QString() : "<br>") return QStringLiteral("");
}
if (thumbnail.isEmpty())
{
return QStringLiteral("Couldn't fetch thumbnail<br>");
}
return "<img src=\"data:image/jpg;base64, " + thumbnail + "\"><br>";
}();
auto game = [&s]() -> QString {
if (s.game.isEmpty())
{
return QStringLiteral("");
}
return s.game.toHtmlEscaped() + "<br>";
}();
auto extraStreamData = [&s]() -> QString {
if (isInStreamerMode() &&
getSettings()->streamerModeHideViewerCountAndDuration)
{
return QStringLiteral(
"<span style=\"color: #808892;\">&lt;Streamer "
"Mode&gt;</span>");
}
return QString("%1 for %2 with %3 viewers")
.arg(s.rerun ? "Vod-casting" : "Live") .arg(s.rerun ? "Vod-casting" : "Live")
.arg(getSettings()->hideViewerCountAndDuration ? "&lt;Hidden&gt;" .arg(s.uptime)
: s.uptime) .arg(QString::number(s.viewerCount));
.arg(getSettings()->hideViewerCountAndDuration }();
? "&lt;Hidden&gt;"
: QString::number(s.viewerCount)); return QString("<p style=\"text-align: center;\">" + //
title + //
tooltip + //
game + //
extraStreamData + //
"</p>" //
);
} }
auto formatOfflineTooltip(const TwitchChannel::StreamStatus &s) auto formatOfflineTooltip(const TwitchChannel::StreamStatus &s)
{ {
return QString("<style>.center { text-align: center; }</style> \ return QString("<p style=\"text-align: center;\">Offline<br>%1</p>")
<p class=\"center\">Offline<br>%1</p>")
.arg(s.title.toHtmlEscaped()); .arg(s.title.toHtmlEscaped());
} }
auto formatTitle(const TwitchChannel::StreamStatus &s, Settings &settings) auto formatTitle(const TwitchChannel::StreamStatus &s, Settings &settings)