Add option to start a channel raid

This commit is contained in:
WarmUpTill 2023-10-08 00:14:51 +02:00 committed by WarmUpTill
parent 37ba7aa2ca
commit 1e9173699c
5 changed files with 58 additions and 20 deletions

View File

@ -790,8 +790,9 @@ AdvSceneSwitcher.action.twitch.type.commercial="Start commercial with duration"
AdvSceneSwitcher.action.twitch.type.announcement="Send chat announcement"
AdvSceneSwitcher.action.twitch.type.emoteOnlyEnable="Enable chat's emote-only mode"
AdvSceneSwitcher.action.twitch.type.emoteOnlyDisable="Disable chat's emote-only mode"
AdvSceneSwitcher.action.twitch.type.raid="Raid channel"
AdvSceneSwitcher.action.twitch.categorySelectionDisabled="Cannot select category without selecting a Twitch account first!"
AdvSceneSwitcher.action.twitch.entry.line1="On{{account}}{{actions}}{{streamTitle}}{{category}}{{manualCategorySearch}}{{markerDescription}}{{clipHasDelay}}{{duration}}{{announcementColor}}"
AdvSceneSwitcher.action.twitch.entry.line1="On{{account}}{{actions}}{{streamTitle}}{{category}}{{manualCategorySearch}}{{markerDescription}}{{clipHasDelay}}{{duration}}{{announcementColor}}{{channel}}"
AdvSceneSwitcher.action.twitch.tokenPermissionsInsufficient="Permissions of selected token are insufficient to perform selected action!"
AdvSceneSwitcher.action.twitch.title.title="Enter title"
AdvSceneSwitcher.action.twitch.marker.description="Describe marker"
@ -961,6 +962,9 @@ AdvSceneSwitcher.twitchToken.channel.startCommercial="Run commercials on a chann
AdvSceneSwitcher.twitchToken.clips.edit="Create clips from channel's broadcasts."
AdvSceneSwitcher.twitchToken.moderator.manageAnnouncements="Manage channel's chat announcements."
AdvSceneSwitcher.twitchToken.moderator.manageChatSettings="Manage channel's chat settings, such as emote-only or slow mode."
AdvSceneSwitcher.twitchToken.channel.raid="Manage a channel raiding another channel."
AdvSceneSwitcher.channel.open="Show channel"
AdvSceneSwitcher.twitchCategories.fetchStart="Fetching stream categories ..."
AdvSceneSwitcher.twitchCategories.fetchStatus="Got %1 stream categories."

View File

@ -739,15 +739,9 @@ AdvSceneSwitcher.action.sceneLock.entry="Sur{{scenes}}{{actions}}{{sources}}"
AdvSceneSwitcher.action.twitch="Twitch"
AdvSceneSwitcher.action.twitch.type.title="Définir le titre du flux"
AdvSceneSwitcher.action.twitch.type.category="Définir la catégorie du flux"
AdvSceneSwitcher.action.twitch.type.marker="Create stream marker"
AdvSceneSwitcher.action.twitch.type.clip="Create stream clip"
AdvSceneSwitcher.action.twitch.type.commercial="Démarrer une publicité d'une durée de"
AdvSceneSwitcher.action.twitch.categorySelectionDisabled="Impossible de sélectionner une catégorie sans avoir d'abord sélectionné un compte Twitch !"
AdvSceneSwitcher.action.twitch.entry.line1="Sur{{account}}{{actions}}{{streamTitle}}{{category}}{{manualCategorySearch}}{{markerDescription}}{{clipHasDelay}}{{duration}}{{announcementMessage}}{{announcementColor}}"
AdvSceneSwitcher.action.twitch.tokenPermissionsInsufficient="Permissions of selected token are insufficient to perform selected action!"
AdvSceneSwitcher.action.twitch.clip.hasDelay="Add a slight delay before capturing the clip"
AdvSceneSwitcher.action.twitch.marker.description="Describe marker"
AdvSceneSwitcher.action.twitch.title.title="Enter title"
AdvSceneSwitcher.action.twitch.entry.line1="Sur{{account}}{{actions}}{{streamTitle}}{{category}}{{manualCategorySearch}}{{markerDescription}}{{clipHasDelay}}{{duration}}{{announcementMessage}}{{announcementColor}}{{channel}}"
; Transition Tab
AdvSceneSwitcher.transitionTab.title="Transition"

View File

