Upcoming changes in the next release!
UserName
and UserLogin
being reversed in UserVariableValue<T>
return value__source
values
Perform Command
sub-action was not fully renamed to Run a Program
Verbose
levelCrowd Control
triggers under Integrations
Twitch User Timedout
Trigger to support a range for the duration%msgId%
Twitch Emote Only
sub-action dialog to be On
/Off
instead of Yes
/No
replyTo
is no longer available.
Simulated Events
TwitchUserInfo TwitchGetBot();
Subscriptions
, Gift Bombs
, and Hype Trains
are now recordedPrior to 0.2.0, one could test certain Twitch events from within the respective events tabs, and with the release of 0.2.0, this was change to be able to test the Triggers
directly.
With the addition of Triggers
, this opened up the ability to have multiple actions triggered by the same event, so in order to test this, you would have to goto each action, and test the trigger manually.
With 0.2.2, a new way of testing has been added, Simulated Events
Simulated Events
are still initiated from a trigger's context menu, however, they will allow you to specify certain data (for instance, for a cheer, you pick the user, and specify the amount), and it will simulate this event application wide, so any triggers that match, will be run.
With this feature, also comes a way to not only search your local user cache, but, to also search against Twitch itself.
The API used for searching only returns users who have streamed within the last 6 months, this is a limitation of the API, and is not possible to circumvent
Released 2023-09-01
While 0.2.0 launch didn't go as smoothly as I had planned, after a quick fix it was off and running. To follow up on that, 0.2.1 brings in some more fixes, and a couple of extras with it.
monthsGifted
being any
in Twitch Gift Sub trigger testSetTwitchUsersVarById
and SetYouTubeUserVarsById
GetUsersVar
Twitch Reward Set Cooldown
sub-actionGetCredits
when BitLeaderboard API calls failWrite To File
sub-action when trying to write to a file user does not have permission toTwitch Chat Message
trigger testCrowdControl TimedEffectUpdate
eventOBS GetSceneItemProperties
sub-action dialogTwitch Guest Star Guest Update
eventYouTube Gift Membership Received
trigger testProcess Started/Stopped
Trigger display not showing the criteriaPatreon Trigger
tests crashingYouTube SuperChat
and SuperSticker
triggers using the microamount and not a decimal value for range comparisons
SetTwitchUsersVarById
and SetYouTubeUsersVarsById
GetUsersVar
, it runs much faster depending on the circumstancesToast Notification Activation
trigger now adds the original toast information to the argumentsPerform Command
to Run a Program
isSubscribed
back for YouTube usersundefined
json valuesUpdateRewardCooldown
GetQuote
sub-action to accept %variables%
Get/Set Command State
sub-actions to display the command's name instead of the commandTwitch Timeout User
sub-action to have similar fields as the Twitch Unban User
sub-actiongreater than
, are now inclusive of that value in comparisonsmin and max
, are now inclusive of the range in comparisons
TrackingStatusChanged
, and accompanying triggerUnsetAllUsersVar
, this will unset the specified variable for all usersCreate
button to various triggersIgnoreAliases
setting to GetCommands sub-action, this will return the first command only for each command if enabledGlobal Variable Updated
A note about SetTwitchUsersVarById
and SetYouTubeUsersVarsById
, these 2 C# methods are completely broken in 0.2.0 and should not be used, they will set all the variables for the users specified to the value passed.
void UnsetAllUsersVar(string varName, bool persisted = true);
QuoteData GetQuote(int quoteId);
int GetQuoteCount();
bool DeleteQuote(int quoteId);
The QuoteData
class
public class QuoteData
{
public DateTime Timestamp { get; set; }
public int Id { get; set; }
public string UserId { get; set; }
public string User { get; set; }
public string Platform { get; set; }
public string GameId { get; set; }
public string GameName { get; set; }
public string Quote { get; set; }
}
Released 2023-08-23
What's this, an actual version bump, or at least a minor one! This changelog is still a work in progres, there is a lot of data I need to sort through, as some has already been included in past releases.
GetBroadcaster
method
ExecuteCodeTrigger
GetCodeTriggers
~globalVariable~
accessor to variablesGone are the days of having to move through multiple tabs to assign an action to an event.
Now, you assign a Trigger directly to one or more actions that act on events.
There are currently 166 different Triggers available in Streamer.bot, and there will probably be more!
When upgrading from 0.1.22, all your events that you have actions associated with, will be upgraded automatically to Triggers.
As you are using triggers, much like sub-actions, you will be able to favorite the ones you use the most by right clicking on the trigger within the menu.
Want an overview of triggers used, and which actions have them. Within the main window, above the trigger list, there is a ?
, clicking this will open the trigger viewer, where you can see a full overview of triggers in use. Note This window does not update in realtime, and requires a manual refresh if changes are made while it's open.
Also at the top of the triggers list, is a +
, this will allow you to add triggers to the selected action.
Triggers that are disabled, will be shown as red in the list, and triggers that have the Always Run
option set, will be shown as blue
This is the behaviour for triggers, when there is a mix of Any, and Range based, or other criteria based.
The behavior is as follows, for an event
.
If a Trigger
has a Min/Max
, it will get all the exact
matches, if there are none, then it will try to get the range
matches, if there are still none, then it will get any
matches.
If a Trigger
is editable
, but not a Min/Max
, it will get a count of Any
, and if there is a disparity
, i.e., there is 1 Any, but say 4 with a Criteria, it will only use those with a Criteria
In addition to the above, you can flag
certain Triggers to Always Run
, this flag is only available on editable
triggers. Once either of the two are checked, it will add any Always Run triggers, and proceed to use that list of Triggers
If neither of the two above are met, then it will just run all the triggers for the event.
Not only are there Triggers for fixed events within Streamer.bot, but you'll also be able to create your own named triggers within the UI as will as in C#. Both of which can be triggered within C#.
If you use the Custom trigger within the UI, just enter any name, and you can trigger it within C# using the following:
// the name, useArgs is a boolean that if true, will forward the args of the action to the trigger
CPH.TriggerEvent("whatever you named it in the UI");
To register a custom trigger in C#, that will show up in the Custom menu, use the following:
// Name, event name, and categories it sits in
CPH.RegisterCustomTrigger("Something", "mine_something", new[] { "Stuff" });
And to trigger it within your code:
CPH.TriggerCodeEvent("mine_something");
Typically you would register a trigger in the void Init()
method, and have it compile at start
There are a couple new Triggers, that previously did not exist as events within Streamer.bot
Trigger an action when a process has started on your PC
Trigger an action when a process has stopped on your PC
A general list of new events that are available through triggers
A brand new integration is coming to v0.2.0, and that's VTube Studio!
You'll be able to react to some events from VTube Studio, as well as 5 new sub-actions to interact with it.
There are also a handful of C# methods, for those that prefer to write C# code for there actions.
The following sub-actions are available for use with VTube Studio
bool VTubeStudioLoadModelById(string modelId);
bool VTubeStudioLoadModelByName(string modelName);
bool VTubeStudioTriggerHotkeyById(string hotkeyId);
bool VTubeStudioTriggerHotkeyByName(string hotkeyName);
bool VTubeStudioMoveModel(double seconds, bool relative, double? posX = null, double? posY = null, double? rotation = null, double? size = null);
bool VTubeStudioRandomColorTint();
bool VTubeStudioResetAllColorTints();
bool VTubeStudioColorTintAll(string hexColor, double mixWithSceneLighting = 0);
bool VTubeStudioColorTintByNumber(string hexColor, double mixWithSceneLighting, List<int> artMeshNumbers);
bool VTubeStudioColorTintByNames(string hexColor, double mixWithSceneLighting, List<string> filterValues);
bool VTubeStudioColorTintByNameContains(string hexColor, double mixWithSceneLighting, List<string> filterValues);
bool VTubeStudioColorTintByTags(string hexColor, double mixWithSceneLighting, List<string> filterValues);
bool VTubeStudioColorTintByTagContains(string hexColor, double mixWithSceneLighting, List<string> filterValues);
bool VTubeStudioActivateExpression(string expressionFile);
bool VTubeStudioDeactivateExpression(string expressionFile);
VTSModelPosition VTubeStudioGetModelPosition();
string VTubeStudioSendRawRequest(string requestType, string data);
public class VTSModelPosition
{
public double PositionX { get; set; }
public double PositionY { get; set; }
public double Rotation { get; set; }
public double Size { get; set; }
}
Yes, that's right, yet another integration, and this time it's CrowdControl 2.0!
With this integration, you can now react to 8 different events from CrowdControl.
Since CrowdControl themselves are still developing this version, there are things within Streamer.bot that can change as well, and new features are still pending.
Yep, another integration, this time its Elgato Wave Link! Control, and react to changes in Wave Link from within Streamer.bot
New triggers:
New sub-actions:
In addition to new sub-actions and trigger, there are also a handful (24 to be exact) new C# methods for interacting with Elgato Wave Link
void WaveLinkOutputMute(string mixer);
void WaveLinkOutputUnmute(string mixer);
void WaveLinkOutputToggleMute(string mixer);
void WaveLinkSetOutputVolume(string mixer, int volume);
string WaveLinkGetMicrophoneIdentifier(string microphoneName);
void WaveLinkMicrophoneMute(string microphoneIdentifier);
void WaveLinkMicrophoneUnmute(string microphoneIdentifier);
void WaveLinkMicrophoneToggleMute(string microphoneIdentifier);
void WaveLinkMicrophoneSetVolume(string microphoneIdentifier, double volume);
double WaveLinkMicrophoneGetVolume(string microphoneIdentifier);
string WaveLinkGetInputIdentifier(string inputName);
void WaveLinkInputMute(string identifier, string mixer);
void WaveLinkInputUnmute(string identifier, string mixer);
void WaveLinkInputToggleMute(string identifier, string mixer);
void WaveLinkInputSetVolume(string inputIdentifier, string mixer, int volume);
long WaveLinkInputGetVolume(string inputIdentifier, string mixer);
void WaveLinkInputFilterBypassBypassed(string inputIdentifier, string mixer);
void WaveLinkInputFilterBypassEnabled(string inputIdentifier, string mixer);
void WaveLinkInputFilterBypassToggle(string inputIdentifier, string mixer);
string WaveLinkInputGetFilterIdentifier(string inputIdentifier, string filterName);
void WaveLinkInputFilterEnable(string inputIdentifier, string filterIdentifier);
void WaveLinkInputFilterDisable(string inputIdentifier, string filterIdentifier);
void WaveLinkInputFilterToggle(string inputIdentifier, string filterIdentifier);
bool WaveLinkInputGetFilterState(string inputIdentifier, string filterIdentifier);
Yes, I've heard you, and I was finally able to figure out the best way to handle this.
Starting with 0.2.0 you can setup a bot account for YouTube, and use this as the mouth piece for talking to chat. The YouTube send message sub-action has been udpated, as well as the C# methods.
How you export actions and command has changed with 0.2.0, no longer do you havhe to scroll through a list to select the actions you want. Now, you can just right click on an action, and use the Add to Export
or Remove from Export
menu items. Best of all, the Export window is no longer modal, which means you can keep it open off to the side, as you add your actions and commands and see it populate. THere is also new information you can attach to an export, such as author, description and a version.
The Import window has also changed to accomodate the new data that's available with exports from 0.2.0, but don't worry, it will still accept imports from older versions.
Importing will also properly handle new triggers, as well as updating certain data in old exports to the new trigger system.
New with the Import system, you'll be able to overwrite commands and actions, this is primarily for exports from 0.2.0, as legacy exports altered ids, so matching them correctly is not possible. When you're presented with actions and commands to import, you can right click on an action or a command, and include/exclude it, if its an exact match to an existing action or command, you can also flag it to be overwritten or not.
Ever wonder what global variables are floating around Streamer.bot? will, now you can see them, and see them update in realtime with a Global Variable viewer.
In addition to seeing them, you can add new ones, edit existing ones, and even outright delete them.
Open up a window, and view your Twitch, and/or YouTube chat, right within Streamer.bot itself!
You can now use ~
to access global variables directly. They will be replaced with the global variable value, if it exists at the time of parsing.
bool UpdateRewardBackgroundColor(string rewardId, string backgroundColor);
bool UpdateReward(string rewardId, string title = null, string prompt = null, int? cost = null, string backroundColor = null);
void TwitchReplyToMessage(string message, string replyId, bool bot = true);
string ObsSendBatchRaw(string data, bool haltOnFailure = false, int executionType = 0, int connectionIdx = 0);
void SetTwitchUserVarById(string userId, string varName, object value, bool persisted = true);
void SetYouTubeUserVarById(string userId, string varName, object value, bool persisted = true);
void SetTwitchUsersVarById(List<string> userIds, string varName, object value, bool persisted = true);
void SetYouTubeUsersVarById(List<string> userIds, string varName, object value, bool persisted = true);
void UnsetTwitchUserVarById(string userId, string varName, bool persisted = true);
void UnsetYouTubeUserVarById(string userId, string varName, bool persisted = true);
void UnsetTwitchUserById(string userId, bool persisted = true);
void UnsetYouTubeUserById(string userId, bool persisted = true);
T GetTwitchUserVarById<T>(string userId, string varName, bool persisted = true);
T GetYouTubeUserVarById<T>(string userId, string varName, bool persisted = true);
List<UserVariableValue<T>> GetTwitchUsersVar<T>(string varName, bool persisted = true);
List<UserVariableValue<T>> GetYouTubeUsersVar<T>(string varName, bool persisted = true);
public class UserVariableValue<T>
{
public string UserId { get; set; }
public string UserLogin { get; set; }
public string UserName { get; set; }
public string VariableName { get; set; }
public T Value { get; set; }
public DateTime LastWrite { get; set; }
}
TwitchUserInfo TwitchGetBroadcaster();
TwitchUserInfo TwitchGetUserInfoById(string userId);
TwitchUserInfo TwitchGetUserInfoByLogin(string userLogin);
TwitchUserInfoEx TwitchGetExtendedUserInfoById(string userId);
TwitchUserInfoEx TwitchGetExtendedUserInfoByLogin(string userLogin);
public class TwitchUserInfo
{
public string UserName { get; set; }
public string UserLogin { get; set; }
public string UserId { get; set; }
public DateTime LastActive { get; set; }
public DateTime PreviousActive { get; set; }
public bool IsSubscribed { get; set; }
public string SubscriptionTier { get; set; }
public bool IsModerator { get; set; }
public bool IsVip { get; set; }
}
public class TwitchUserInfoEx
{
public string UserName { get; set; }
public string UserLogin { get; set; }
public string UserId { get; set; }
public string Description { get; set; }
public string ProfileImageUrl { get; set; }
public string UserType { get; set; }
public bool IsPartner => string.Equals(UserType, "partner", StringComparison.OrdinalIgnoreCase);
public bool IsAffiliate => string.Equals(UserType, "affiliate", StringComparison.OrdinalIgnoreCase);
public bool IsFollowing { get; set; }
public DateTime LastActive { get; set; }
public DateTime PreviousActive { get; set; }
public bool IsSubscribed { get; set; }
public string SubscriptionTier { get; set; }
public bool IsModerator { get; set; }
public bool IsVip { get; set; }
public DateTime CreatedAt { get; set; }
public double AccountAge { get; set; }
public string Game { get; set; }
public string GameId { get; set; }
public string ChannelTitle { get; set; }
public List<string> Tags { get; set; }
}
void ShowToastNotification(string title, string message, string attribution = null, string iconPath = null);
void ShowToastNotification(string id, string title, string message, string attribution = null, string iconPath = null);
int AddQuoteForTwitch(string userId, string quote, bool captureGame = false);
int AddQuoteForYouTube(string userId, string quote);
The new ExecuteCodeTrigger
WebSocket method will let you trigger a Custom Code Trigger by using this method in a WebSocket connection. The format of the request is as follows.
{
"method": "ExecuteCodeTrigger",
"eventName": "<registered name of event>",
"args": {
"id": "<someid>"
}
}
Released 2023-05-31
This is a hot-fix for 0.1.21 to fix a non-critical (workarounds were available) issue with Twitch Authentication, and requesting new scopes. Seems I forgot to apply a change after updating the status indicator to still show the Twitch Broadcaster/Bot status after new scopes are required.
Released 2023-05-31
channel:manage:guest_star
With this release, to give users a chance to try new features before they're ready, with the knowledge, that they are 100% experimental, I've added a new Labs page.
The first experimental feature is an updated Action Queue, to enable this, just click the check box and restart Streamer.bot. The underlying code for this new action queue uses a different container type, and is a bit easier to maintain and manage. There is the possibility of lower CPU usage with many queues.
Be sure to give this a try, so it can be promoted to the next version sooner.
I have updated the handling of gift subs and community gifting events.
Internally these are now cached, and can be associated with the respective IDs if they happen to come out of order from Twitch's IRC server.
If a single gift sub comes in, it should be handled appropriately and still fire an event for it, however, there will be a small 500ms delay, as a byproduct of this caching.
void StreamDeckSetBackgroundColor(string buttonId, string color);
void StreamDeckSetBackgroundColor(string buttonId, string color, int state);
void StreamDeckSetBackgroundUrl(string buttonId, string imageUrl);
void StreamDeckSetBackgroundUrl(string buttonId, string imageUrl, string color);
void StreamDeckSetBackgroundUrl(string buttonId, string imageUrl, int state);
void StreamDeckSetBackgroundUrl(string buttonId, string imageUrl, string color, int state);
void StreamDeckSetBackgroundLocal(string buttonId, string imageFile);
void StreamDeckSetBackgroundLocal(string buttonId, string imageFile, string color);
void StreamDeckSetBackgroundLocal(string buttonId, string imageFile, int state);
void StreamDeckSetBackgroundLocal(string buttonId, string imageFile, string color, int state);
void StreamDeckSetTitle(string buttonId, string title);
void StreamDeckSetTitle(string buttonId, string title, int state);
void StreamDeckSetState(string buttonId, int state);
void StreamDeckSetValue(string buttonId, string value);
void StreamDeckShowAlert(string buttonId);
void StreamDeckShowOk(string buttonId);
void StreamDeckToggleState(string buttonId);
GuestStarSettings TwitchGetChannelGuestStarSettings();
bool TwitchUpdateChannelGuestStarSettings(bool? isModeratorSendLiveEnabled = null, int? slotCount = null, bool? isBrowserSourceAudioEnabled = null, string groupLayout = null, bool? regeneratgeBrowserSource = null);
GuestSession TwitchGetGuestStarSession();
GuestSession TwitchCreateGuestStarSession();
GuestSession TwitchEndGuestStarSession();
List<GuestStarInvite> TwitchGetGuestStarInvites();
bool TwitchSendGuestStarInvite(string userLogin);
bool TwitchDeleteGuestStarInvite(string userLogin);
bool TwitchAssignGuestStarSlot(string userLogin, int slot);
bool TwitchUpdateGuestStarSlot(int sourceSlot, int destinationSlot);
bool TwitchDeleteGuestStarSlot(string userLogin, int slot);
bool TwitchUpdateGuestStarSlotSettings(int slotId, bool? isAudioEnabled = null, bool? isVideoEnabled = null, bool? isLive = null, int? volume = null);
Supporting return classes
public class GuestStarSettings
{
public bool IsModeratorSendLiveEnabled { get; set; }
public int SlotCount { get; set; }
public bool IsBrowserSourceAudioEnabled { get; set; }
public string GroupLayout { get; set; }
public string BrowserSourceToken { get; set; }
}
public class GuestSession
{
public string Id { get; set; }
public List<GuestStar> Guests { get; set; }
}
public class GuestStar
{
public string SlotId { get; set; }
public bool IsLive { get; set; }
public string UserId { get; set; }
public string UserName { get; set; }
public string UserLogin { get; set; }
public int Volume { get; set; }
public DateTime AssignedAt { get; set; }
public MediaSettings AudioSettings { get; set; }
public MediaSettings VideoSettings { get; set; }
}
public class MediaSettings
{
public bool IsHostEnabled { get; set; }
public bool IsGuestEnabled { get; set; }
public bool IsAvailable { get; set; }
}
public class GuestStarInvite
{
public string UserId { get; set; }
public DateTime InvitedAt { get; set; }
public string Status { get; set; }
public bool IsVideoEnabled { get; set; }
public bool IsAudioEnabled { get; set; }
public bool IsVideoAvailable { get; set; }
public bool IsAudioAvailable { get; set; }
}
Official plugin and documentation available at https://streamdeck.streamer.bot
Added subscriptions to listen to the new Twitch Guest Start EventSub subscriptions.
Added 12 new sub-actions to let the streamer interact with the new API methods for managing the Guest Star feature.
Requesting the following new scopes for the broadcaster account
channel:manage:guest_star
Released 2023-05-10
__source
variable for Twitch Poll and Prediction events__source
variable for StreamElements events
__source
valueobs.id
to OBS Event argumentsisFollowing
variable for Twitch Add Follow Age Info
sub-actiontargetIsFollowing
variable for Twitch Add Target Info
sub-actioncreateClipUrl
to be the URL friendly URL for the clip, and added createClipEmbedUrl
that will contain the embed url
Logic If
sub-actionYes, you heard that right, there is a new Stream Deck plugin in the works, and will be released some time after this update, so there are features and settings available with this version to support the update.
More details will follow
As of May 15th, 2023, Twitch is updating the EventSub URL, and moving it out of beta, this means that any versions prior to this will not connect to Twitch's EventSub
View changelogs for older releases