diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 355c3186..ed6f8bce 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -1108,6 +1108,8 @@ AdvSceneSwitcher.twitchToken.request.success.browser="Authentication successful! AdvSceneSwitcher.twitchToken.request.notSet="Account is not connected!" AdvSceneSwitcher.twitchToken.permissions="Token permissions:" AdvSceneSwitcher.twitchToken.permissionsInsufficient="Permissions of selected token are insufficient to perform selected action!" +AdvSceneSwitcher.twitchToken.notValid="Selected token is invalid!" +AdvSceneSwitcher.twitchToken.noSelection="No token selected!" AdvSceneSwitcher.twitchToken.channel.broadcast.manage="Manage a channel’s broadcast configuration, including updating channel configuration and managing stream markers and stream tags." AdvSceneSwitcher.twitchToken.channel.subscriptions.read="Read channel's subscribers list and info." AdvSceneSwitcher.twitchToken.moderator.followers.read="Read the followers of a broadcaster." diff --git a/plugins/twitch/macro-action-twitch.cpp b/plugins/twitch/macro-action-twitch.cpp index 95ebba61..ca772f4d 100644 --- a/plugins/twitch/macro-action-twitch.cpp +++ b/plugins/twitch/macro-action-twitch.cpp @@ -473,8 +473,7 @@ MacroActionTwitchEdit::MacroActionTwitchEdit( _layout(new QHBoxLayout()), _actions(new FilterComboBox()), _tokens(new TwitchConnectionSelection()), - _tokenPermissionWarning(new QLabel(obs_module_text( - "AdvSceneSwitcher.twitchToken.permissionsInsufficient"))), + _tokenWarning(new QLabel()), _streamTitle(new VariableLineEdit(this)), _category(new TwitchCategoryWidget(this)), _markerDescription(new VariableLineEdit(this)), @@ -496,10 +495,10 @@ MacroActionTwitchEdit::MacroActionTwitchEdit( mainLayout->addLayout(_layout); mainLayout->addWidget(_announcementMessage); mainLayout->addWidget(_chatMessage); - mainLayout->addWidget(_tokenPermissionWarning); + mainLayout->addWidget(_tokenWarning); setLayout(mainLayout); - _tokenPermissionCheckTimer.start(1000); + _tokenCheckTimer.start(1000); UpdateEntryData(); _loading = false; @@ -541,14 +540,42 @@ void MacroActionTwitchEdit::TwitchTokenChanged(const QString &token) emit(HeaderInfoChanged(token)); } -void MacroActionTwitchEdit::CheckTokenPermissions() +void MacroActionTwitchEdit::SetTokenWarning(bool visible, const QString &text) { - _tokenPermissionWarning->setVisible( - _entryData && !_entryData->ActionIsSupportedByToken()); + _tokenWarning->setText(text); + _tokenWarning->setVisible(visible); adjustSize(); updateGeometry(); } +void MacroActionTwitchEdit::CheckToken() +{ + if (!_entryData) { + return; + } + if (_entryData->_token.expired()) { + SetTokenWarning( + true, + obs_module_text( + "AdvSceneSwitcher.twitchToken.noSelection")); + return; + } + if (!TokenIsValid(_entryData->_token)) { + SetTokenWarning( + true, obs_module_text( + "AdvSceneSwitcher.twitchToken.notValid")); + return; + } + if (!_entryData->ActionIsSupportedByToken()) { + SetTokenWarning( + true, + obs_module_text( + "AdvSceneSwitcher.twitchToken.permissionsInsufficient")); + return; + } + SetTokenWarning(false); +} + void MacroActionTwitchEdit::StreamTitleChanged() { if (_loading || !_entryData) { @@ -649,8 +676,8 @@ void MacroActionTwitchEdit::SetWidgetSignalConnections() SLOT(ActionChanged(int))); QWidget::connect(_tokens, SIGNAL(SelectionChanged(const QString &)), this, SLOT(TwitchTokenChanged(const QString &))); - QWidget::connect(&_tokenPermissionCheckTimer, SIGNAL(timeout()), this, - SLOT(CheckTokenPermissions())); + QWidget::connect(&_tokenCheckTimer, SIGNAL(timeout()), this, + SLOT(CheckToken())); QWidget::connect(_streamTitle, SIGNAL(editingFinished()), this, SLOT(StreamTitleChanged())); QWidget::connect(_category, @@ -710,8 +737,7 @@ void MacroActionTwitchEdit::SetWidgetVisibility() AddStretchIfNecessary(_layout); } - _tokenPermissionWarning->setVisible( - !_entryData->ActionIsSupportedByToken()); + CheckToken(); adjustSize(); updateGeometry(); diff --git a/plugins/twitch/macro-action-twitch.hpp b/plugins/twitch/macro-action-twitch.hpp index e1c6c90e..7f7ff468 100644 --- a/plugins/twitch/macro-action-twitch.hpp +++ b/plugins/twitch/macro-action-twitch.hpp @@ -206,7 +206,7 @@ public: private slots: void ActionChanged(int); void TwitchTokenChanged(const QString &); - void CheckTokenPermissions(); + void CheckToken(); void StreamTitleChanged(); void CategoreyChanged(const TwitchCategory &); void MarkerDescriptionChanged(); @@ -228,12 +228,13 @@ private: void SetWidgetSignalConnections(); void SetWidgetLayout(); void SetWidgetVisibility(); + void SetTokenWarning(bool visible, const QString &text = ""); QHBoxLayout *_layout; FilterComboBox *_actions; TwitchConnectionSelection *_tokens; - QLabel *_tokenPermissionWarning; - QTimer _tokenPermissionCheckTimer; + QLabel *_tokenWarning; + QTimer _tokenCheckTimer; VariableLineEdit *_streamTitle; TwitchCategoryWidget *_category; VariableLineEdit *_markerDescription; diff --git a/plugins/twitch/macro-condition-twitch.cpp b/plugins/twitch/macro-condition-twitch.cpp index 12d3b2d4..708b157d 100644 --- a/plugins/twitch/macro-condition-twitch.cpp +++ b/plugins/twitch/macro-condition-twitch.cpp @@ -1194,8 +1194,7 @@ MacroConditionTwitchEdit::MacroConditionTwitchEdit( _layout(new QHBoxLayout()), _conditions(new FilterComboBox()), _tokens(new TwitchConnectionSelection()), - _tokenPermissionWarning(new QLabel(obs_module_text( - "AdvSceneSwitcher.twitchToken.permissionsInsufficient"))), + _tokenWarning(new QLabel()), _channel(new TwitchChannelSelection(this)), _pointsReward(new TwitchPointsRewardWidget(this)), _streamTitle(new VariableLineEdit(this)), @@ -1214,8 +1213,8 @@ MacroConditionTwitchEdit::MacroConditionTwitchEdit( SLOT(ConditionChanged(int))); QWidget::connect(_tokens, SIGNAL(SelectionChanged(const QString &)), this, SLOT(TwitchTokenChanged(const QString &))); - QWidget::connect(&_tokenPermissionCheckTimer, SIGNAL(timeout()), this, - SLOT(CheckTokenPermissions())); + QWidget::connect(&_tokenCheckTimer, SIGNAL(timeout()), this, + SLOT(CheckToken())); QWidget::connect(_channel, SIGNAL(ChannelChanged(const TwitchChannel &)), this, SLOT(ChannelChanged(const TwitchChannel &))); @@ -1262,10 +1261,10 @@ MacroConditionTwitchEdit::MacroConditionTwitchEdit( chatLayout->addWidget(_regexChat); mainLayout->addLayout(chatLayout); mainLayout->addLayout(accountLayout); - mainLayout->addWidget(_tokenPermissionWarning); + mainLayout->addWidget(_tokenWarning); setLayout(mainLayout); - _tokenPermissionCheckTimer.start(1000); + _tokenCheckTimer.start(1000); _entryData = entryData; UpdateEntryData(); @@ -1309,14 +1308,43 @@ void MacroConditionTwitchEdit::TwitchTokenChanged(const QString &token) emit(HeaderInfoChanged(token)); } -void MacroConditionTwitchEdit::CheckTokenPermissions() +void MacroConditionTwitchEdit::SetTokenWarning(bool visible, + const QString &text) { - _tokenPermissionWarning->setVisible( - _entryData && !_entryData->ConditionIsSupportedByToken()); + _tokenWarning->setText(text); + _tokenWarning->setVisible(visible); adjustSize(); updateGeometry(); } +void MacroConditionTwitchEdit::CheckToken() +{ + if (!_entryData) { + return; + } + if (_entryData->_token.expired()) { + SetTokenWarning( + true, + obs_module_text( + "AdvSceneSwitcher.twitchToken.noSelection")); + return; + } + if (!TokenIsValid(_entryData->_token)) { + SetTokenWarning( + true, obs_module_text( + "AdvSceneSwitcher.twitchToken.notValid")); + return; + } + if (!_entryData->ConditionIsSupportedByToken()) { + SetTokenWarning( + true, + obs_module_text( + "AdvSceneSwitcher.twitchToken.permissionsInsufficient")); + return; + } + SetTokenWarning(false); +} + void MacroConditionTwitchEdit::ChannelChanged(const TwitchChannel &channel) { if (_loading || !_entryData) { @@ -1428,8 +1456,7 @@ void MacroConditionTwitchEdit::SetWidgetVisibility() AddStretchIfNecessary(_layout); } - _tokenPermissionWarning->setVisible( - !_entryData->ConditionIsSupportedByToken()); + CheckToken(); adjustSize(); updateGeometry(); diff --git a/plugins/twitch/macro-condition-twitch.hpp b/plugins/twitch/macro-condition-twitch.hpp index e08eeb69..d141130f 100644 --- a/plugins/twitch/macro-condition-twitch.hpp +++ b/plugins/twitch/macro-condition-twitch.hpp @@ -151,7 +151,7 @@ public: private slots: void ConditionChanged(int); void TwitchTokenChanged(const QString &); - void CheckTokenPermissions(); + void CheckToken(); void ChannelChanged(const TwitchChannel &); void PointsRewardChanged(const TwitchPointsReward &); void StreamTitleChanged(); @@ -169,12 +169,13 @@ protected: private: void SetWidgetVisibility(); + void SetTokenWarning(bool visible, const QString &text = ""); QHBoxLayout *_layout; FilterComboBox *_conditions; TwitchConnectionSelection *_tokens; - QLabel *_tokenPermissionWarning; - QTimer _tokenPermissionCheckTimer; + QLabel *_tokenWarning; + QTimer _tokenCheckTimer; TwitchChannelSelection *_channel; TwitchPointsRewardWidget *_pointsReward; VariableLineEdit *_streamTitle; diff --git a/plugins/twitch/token.cpp b/plugins/twitch/token.cpp index ad05d0b4..b1dc2de4 100644 --- a/plugins/twitch/token.cpp +++ b/plugins/twitch/token.cpp @@ -342,6 +342,15 @@ std::string GetWeakTwitchTokenName(std::weak_ptr token) return con->Name(); } +bool TokenIsValid(const std::weak_ptr &token_) +{ + auto token = token_.lock(); + if (!token) { + return false; + } + return token->IsValid(); +} + static bool ConnectionNameAvailable(const QString &name) { return !GetTwitchTokenByName(name); diff --git a/plugins/twitch/token.hpp b/plugins/twitch/token.hpp index 1e3236ef..5def02c5 100644 --- a/plugins/twitch/token.hpp +++ b/plugins/twitch/token.hpp @@ -151,6 +151,7 @@ TwitchToken *GetTwitchTokenByName(const std::string &); std::weak_ptr GetWeakTwitchTokenByName(const std::string &name); std::weak_ptr GetWeakTwitchTokenByQString(const QString &name); std::string GetWeakTwitchTokenName(std::weak_ptr); +bool TokenIsValid(const std::weak_ptr &token); } // namespace advss