Solyx Twitch Bot
Overview

Documentation

Everything about sign-in, commands, variables and parameters.

Getting started#

Solyx Cups answers Fortnite cup questions directly in your Twitch chat — points to qualify, a player’s placement, the running round and countdowns. Three steps get you there.

  1. Sign in with Twitch and pick your channel.
  2. Add the bot, then give it moderator rights with /mod solyxbot.
  3. Set your Epic name and region, then activate the commands you want.

Sign-in & permissions#

Sign-in works through Twitch only. We request exactly one permission — user:read:moderated_channels — to learn which channels you moderate. There is no write access to your account, and we never read your chat history.

Who can manage a channel

The dashboard belongs to the channel, not to a person: the broadcaster and every Twitch moderator of that channel see and edit the same settings.

Why the bot needs moderator rights

Twitch rate-limits ordinary accounts to roughly one message every two seconds. As a moderator the bot may answer far more quickly — without mod rights busy chats will notice long delays.

Commands#

Every command can be renamed and given aliases, so !qual can just as well be !points. Names and aliases share one namespace — no two commands may claim the same word.

CommandSyntaxWhat it answers
!qual!qualHow many points Top X currently takes.
!platz!platz [name]Rank, points and rounds for one Epic account. Without a name in chat your Epic name applies.
!chance!chance [name]Points per match needed to reach the target. Needs an Epic name — yours or one given in chat.
!runde!rundeWhich round is running and who won it. Only makes sense for FNCS and other cups with a single lobby.
!start!startWhen the cup starts or ends.
!ping!pingShows that the bot is reachable in chat.
!uptime!uptimeHow long the channel has been live.
!accountage!accountageHow old a Twitch account is. Without a name in chat the caller is used.
!accountsince!accountsinceCreation date of a Twitch account. Without a name in chat the caller is used.
!followage!followageHow long someone has been following the channel. Without a name in chat the caller is used.
!followsince!followsinceThe date someone started following the channel.
!game!gameWhat the channel is currently playing.
!title!titleThe stream title currently set.
!so!soRecommends another channel with a link and the category they last played.
!commands!commandsLists every active command in the channel.
!lurk!lurkA short goodbye for viewers who keep watching quietly.
!8ball!8ballAnswers yes-or-no questions at random.
!roll!rollA random number from 1 to the given number. Without one, up to 100.
!addcmd!addcmdCreates a custom command straight from chat. It appears in the dashboard immediately.
!editcmd!editcmdReplaces the response of an existing command.
!delcmd!delcmdRemoves a custom command for good.
!setgame!setgameChanges the stream category straight from chat.
!settitle!settitleChanges the stream title straight from chat.

Variables#

Variables are replaced with live values when the command runs. Cup commands use their own set, your own text commands a smaller general one.

In your own text commands

VariableDescriptionType
$(user) · $(touser) · $(target)first argument (the named person), otherwise the caller themselfstring
$(sender) · $(sendername)display name of whoever typed the command — always the caller, regardless of argumentsstring
$(senderid)Twitch user ID of the callerstring
$(channel)your channel namestring
$(args)everything after the commandstring
$(query)like $(args), but with + instead of spaces — for search linksstring
$(1) … $(9)a single argument by positionstring
$(index1 Fallback) … $(index9 Fallback)like $(1)…$(9), but with your own fallback text instead of a blank reply if the argument is missingstring
$(msgid)ID of the triggering chat messagestring
$(count)how many times this command has been triggered in this channelstring
$(time) · $(time Zone) · $(time Zone Format)without arguments, the current time (Berlin) — with an IANA timezone (e.g. Europe/London) and an optional format pattern (tokens like YYYY, MM, DD, hh, mm, ss, A, dddd, z, or shorthands like LT/LL/LLLL), the time in that zonestring
$(date)current datestring
$(unixtime)current Unix timestamp in secondsstring
$(uppercase Text) · $(lowercase Text)text in UPPER or lower casestring
$(urlencode Text) · $(urldecode Text)text URL-encoded or -decodedstring
$(randint 1 30)random number between two boundsstring
$(repeat 5 Text)repeats “Text” several times, separated by spacesstring
$(math 1 + 1)result of a calculation (+ − × ÷ %, parentheses allowed)string
$(followercount)your channel’s follower countstring
$(subcount)your channel’s subscriber count — needs a one-time “Reconnect token” in Administrationstring
$(uptime)how long the channel has been live, otherwise “offline”string
$(game)currently set categorystring
$(title)current stream titlestring
$(followage) · $(followage name)how long someone has followed your channel — without a name, the callerstring
$(accountage) · $(accountage name)age of the Twitch account — without a name, the callerstring
$(accountsince) · $(accountsince name)creation date of the Twitch account — without a name, the callerstring
$(customapi URL)fetches the address and inserts the response into the textstring
$(youtube CHANNEL_ID)latest video of the given YouTube channel (“Title - Link”) — takes the channel ID (starts with “UC…”), not a namestring
$(references command)inserts the resolved response of another of your own text commands — nested $(references) calls are blockedstring
$(weather Ort)current weather for the given location (temperature, feels-like, wind, humidity, visibility, …)string