@ -30,6 +30,8 @@ const static std::map<MacroActionTwitch::Action, std::string> actionTypes = {
"AdvSceneSwitcher.action.twitch.type.emoteOnlyEnable"},
{MacroActionTwitch::Action::DISABLE_EMOTE_ONLY,
"AdvSceneSwitcher.action.twitch.type.emoteOnlyDisable"},
{MacroActionTwitch::Action::RAID,
"AdvSceneSwitcher.action.twitch.type.raid"},
};
const static std::map<MacroActionTwitch::AnnouncementColor, std::string>
@ -200,6 +202,20 @@ void MacroActionTwitch::SetChatEmoteOnlyMode(
}
}
void MacroActionTwitch::StartRaid(const std::shared_ptr<TwitchToken> &token)
{
OBSDataAutoRelease data = obs_data_create();
obs_data_set_string(data, "from_broadcaster_id",
token->GetUserID().c_str());
obs_data_set_string(data, "to_broadcaster_id",
_channel.GetUserID(*token).c_str());
auto result = SendPostRequest("https://api.twitch.tv", "/helix/raids",
*token, data.Get());
if (result.status != 200) {
blog(LOG_INFO, "Failed to start raid! (%d)\n", result.status);
}
}
bool MacroActionTwitch::PerformAction()
{
auto token = _token.lock();
@ -231,6 +247,8 @@ bool MacroActionTwitch::PerformAction()
break;
case MacroActionTwitch::Action::DISABLE_EMOTE_ONLY:
SetChatEmoteOnlyMode(token, false);
case MacroActionTwitch::Action::RAID:
StartRaid(token);
break;
default:
break;
@ -266,6 +284,7 @@ bool MacroActionTwitch::Save(obs_data_t *obj) const
_announcementMessage.Save(obj, "announcementMessage");
obs_data_set_int(obj, "announcementColor",
static_cast<int>(_announcementColor));
_channel.Save(obj);
return true;
}
@ -282,6 +301,7 @@ bool MacroActionTwitch::Load(obs_data_t *obj)
_announcementMessage.Load(obj, "announcementMessage");
_announcementColor = static_cast<AnnouncementColor>(
obs_data_get_int(obj, "announcementColor"));
_channel.Load(obj);
return true;
}
@ -302,6 +322,7 @@ bool MacroActionTwitch::ActionIsSupportedByToken()
{Action::ENABLE_EMOTE_ONLY, {"moderator:manage:chat_settings"}},
{Action::DISABLE_EMOTE_ONLY,
{"moderator:manage:chat_settings"}},
{Action::RAID, {"channel:manage:raids"}},
};
auto token = _token.lock();
if (!token) {
@ -342,7 +363,8 @@ MacroActionTwitchEdit::MacroActionTwitchEdit(
"AdvSceneSwitcher.action.twitch.clip.hasDelay"))),
_duration(new DurationSelection(this, false, 0)),
_announcementMessage(new VariableTextEdit(this)),
_announcementColor(new QComboBox(this))
_announcementColor(new QComboBox(this)),
_channel(new TwitchChannelSelection(this))
{
_streamTitle->setSizePolicy(QSizePolicy::MinimumExpanding,
QSizePolicy::Preferred);
@ -382,6 +404,11 @@ MacroActionTwitchEdit::MacroActionTwitchEdit(
SLOT(AnnouncementMessageChanged()));
QWidget::connect(_announcementColor, SIGNAL(currentIndexChanged(int)),
this, SLOT(AnnouncementColorChanged(int)));
QWidget::connect(_channel,
SIGNAL(ChannelChanged(const TwitchChannel &)), this,
SLOT(ChannelChanged(const TwitchChannel &)));
QWidget::connect(&_tokenPermissionCheckTimer, SIGNAL(timeout()), this,
SLOT(CheckTokenPermissions()));
PlaceWidgets(
obs_module_text("AdvSceneSwitcher.action.twitch.entry.line1"),
@ -394,7 +421,8 @@ MacroActionTwitchEdit::MacroActionTwitchEdit(
{"{{markerDescription}}", _markerDescription},
{"{{clipHasDelay}}", _clipHasDelay},
{"{{duration}}", _duration},
{"{{announcementColor}}", _announcementColor}});
{"{{announcementColor}}", _announcementColor},
{"{{channel}}", _channel}});
_layout->setContentsMargins(0, 0, 0, 0);
auto mainLayout = new QVBoxLayout();
@ -527,6 +555,8 @@ void MacroActionTwitchEdit::SetupWidgetVisibility()
_announcementColor->setVisible(_entryData->_action ==
MacroActionTwitch::Action::ANNOUNCEMENT);
_channel->setVisible(_entryData->_action ==
MacroActionTwitch::Action::RAID);
if (_entryData->_action == MacroActionTwitch::Action::TITLE ||
_entryData->_action == MacroActionTwitch::Action::MARKER) {
RemoveStretchIfPresent(_layout);
@ -541,6 +571,16 @@ void MacroActionTwitchEdit::SetupWidgetVisibility()
updateGeometry();
}
void MacroActionTwitchEdit::ChannelChanged(const TwitchChannel &channel)
{
if (_loading || !_entryData) {
return;
}
auto lock = LockContext();
_entryData->_channel = channel;
}
void MacroActionTwitchEdit::UpdateEntryData()
{
if (!_entryData) {
@ -560,6 +600,7 @@ void MacroActionTwitchEdit::UpdateEntryData()
_announcementColor->setCurrentIndex(
static_cast<int>(_entryData->_announcementColor));
_channel->SetChannel(_entryData->_channel);
SetupWidgetVisibility();
}

View File

@ -2,6 +2,7 @@
#include "macro-action-edit.hpp"
#include "token.hpp"
#include "category-selection.hpp"
#include "channel-selection.hpp"
#include <variable-line-edit.hpp>
#include <variable-text-edit.hpp>
@ -33,6 +34,7 @@ public:
ANNOUNCEMENT,
ENABLE_EMOTE_ONLY,
DISABLE_EMOTE_ONLY,
RAID,
};
enum class AnnouncementColor {
@ -55,6 +57,7 @@ public:
StringVariable _announcementMessage = obs_module_text(
"AdvSceneSwitcher.action.twitch.announcement.message");
AnnouncementColor _announcementColor = AnnouncementColor::PRIMARY;
TwitchChannel _channel;
private:
void SetStreamTitle(const std::shared_ptr<TwitchToken> &) const;
@ -65,6 +68,7 @@ private:
void SendChatAnnouncement(const std::shared_ptr<TwitchToken> &) const;
void SetChatEmoteOnlyMode(const std::shared_ptr<TwitchToken> &,
bool enable) const;
void StartRaid(const std::shared_ptr<TwitchToken> &);
static bool _registered;
static const std::string id;
@ -97,6 +101,7 @@ private slots:
void DurationChanged(const Duration &);
void AnnouncementMessageChanged();
void AnnouncementColorChanged(int index);
void ChannelChanged(const TwitchChannel &);
signals:
void HeaderInfoChanged(const QString &);
@ -121,6 +126,7 @@ private:
DurationSelection *_duration;
VariableTextEdit *_announcementMessage;
QComboBox *_announcementColor;
TwitchChannelSelection *_channel;
bool _loading = true;
};

