diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 24714702..f2439121 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -852,15 +852,15 @@ AdvSceneSwitcher.action.sceneLock.type.unlock="unlock" AdvSceneSwitcher.action.sceneLock.type.toggle="toggle lock of" AdvSceneSwitcher.action.sceneLock.entry="On{{scenes}}{{actions}}{{sources}}" AdvSceneSwitcher.action.twitch="Twitch" -AdvSceneSwitcher.action.twitch.type.title="Set stream title" -AdvSceneSwitcher.action.twitch.type.category="Set stream category" -AdvSceneSwitcher.action.twitch.type.marker="Create stream marker" -AdvSceneSwitcher.action.twitch.type.clip="Create stream clip" -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.type.channel.info.title.set="Set stream title" +AdvSceneSwitcher.action.twitch.type.channel.info.category.set="Set stream category" +AdvSceneSwitcher.action.twitch.type.raid.start="Start raid" +AdvSceneSwitcher.action.twitch.type.commercial.start="Start commercial" +AdvSceneSwitcher.action.twitch.type.marker.create="Create stream marker" +AdvSceneSwitcher.action.twitch.type.clip.create="Create stream clip" +AdvSceneSwitcher.action.twitch.type.chat.announcement.send="Send chat announcement" +AdvSceneSwitcher.action.twitch.type.chat.emoteOnly.enable="Enable chat's emote-only mode" +AdvSceneSwitcher.action.twitch.type.chat.emoteOnly.disable="Disable chat's emote-only mode" AdvSceneSwitcher.action.twitch.type.sendChatMessage="Send chat message" AdvSceneSwitcher.action.twitch.categorySelectionDisabled="Cannot select category without selecting a Twitch account first!" AdvSceneSwitcher.action.twitch.entry.default="On{{account}}{{actions}}{{streamTitle}}{{category}}{{markerDescription}}{{clipHasDelay}}{{duration}}{{announcementColor}}{{channel}}" diff --git a/data/locale/fr-FR.ini b/data/locale/fr-FR.ini index 57aecd93..c5da6be5 100644 --- a/data/locale/fr-FR.ini +++ b/data/locale/fr-FR.ini @@ -736,9 +736,9 @@ AdvSceneSwitcher.action.sceneLock.type.unlock="déverrouiller" AdvSceneSwitcher.action.sceneLock.type.toggle="basculer le verrouillage de" 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.commercial="Démarrer une publicité d'une durée de" +AdvSceneSwitcher.action.twitch.type.channel.info.title.set="Définir le titre du flux" +AdvSceneSwitcher.action.twitch.type.channel.info.category.set="Définir la catégorie du flux" +AdvSceneSwitcher.action.twitch.type.commercial.start="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}}{{markerDescription}}{{clipHasDelay}}{{duration}}{{announcementColor}}{{channel}}" diff --git a/src/macro-external/twitch/macro-action-twitch.cpp b/src/macro-external/twitch/macro-action-twitch.cpp index 825ab99f..114aba86 100644 --- a/src/macro-external/twitch/macro-action-twitch.cpp +++ b/src/macro-external/twitch/macro-action-twitch.cpp @@ -19,24 +19,24 @@ std::string MacroActionTwitch::GetShortDesc() const } const static std::map actionTypes = { - {MacroActionTwitch::Action::TITLE, - "AdvSceneSwitcher.action.twitch.type.title"}, - {MacroActionTwitch::Action::CATEGORY, - "AdvSceneSwitcher.action.twitch.type.category"}, - {MacroActionTwitch::Action::MARKER, - "AdvSceneSwitcher.action.twitch.type.marker"}, - {MacroActionTwitch::Action::CLIP, - "AdvSceneSwitcher.action.twitch.type.clip"}, - {MacroActionTwitch::Action::COMMERCIAL, - "AdvSceneSwitcher.action.twitch.type.commercial"}, - {MacroActionTwitch::Action::ANNOUNCEMENT, - "AdvSceneSwitcher.action.twitch.type.announcement"}, - {MacroActionTwitch::Action::ENABLE_EMOTE_ONLY, - "AdvSceneSwitcher.action.twitch.type.emoteOnlyEnable"}, - {MacroActionTwitch::Action::DISABLE_EMOTE_ONLY, - "AdvSceneSwitcher.action.twitch.type.emoteOnlyDisable"}, - {MacroActionTwitch::Action::RAID, - "AdvSceneSwitcher.action.twitch.type.raid"}, + {MacroActionTwitch::Action::CHANNEL_INFO_TITLE_SET, + "AdvSceneSwitcher.action.twitch.type.channel.info.title.set"}, + {MacroActionTwitch::Action::CHANNEL_INFO_CATEGORY_SET, + "AdvSceneSwitcher.action.twitch.type.channel.info.category.set"}, + {MacroActionTwitch::Action::RAID_START, + "AdvSceneSwitcher.action.twitch.type.raid.start"}, + {MacroActionTwitch::Action::COMMERCIAL_START, + "AdvSceneSwitcher.action.twitch.type.commercial.start"}, + {MacroActionTwitch::Action::MARKER_CREATE, + "AdvSceneSwitcher.action.twitch.type.marker.create"}, + {MacroActionTwitch::Action::CLIP_CREATE, + "AdvSceneSwitcher.action.twitch.type.clip.create"}, + {MacroActionTwitch::Action::CHAT_ANNOUNCEMENT_SEND, + "AdvSceneSwitcher.action.twitch.type.chat.announcement.send"}, + {MacroActionTwitch::Action::CHAT_EMOTE_ONLY_ENABLE, + "AdvSceneSwitcher.action.twitch.type.chat.emoteOnly.enable"}, + {MacroActionTwitch::Action::CHAT_EMOTE_ONLY_DISABLE, + "AdvSceneSwitcher.action.twitch.type.chat.emoteOnly.disable"}, {MacroActionTwitch::Action::SEND_CHAT_MESSAGE, "AdvSceneSwitcher.action.twitch.type.sendChatMessage"}, }; @@ -64,6 +64,12 @@ const static std::map {MacroActionTwitch::AnnouncementColor::PURPLE, "purple"}, }; +const static std::map + redemptionStatusesTwitch = { + {MacroActionTwitch::RedemptionStatus::CANCELED, "CANCELED"}, + {MacroActionTwitch::RedemptionStatus::FULFILLED, "FULFILLED"}, +}; + void MacroActionTwitch::SetStreamTitle( const std::shared_ptr &token) const { @@ -239,33 +245,32 @@ bool MacroActionTwitch::PerformAction() } switch (_action) { - case MacroActionTwitch::Action::TITLE: + case Action::CHANNEL_INFO_TITLE_SET: SetStreamTitle(token); break; - case MacroActionTwitch::Action::CATEGORY: + case Action::CHANNEL_INFO_CATEGORY_SET: SetStreamCategory(token); break; - case MacroActionTwitch::Action::MARKER: - CreateStreamMarker(token); - break; - case MacroActionTwitch::Action::CLIP: - CreateStreamClip(token); - break; - case MacroActionTwitch::Action::COMMERCIAL: - StartCommercial(token); - break; - case MacroActionTwitch::Action::ANNOUNCEMENT: - SendChatAnnouncement(token); - break; - case MacroActionTwitch::Action::ENABLE_EMOTE_ONLY: - SetChatEmoteOnlyMode(token, true); - break; - case MacroActionTwitch::Action::DISABLE_EMOTE_ONLY: - SetChatEmoteOnlyMode(token, false); - break; - case MacroActionTwitch::Action::RAID: + case Action::RAID_START: StartRaid(token); break; + case Action::COMMERCIAL_START: + StartCommercial(token); + break; + case Action::MARKER_CREATE: + CreateStreamMarker(token); + break; + case Action::CLIP_CREATE: + CreateStreamClip(token); + break; + case Action::CHAT_ANNOUNCEMENT_SEND: + SendChatAnnouncement(token); + break; + case Action::CHAT_EMOTE_ONLY_ENABLE: + SetChatEmoteOnlyMode(token, true); + break; + case Action::CHAT_EMOTE_ONLY_DISABLE: + SetChatEmoteOnlyMode(token, false); case MacroActionTwitch::Action::SEND_CHAT_MESSAGE: SendChatMessage(token); break; @@ -334,27 +339,111 @@ bool MacroActionTwitch::Load(obs_data_t *obj) bool MacroActionTwitch::ActionIsSupportedByToken() { static const std::unordered_map requiredOption = { - {Action::TITLE, {"channel:manage:broadcast"}}, - {Action::CATEGORY, {"channel:manage:broadcast"}}, - {Action::MARKER, {"channel:manage:broadcast"}}, - {Action::CLIP, {"clips:edit"}}, - {Action::COMMERCIAL, {"channel:edit:commercial"}}, - {Action::ANNOUNCEMENT, {"moderator:manage:announcements"}}, - {Action::ENABLE_EMOTE_ONLY, {"moderator:manage:chat_settings"}}, - {Action::DISABLE_EMOTE_ONLY, + {Action::CHANNEL_INFO_TITLE_SET, {"channel:manage:broadcast"}}, + {Action::CHANNEL_INFO_CATEGORY_SET, + {"channel:manage:broadcast"}}, + {Action::CHANNEL_INFO_LANGUAGE_SET, + {"channel:manage:broadcast"}}, + {Action::CHANNEL_INFO_DELAY_SET, {"channel:manage:broadcast"}}, + {Action::CHANNEL_INFO_BRANDED_CONTENT_ENABLE, + {"channel:manage:broadcast"}}, + {Action::CHANNEL_INFO_BRANDED_CONTENT_DISABLE, + {"channel:manage:broadcast"}}, + {Action::RAID_START, {"channel:manage:raids"}}, + {Action::RAID_END, {"channel:manage:raids"}}, + {Action::SHOUTOUT_SEND, {"moderator:manage:shoutouts"}}, + {Action::POLL_END, {"channel:manage:polls"}}, + {Action::PREDICTION_END, {"channel:manage:predictions"}}, + {Action::SHIELD_MODE_START, {"moderator:manage:shield_mode"}}, + {Action::SHIELD_MODE_END, {"moderator:manage:shield_mode"}}, + {Action::POINTS_REWARD_ENABLE, {"channel:manage:redemptions"}}, + {Action::POINTS_REWARD_DISABLE, {"channel:manage:redemptions"}}, + {Action::POINTS_REWARD_PAUSE, {"channel:manage:redemptions"}}, + {Action::POINTS_REWARD_UNPAUSE, {"channel:manage:redemptions"}}, + {Action::POINTS_REWARD_TITLE_SET, + {"channel:manage:redemptions"}}, + {Action::POINTS_REWARD_PROMPT_SET, + {"channel:manage:redemptions"}}, + {Action::POINTS_REWARD_COST_SET, + {"channel:manage:redemptions"}}, + {Action::POINTS_REWARD_USER_INPUT_REQUIRE, + {"channel:manage:redemptions"}}, + {Action::POINTS_REWARD_USER_INPUT_UNREQUIRE, + {"channel:manage:redemptions"}}, + {Action::POINTS_REWARD_COOLDOWN_ENABLE, + {"channel:manage:redemptions"}}, + {Action::POINTS_REWARD_COOLDOWN_DISABLE, + {"channel:manage:redemptions"}}, + {Action::POINTS_REWARD_QUEUE_SKIP_ENABLE, + {"channel:manage:redemptions"}}, + {Action::POINTS_REWARD_QUEUE_SKIP_DISABLE, + {"channel:manage:redemptions"}}, + {Action::POINTS_REWARD_MAX_PER_STREAM_ENABLE, + {"channel:manage:redemptions"}}, + {Action::POINTS_REWARD_MAX_PER_STREAM_DISABLE, + {"channel:manage:redemptions"}}, + {Action::POINTS_REWARD_MAX_PER_USER_ENABLE, + {"channel:manage:redemptions"}}, + {Action::POINTS_REWARD_MAX_PER_USER_DISABLE, + {"channel:manage:redemptions"}}, + {Action::POINTS_REWARD_DELETE, {"channel:manage:redemptions"}}, + {Action::POINTS_REWARD_REDEMPTION_CANCEL, + {"channel:manage:redemptions"}}, + {Action::POINTS_REWARD_REDEMPTION_FULFILL, + {"channel:manage:redemptions"}}, + {Action::USER_BAN, {"moderator:manage:banned_users"}}, + {Action::USER_UNBAN, {"moderator:manage:banned_users"}}, + {Action::USER_BLOCK, {"user:manage:blocked_users"}}, + {Action::USER_UNBLOCK, {"user:manage:blocked_users"}}, + {Action::USER_MODERATOR_ADD, {"channel:manage:moderators"}}, + {Action::USER_MODERATOR_DELETE, {"channel:manage:moderators"}}, + {Action::USER_VIP_ADD, {"channel:manage:vips"}}, + {Action::USER_VIP_DELETE, {"channel:manage:vips"}}, + {Action::COMMERCIAL_START, {"channel:edit:commercial"}}, + {Action::COMMERCIAL_SNOOZE, {"channel:manage:ads"}}, + {Action::MARKER_CREATE, {"channel:manage:broadcast"}}, + {Action::CLIP_CREATE, {"clips:edit"}}, + {Action::CHAT_ANNOUNCEMENT_SEND, + {"moderator:manage:announcements"}}, + {Action::CHAT_EMOTE_ONLY_ENABLE, {"moderator:manage:chat_settings"}}, - {Action::RAID, {"channel:manage:raids"}}, + {Action::CHAT_EMOTE_ONLY_DISABLE, + {"moderator:manage:chat_settings"}}, + {Action::CHAT_FOLLOWER_ONLY_ENABLE, + {"moderator:manage:chat_settings"}}, + {Action::CHAT_FOLLOWER_ONLY_DISABLE, + {"moderator:manage:chat_settings"}}, + {Action::CHAT_SUBSCRIBER_ONLY_ENABLE, + {"moderator:manage:chat_settings"}}, + {Action::CHAT_SUBSCRIBER_ONLY_DISABLE, + {"moderator:manage:chat_settings"}}, + {Action::CHAT_SLOW_MODE_ENABLE, + {"moderator:manage:chat_settings"}}, + {Action::CHAT_SLOW_MODE_DISABLE, + {"moderator:manage:chat_settings"}}, + {Action::CHAT_NON_MODERATOR_DELAY_ENABLE, + {"moderator:manage:chat_settings"}}, + {Action::CHAT_NON_MODERATOR_DELAY_DISABLE, + {"moderator:manage:chat_settings"}}, + {Action::CHAT_UNIQUE_MODE_ENABLE, + {"moderator:manage:chat_settings"}}, + {Action::CHAT_UNIQUE_MODE_DISABLE, + {"moderator:manage:chat_settings"}}, + {Action::WHISPER_SEND, {"user:manage:whispers"}}, {Action::SEND_CHAT_MESSAGE, {"chat:edit"}}, }; + auto token = _token.lock(); if (!token) { return false; } + auto option = requiredOption.find(_action); assert(option != requiredOption.end()); if (option == requiredOption.end()) { return false; } + return token->OptionIsEnabled(option->second); } @@ -397,49 +486,8 @@ MacroActionTwitchEdit::MacroActionTwitchEdit( _channel(new TwitchChannelSelection(this)), _chatMessage(new VariableTextEdit(this)) { - _streamTitle->setSizePolicy(QSizePolicy::MinimumExpanding, - QSizePolicy::Preferred); - _streamTitle->setMaxLength(140); - _markerDescription->setSizePolicy(QSizePolicy::MinimumExpanding, - QSizePolicy::Preferred); - _markerDescription->setMaxLength(140); - _announcementMessage->setSizePolicy(QSizePolicy::MinimumExpanding, - QSizePolicy::Preferred); - _announcementMessage->setMaxLength(500); - - auto spinBox = _duration->SpinBox(); - spinBox->setSuffix("s"); - spinBox->setMaximum(180); - - populateActionSelection(_actions); - populateAnnouncementColorSelection(_announcementColor); - - QWidget::connect(_actions, SIGNAL(currentIndexChanged(int)), this, - 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(_streamTitle, SIGNAL(editingFinished()), this, - SLOT(StreamTitleChanged())); - QWidget::connect(_category, - SIGNAL(CategoreyChanged(const TwitchCategory &)), this, - SLOT(CategoreyChanged(const TwitchCategory &))); - QWidget::connect(_markerDescription, SIGNAL(editingFinished()), this, - SLOT(MarkerDescriptionChanged())); - QObject::connect(_clipHasDelay, SIGNAL(stateChanged(int)), this, - SLOT(ClipHasDelayChanged(int))); - QObject::connect(_duration, SIGNAL(DurationChanged(const Duration &)), - this, SLOT(DurationChanged(const Duration &))); - QWidget::connect(_announcementMessage, SIGNAL(textChanged()), this, - 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(_chatMessage, SIGNAL(textChanged()), this, - SLOT(ChatMessageChanged())); + SetWidgetProperties(); + SetWidgetSignalConnections(); _entryData = entryData; SetWidgetLayout(); @@ -473,8 +521,8 @@ void MacroActionTwitchEdit::ActionChanged(int idx) auto lock = LockContext(); _entryData->_action = static_cast( _actions->itemData(idx).toInt()); - SetWidgetVisibility(); SetWidgetLayout(); + SetWidgetVisibility(); } void MacroActionTwitchEdit::TwitchTokenChanged(const QString &token) @@ -576,30 +624,86 @@ void MacroActionTwitchEdit::AnnouncementColorChanged(int index) static_cast(index); } +void MacroActionTwitchEdit::SetWidgetProperties() +{ + _streamTitle->setSizePolicy(QSizePolicy::MinimumExpanding, + QSizePolicy::Preferred); + _streamTitle->setMaxLength(140); + _markerDescription->setSizePolicy(QSizePolicy::MinimumExpanding, + QSizePolicy::Preferred); + _markerDescription->setMaxLength(140); + _announcementMessage->setMaxLength(500); + + auto durationSpinBox = _duration->SpinBox(); + durationSpinBox->setMaximum(180); + durationSpinBox->setSuffix("s"); + + populateActionSelection(_actions); + populateAnnouncementColorSelection(_announcementColor); +} + +void MacroActionTwitchEdit::SetWidgetSignalConnections() +{ + QWidget::connect(_actions, SIGNAL(currentIndexChanged(int)), this, + 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(_streamTitle, SIGNAL(editingFinished()), this, + SLOT(StreamTitleChanged())); + QWidget::connect(_category, + SIGNAL(CategoreyChanged(const TwitchCategory &)), this, + SLOT(CategoreyChanged(const TwitchCategory &))); + QWidget::connect(_markerDescription, SIGNAL(editingFinished()), this, + SLOT(MarkerDescriptionChanged())); + QObject::connect(_clipHasDelay, SIGNAL(stateChanged(int)), this, + SLOT(ClipHasDelayChanged(int))); + QObject::connect(_duration, SIGNAL(DurationChanged(const Duration &)), + this, SLOT(DurationChanged(const Duration &))); + QWidget::connect(_announcementMessage, SIGNAL(textChanged()), this, + 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(_chatMessage, SIGNAL(textChanged()), this, + SLOT(ChatMessageChanged())); +} + void MacroActionTwitchEdit::SetWidgetVisibility() { - _streamTitle->setVisible(_entryData->_action == - MacroActionTwitch::Action::TITLE); - _category->setVisible(_entryData->_action == - MacroActionTwitch::Action::CATEGORY); - _markerDescription->setVisible(_entryData->_action == - MacroActionTwitch::Action::MARKER); - _clipHasDelay->setVisible(_entryData->_action == - MacroActionTwitch::Action::CLIP); - _duration->setVisible(_entryData->_action == - MacroActionTwitch::Action::COMMERCIAL); - _announcementMessage->setVisible( - _entryData->_action == MacroActionTwitch::Action::ANNOUNCEMENT); - _announcementColor->setVisible(_entryData->_action == - MacroActionTwitch::Action::ANNOUNCEMENT); + _streamTitle->setVisible( + _entryData->_action == + MacroActionTwitch::Action::CHANNEL_INFO_TITLE_SET); + _category->setVisible( + _entryData->_action == + MacroActionTwitch::Action::CHANNEL_INFO_CATEGORY_SET); _channel->setVisible( - _entryData->_action == MacroActionTwitch::Action::RAID || + _entryData->_action == MacroActionTwitch::Action::RAID_START || + _entryData->_action == MacroActionTwitch::Action::RAID_END || _entryData->_action == MacroActionTwitch::Action::SEND_CHAT_MESSAGE); + _duration->setVisible(_entryData->_action == + MacroActionTwitch::Action::COMMERCIAL_START); + _markerDescription->setVisible( + _entryData->_action == + MacroActionTwitch::Action::MARKER_CREATE); + _clipHasDelay->setVisible(_entryData->_action == + MacroActionTwitch::Action::CLIP_CREATE); + _announcementMessage->setVisible( + _entryData->_action == + MacroActionTwitch::Action::CHAT_ANNOUNCEMENT_SEND); + _announcementColor->setVisible( + _entryData->_action == + MacroActionTwitch::Action::CHAT_ANNOUNCEMENT_SEND); _chatMessage->setVisible(_entryData->_action == MacroActionTwitch::Action::SEND_CHAT_MESSAGE); - if (_entryData->_action == MacroActionTwitch::Action::TITLE || - _entryData->_action == MacroActionTwitch::Action::MARKER) { + + if (_entryData->_action == + MacroActionTwitch::Action::CHANNEL_INFO_TITLE_SET || + _entryData->_action == MacroActionTwitch::Action::MARKER_CREATE) { RemoveStretchIfPresent(_layout); } else { AddStretchIfNecessary(_layout); @@ -637,7 +741,7 @@ void MacroActionTwitchEdit::ChatMessageChanged() void MacroActionTwitchEdit::SetWidgetLayout() { - static const std::vector widgets{ + const std::vector widgets{ _tokens, _actions, _streamTitle, _category, _markerDescription, _clipHasDelay, _duration, _announcementColor, _channel}; diff --git a/src/macro-external/twitch/macro-action-twitch.hpp b/src/macro-external/twitch/macro-action-twitch.hpp index efa413a0..e1c6c90e 100644 --- a/src/macro-external/twitch/macro-action-twitch.hpp +++ b/src/macro-external/twitch/macro-action-twitch.hpp @@ -4,6 +4,7 @@ #include "category-selection.hpp" #include "channel-selection.hpp" #include "chat-connection.hpp" +#include "points-reward-selection.hpp" #include #include @@ -22,16 +23,118 @@ public: std::string GetShortDesc() const; enum class Action { - TITLE, - CATEGORY = 10, - MARKER = 20, - CLIP = 30, - COMMERCIAL = 40, - ANNOUNCEMENT = 50, - ENABLE_EMOTE_ONLY = 60, - DISABLE_EMOTE_ONLY = 70, - RAID = 80, - SEND_CHAT_MESSAGE = 90, + // Channel info update + CHANNEL_INFO_TITLE_SET = 10, + CHANNEL_INFO_CATEGORY_SET = 20, + CHANNEL_INFO_LANGUAGE_SET = 30, + CHANNEL_INFO_DELAY_SET = 40, + CHANNEL_INFO_TAGS_SET = 50, // TODO + CHANNEL_INFO_CONTENT_LABELS_SET = 60, // TODO + CHANNEL_INFO_BRANDED_CONTENT_ENABLE = 70, + CHANNEL_INFO_BRANDED_CONTENT_DISABLE = 71, + + // Raid + RAID_START = 110, + RAID_END = 120, + + // Shoutout + SHOUTOUT_SEND = 200, + + // Poll + POLL_START = 300, // TODO + POLL_END = 310, + + // Prediction + PREDICTION_START = 400, // TODO + PREDICTION_END = 410, + + // Shield mode + SHIELD_MODE_START = 500, + SHIELD_MODE_END = 501, + + // Reward add + POINTS_REWARD_ADD = 600, // TODO + + // Reward update + POINTS_REWARD_ENABLE = 710, + POINTS_REWARD_DISABLE = 711, + POINTS_REWARD_PAUSE = 712, + POINTS_REWARD_UNPAUSE = 713, + POINTS_REWARD_TITLE_SET = 720, + POINTS_REWARD_PROMPT_SET = 730, + POINTS_REWARD_COST_SET = 740, + POINTS_REWARD_BACKGROUND_COLOR_SET = 750, // TODO + POINTS_REWARD_USER_INPUT_REQUIRE = 760, + POINTS_REWARD_USER_INPUT_UNREQUIRE = 761, + POINTS_REWARD_COOLDOWN_ENABLE = 770, + POINTS_REWARD_COOLDOWN_DISABLE = 771, + POINTS_REWARD_QUEUE_SKIP_ENABLE = 780, + POINTS_REWARD_QUEUE_SKIP_DISABLE = 781, + POINTS_REWARD_MAX_PER_STREAM_ENABLE = 790, + POINTS_REWARD_MAX_PER_STREAM_DISABLE = 791, + POINTS_REWARD_MAX_PER_USER_ENABLE = 792, + POINTS_REWARD_MAX_PER_USER_DISABLE = 793, + + // Reward delete + POINTS_REWARD_DELETE = 800, + + // Reward redemption update + POINTS_REWARD_REDEMPTION_FULFILL = 900, + POINTS_REWARD_REDEMPTION_CANCEL = 910, + + // User state + USER_BAN = 1000, + USER_UNBAN = 1100, + USER_BLOCK = 1200, + USER_UNBLOCK = 1300, + USER_MODERATOR_ADD = 1400, + USER_MODERATOR_DELETE = 1500, + USER_VIP_ADD = 1600, + USER_VIP_DELETE = 1700, + USER_CHAT_COLOR_UPDATE = 1800, // TODO + + // Commercial + COMMERCIAL_START = 1900, + COMMERCIAL_SNOOZE = 2000, + + // Marker + MARKER_CREATE = 2100, + + // Clips + CLIP_CREATE = 2200, + + // Videos + VIDEOS_DELETE = 2300, // TODO + + // Chat + CHAT_MESSAGES_DELETE = 2400, // TODO + CHAT_ANNOUNCEMENT_SEND = 2500, + CHAT_EMOTE_ONLY_ENABLE = 2600, + CHAT_EMOTE_ONLY_DISABLE = 2601, + CHAT_FOLLOWER_ONLY_ENABLE = 2602, + CHAT_FOLLOWER_ONLY_DISABLE = 2603, + CHAT_SUBSCRIBER_ONLY_ENABLE = 2604, + CHAT_SUBSCRIBER_ONLY_DISABLE = 2605, + CHAT_SLOW_MODE_ENABLE = 2640, + CHAT_SLOW_MODE_DISABLE = 2641, + CHAT_NON_MODERATOR_DELAY_ENABLE = 2650, + CHAT_NON_MODERATOR_DELAY_DISABLE = 2651, + CHAT_UNIQUE_MODE_ENABLE = 2960, + CHAT_UNIQUE_MODE_DISABLE = 2661, + CHAT_AUTOMOD_UPDATE = 2700, // TODO + CHAT_AUTOMOD_MESSAGE_ALLOW = 2800, // TODO + CHAT_AUTOMOD_MESSAGE_DENY = 2801, // TODO + CHAT_BLOCKED_TERM_ADD = 2900, // TODO + CHAT_BLOCKED_TERM_DELETE = 3000, // TODO + WHISPER_SEND = 3100, + + // Schedule + CHANNEL_SCHEDULE_UPDATE = 3200, // TODO + CHANNEL_SCHEDULE_SEGMENT_ADD = 3300, // TODO + CHANNEL_SCHEDULE_SEGMENT_UPDATE = 3400, // TODO + CHANNEL_SCHEDULE_SEGMENT_DELETE = 3500, // TODO + + SEND_CHAT_MESSAGE = 5000, }; enum class AnnouncementColor { @@ -42,6 +145,8 @@ public: PURPLE, }; + enum class RedemptionStatus { CANCELED, FULFILLED }; + bool PerformAction(); void LogAction() const; bool Save(obs_data_t *obj) const; @@ -49,7 +154,7 @@ public: bool ActionIsSupportedByToken(); void ResetChatConnection(); - Action _action = Action::TITLE; + Action _action = Action::CHANNEL_INFO_TITLE_SET; std::weak_ptr _token; StringVariable _streamTitle = obs_module_text("AdvSceneSwitcher.action.twitch.title.title"); @@ -119,8 +224,10 @@ protected: std::shared_ptr _entryData; private: - void SetWidgetVisibility(); + void SetWidgetProperties(); + void SetWidgetSignalConnections(); void SetWidgetLayout(); + void SetWidgetVisibility(); QHBoxLayout *_layout; FilterComboBox *_actions;