Only these are listed because only these have a data source. Anything else would silently produce empty replies.

Variables can be nested, e.g. $(repeat 3 $(sender)). Some take an argument after the name, separated by a space, e.g. $(math 1 + 1) or $(randint 1 30).

In cup commands

!qual
{points}{rank}{QualEnd}{QualTrendText}{QualTrend}{RoundsLeft}{PlayerName}{PlayerPoints}{PlayerPlace}{Differenz}{QualStatus}{startin}{endin}{cupstatus}{event}{region}{time}
!runde
{runde}{runden}{rundetext}{winner}{status}{startin}{endin}{cupstatus}{event}{region}{time}
!platz
{player}{place}{points}{rounds}{runde}{rundetext}{winner}{status}{startin}{endin}{cupstatus}{event}{region}{time}
!chance
{player}{place}{points}{rank}{pointsneeded}{pointspermatch}{remainingmatches}{avgpoints}{matches}{totalrounds}{targetpoints}{pace}{startin}{endin}{cupstatus}{event}{region}{time}
!start
{startin}{endin}{cupstatus}{event}{region}{time}

In Chat Alerts

Each alert message in the “Chat Alerts” module has its own set of variables, listed below by alert type.

Subscription
$(user)
Resubscription
$(user)$(months)
Gifted subscription
$(user)$(recipient)
Mass gift subscription
$(user)$(amount)
Raid
$(user)$(viewers)
Bits
$(user)$(bits)
Charity donation
$(user)$(amount)
Ad break
$(length_seconds)
Hype Train begin / level up
$(level)$(level_percent)$(total)
Hype Train end
$(level)$(total)
Go live
$(channel.display_name)$(game)$(title)
Game/title change
$(channel.display_name)$(game)$(title)
Prediction begin
$(title)$(outcomes)
Prediction lock
$(title)$(top_outcome)
Prediction end
$(winner)$(winner_percentage)$(title)
Prediction cancel
$(title)
Poll begin
$(title)$(choices)
Poll end
$(title)$(result)
Follower
$(user)
Watch streak
$(user)$(amount)

Twitch directives#

When the entire response of a command or timer is one of the directives below, the bot carries out the Twitch chat action instead of sending it as text — the same shorthand Twitch itself understands, e.g. /timeout. It only works with the bot’s own moderator rights, so a few broadcaster-only actions are missing on purpose (see note below), and it must be the whole message: mixing a directive with regular text is not supported.

DirectiveWhat it does
/timeout @name 60 [reason]Times the user out for the given number of seconds.
/ban @name [reason]Bans the user permanently.
/unban @name · /untimeout @nameLifts a ban or timeout.
/warn @name reasonSends Twitch’s official warning to the user — visible to them, not in chat.
/so @name · /shoutout @nameSends a native Twitch shoutout.
/announce[blue|green|orange|purple] textSends a highlighted announcement in the chosen colour.
/clearClears the chat.
/slow [seconds] · /slowoffTurns slow mode on or off.
/followers [minutes] · /followersoffTurns followers-only mode on or off.
/subscribers · /subscribersoffTurns subscribers-only mode on or off.
/emoteonly · /emoteonlyoffTurns emote-only mode on or off.
/uniquechat · /r9kbeta · …offTurns unique-chat mode (no repeated messages) on or off.

Not supported, because they need the broadcaster’s own approval rather than the bot’s moderator rights: /mod, /unmod, /vip, /unvip, /raid, /unraid, /commercial.

Cup parameters#

These settings live on the channel and apply to every cup command at once. You set them under “Fortnite cups”.

NameValuesRequiredDescriptionExample
regionEU · NAC · NAE · NAW · ASIA · OCE · BR · MEoptionalRegion whose cups are read.EU
rank1 – 10000optionalPlacement the qualification threshold refers to.100
eventId / windowIdstringoptionalPins a specific cup. Empty means the cup currently running in the region.epicgames_S41_…
scoringcumulative · sessionoptionalAll rounds or only the current session.cumulative
divisionstringoptionalOnly for cups with divisions.1
delay0 – 900 (s)optionalHolds every reply back by this many seconds so chat cannot spoil the stream.30
runden1 – 50optionalOverrides the automatically detected round count. Only needed when detection is wrong.5
langde · enoptionalLanguage of the bot’s replies.de
playerstringoptionalEpic name. Without it the channel’s stored Epic name applies.e.g. Peterbot

Dashboard modules#

Beyond chat commands, the channel dashboard has a few modules that broadcasters and moderators configure directly there.

Roles & permissions