View File

@ -11,15 +11,6 @@ namespace advss {
static std::deque<std::shared_ptr<Item>> twitchTokens;
const std::unordered_map<std::string, std::string> TokenOption::apiIdToLocale{
// Add necessary token permissions here
/*
{"analytics:read:extensions",
"AdvSceneSwitcher.twitchToken.analytics.readExtensions"},
{"analytics:read:games",
"AdvSceneSwitcher.twitchToken.analytics.readGames"},
{"bits:read", "AdvSceneSwitcher.twitchToken.bits.read"},
*/
{"channel:manage:broadcast",
"AdvSceneSwitcher.twitchToken.channel.manageBroadcast"},
{"clips:edit", "AdvSceneSwitcher.twitchToken.clips.edit"},
@ -28,7 +19,9 @@ const std::unordered_map<std::string, std::string> TokenOption::apiIdToLocale{
{"moderator:manage:announcements",
"AdvSceneSwitcher.twitchToken.moderator.manageAnnouncements"},
{"moderator:manage:chat_settings",
"AdvSceneSwitcher.twitchToken.moderator.manageChatSettings"}};
"AdvSceneSwitcher.twitchToken.moderator.manageChatSettings"},
{"channel:manage:raids", "AdvSceneSwitcher.twitchToken.channel.raid"},
};
static void saveConnections(obs_data_t *obj);
static void loadConnections(obs_data_t *obj);