Five predefined roles exist — Broadcaster, Moderator, VIP, Subscriber, Non-subscriber. They apply automatically from your Twitch account status, can’t be renamed or deleted, but their permissions can be edited like any other role. On top of that you can create your own roles and assign them to specific Twitch accounts by searching for them.

Permissions are grouped by area — general, commands, timers, moderation, nukes, cups, roles — each with its own view/toggle/manage-style checkboxes. “Administrator” grants everything at once.

Spam filters

Four automatic filters run on chat messages: repeated messages, links, blocked-language terms, and message flood. Each can be switched on or off independently, gets its own reason text, can be limited to while the channel is online/offline/during notifications, can exclude or target roles (moderators and the broadcaster are always excluded), and can ignore platform emotes. Before the real action (delete, timeout, or warn — with a base and a maximum timeout) an optional warn step can run first, and hits can optionally be announced in chat with a cooldown.

Timers

Rotating auto-messages: a timer has a name, up to five message variants the bot cycles through, an interval in minutes, a minimum number of chat messages since the last send, and a toggle to only run while the channel is live.

Blocked terms

Each term can hold several phrases at once (any one of them triggers it), a match type (contains, whole word, or regular expression), case sensitivity, an action (delete, timeout with a duration, or warn) with an optional reason, and an exempt level (this role and everyone above it is skipped). The first enabled rule that matches, in list order, wins. Rules can be exported to and imported from a JSON file — handy for reusing a rule set across channels.

Nukes

A manual bulk-moderation tool for raids or spam waves: match a text pattern and/or a specific username across the last 1–30 minutes of chat, optionally limited to accounts that followed within a chosen time window. A preview always runs first and lists every match before you delete, time out, or warn them; every run stays in a history list.

Giveaways

A Fossabot-style giveaway: viewers enter either by writing a configurable keyword in chat, or automatically just by chatting at all while the giveaway runs ("active chatters"). A subscriber luck multiplier (1–10) increases a subscriber’s odds relative to everyone else without excluding non-subscribers. Starting and drawing a winner are separate steps — the dashboard shows the live participant list while it runs, and a weighted random draw picks the winner once you click it, with an optional chat announcement for both the start and the winner.

A live, read-only preview of the channel’s real Twitch chat sits next to the settings while the giveaway page is open, so you can watch entries come in without switching tabs.

Chat Alerts

Fossabot-style automatic chat messages for subscriptions, resubs, gifted and mass-gifted subs, raids, bits, charity donations, ad breaks, hype trains, polls, predictions, new followers, watch streaks, and going live/changing game or title — each with its own on/off toggle, message text, and (where it applies) a minimum threshold. See “Variables → In Chat Alerts” above for the placeholders each alert type supports.

Subscription, resub, gift, mass-gift, raid, bits, and follower alerts work immediately. Hype Train, Charity, Ad Break, Poll, and Prediction alerts need extra Twitch permissions from the broadcaster — if any of those stay silent, have the broadcaster sign out and back in once on the dashboard to grant them.

OBS overlay

A browser source (/twitch/cups/overlay) that shows the live cup status on stream. Configurable in the dashboard: dark or light, an accent colour, side-by-side or stacked layout, with or without a card frame, scale, whether the countdown shows, and whether it hides entirely when no cup is live or shows only while one is running. Copy the finished URL or open it directly, then add it as an OBS Browser Source — the dashboard also shows the recommended pixel size once the preview has loaded.

Switching from Fossabot#

The channel overview has a “Fossabot import” dialog with three independent imports, so switching does not mean starting from zero:

  • Commands — fetched automatically from Fossabot’s public command list for the channel, no login needed on the Fossabot side.
  • Timers — pasted in, one message per line; add “| minutes” after a line to set its interval, otherwise 15 minutes is used.
  • Blocked terms — pasted in, one phrase per line.

Fossabot doesn’t expose timers or blocked terms through a public API, which is why those two need pasting instead of a one-click fetch.

Examples#

Chat

!qualTop 100 currently takes 225 points.
!platz Peterbot Peterbot is rank 129 with 196 points, 8 rounds played.

Your own command

Welcome $(user)! Our Discord: discord.gg/…

$(user) targets the person named in the command — with !search @Test → @Test | …, $(user) resolves to Test, not to whoever typed the command. Without a named person it falls back to the caller, just like $(touser). To always mention the caller themself, use $(sender) instead.

FAQ#

The bot does not answer at all.

Check the overview: it must say “In chat”. If it does, the command may be disabled, or its cooldown is still running.

It says “no cup is live”.

Region and cup come from your settings — check that the region matches and that you pressed Save. Unsaved changes are not used by the bot.

Can another chat bot stay in my chat?

Yes. Just make sure no two bots answer the same command name, otherwise both will reply.

Why does my reply arrive late?

A stream delay above 0 holds every reply back on purpose, so chat cannot spoil your stream.

Commands, timers and moderation for your Twitch chatSign in with Twitch