Свои команды
Собственные ответы, таймеры и счётчики.
Встроенные команды написаны в коде и не переписываются. Всё остальное — ваше: откройте Панель → Команды и нажмите Создать команду.
Как создать
Команде нужны две вещи — триггер и ответ.
| Поле | Что делает |
|---|---|
| Триггер | Что пишет зритель, например !discord |
| Алиасы | Другие написания того же самого |
| Ответ | Текст, который отправит бот |
| Доступ | Все, подписчики, VIP, модераторы или список ников |
| Таймер | Повторять ответ автоматически раз в N минут |
Если не поставить префикс, будет добавлен !. Префиксы $ и
~ сохраняются как есть, поэтому $hug так и останется
$hug.
Переменные
В ответ можно вставить подстановки — они заполняются в момент вызова. Пишите их руками в поле ответа; полный список ниже, панель его не дублирует.
Формы записи равнозначны: $(user), {user} и
${user} — одно и то же. @{user} отличается: он добавляет
@ перед именем, то есть получается готовое упоминание.
Кто и что написал
| Переменная | Во что превращается |
|---|---|
$(user) | Логин того, кто вызвал команду |
@{user} | Упоминание того, кто вызвал команду |
$(channel) | Логин канала |
@{channel} | Упоминание канала |
$(args) | Весь текст после команды |
$(1), $(2) | Первое и второе слово после команды |
$(1:), $(2:) | Всё начиная с первого или второго слова |
Про эфир
| Переменная | Во что превращается |
|---|---|
$(uptime) | Сколько идёт эфир: «3 часа 12 минут». Вне эфира — «не в эфире» |
$(game) | Категория, в которой идёт эфир. Вне эфира — «не в эфире» |
$(viewers) | Сколько человек смотрит прямо сейчас. Вне эфира — 0 |
Эти три бот спрашивает у Twitch не чаще раза в минуту на канал, поэтому число зрителей может отставать на минуту — так команда не упирается в лимиты Twitch, даже если её зовут каждую секунду.
Случайное
| Переменная | Во что превращается |
|---|---|
$(random.1-100) | Случайное число в диапазоне |
$(random.pick:вариант 1|вариант 2) | Случайный вариант из списка через | |
$(random.chatter) | Случайный участник чата из тех, кто недавно писал |
Счётчики
| Переменная | Во что превращается |
|---|---|
$(count) | Счётчик вызовов команды — увеличивается при каждом вызове |
$(count:giveaway) | Именованный счётчик — увеличивается при каждом вызове |
$(getcount:giveaway) | Именованный счётчик — только показать, не трогая |
Данные со стороннего сервиса
Это то, из чего делаются команды вроде !elo, !rank или
!mmr. Бот сам не знает ни FACEIT, ни Valorant — он спрашивает адрес,
который вы указали, и вставляет ответ в сообщение.
| Переменная | Во что превращается |
|---|---|
$(urlfetch URL) | Ответ сервиса как есть — если он отдаёт готовую строку |
$(json URL поле) | Одно поле, если сервис отдаёт JSON |
В адрес можно подставлять другие переменные — например ник того, кто вызвал команду, или первое слово после команды:
Пример
!elo → «$(urlfetch https://wombot.fi/nightbot/elo/$(user))» даст
«Elo: 2857, Today: +17»
Если сервис отдаёт JSON, поле берётся по пути через точку. Числа в пути — это номера
элементов списка, считая с нуля: recentMatches.0.result — результат
первого матча.
Пример «Уровень: $(json URL level) | Эло: $(json URL elo)» даст «Уровень: 8 | Эло: 1568»
Что нужно знать
- Только
https. Адреса внутри нашей сети запрашивать нельзя — команда ответит «адрес не разрешён». - Одно сообщение делает не больше двух запросов. Один и тот же адрес в одном сообщении — это один запрос.
- Ответ сервиса кэшируется на 10 секунд, а на канал приходится не больше 20 запросов в минуту. Поставьте команде кулдаун — иначе чат положит чужой сервис, и адрес заблокируют.
- Ответ обрезается до 300 символов, переводы строк схлопываются в пробел, а ведущие
/и.отбрасываются — чтобы чужой сервер не мог отправить в чат команду Twitch от имени бота. - Если сервис молчит дольше 5 секунд или отвечает ошибкой, в чат уйдёт «сервис не ответил» вместо пустоты.
- Пробелы и прочие небезопасные символы в адресе кодируются сами. Но подставлять лучше ник или одно слово: произвольный текст зрителя может добавить в адрес лишние параметры.
- Команда живёт ровно столько, сколько живёт чужой сервис. Это не наш адрес, и мы не обещаем, что он будет работать завтра.
Где брать адреса
Такие же адреса используют Nightbot и StreamElements, поэтому подходит любой рецепт
из их сообществ — синтаксис у нас тот же самый. Для FACEIT есть публичный
wombot.fi/nightbot/elo/<ник>, для Valorant и League of Legends —
сервисы, которые отдают ранг по нику. Проверить адрес проще всего, открыв его в
браузере: то, что вы увидите, и попадёт в чат.
Пример
!hug → «{user} обнимает {1} 🤗» даст «viewer обнимает streamer 🤗»
Счётчики
{count} превращает команду в счётчик — смертей, шуток, чего угодно.
Значение хранится по каналу и переживает перезапуск.
Таймеры
Поставьте команде таймер, и бот будет отправлять её по расписанию, пока вы в эфире. Удобно для ссылок и правил. Когда стрим оффлайн, таймеры сами останавливаются.
Ответы на слова без «!»
«А какой у вас сервер?» — обычная фраза, а не команда, и отвечать на неё приходится руками по десять раз за эфир. В форме команды есть блок «Отвечать на слова без «!»»: добавьте туда слово — и бот ответит тем же текстом, что и по команде, когда услышит его в разговоре.
| Как искать | Что ловит слово «сервер» | Когда нужно |
|---|---|---|
| Точное слово | «сервер», «Сервер», «сервер?» | По умолчанию: почти не ошибается |
| Слово и его формы | плюс «сервера», «сервере», «серверу» | Падежи — то, ради чего это и делается |
| Любое вхождение | плюс «хостсервер», «мойсервер» | Редко: чаще даёт ложные срабатывания |
Пример зритель: «а какой у вас сервер?» → бот: «IP: 1.2.3.4, порт 25565»
Чтобы бот не превратил чат в поток ответов
- После ответа команда молчит — по умолчанию минуту. Совсем без паузы нельзя: слово «сервер» в оживлённом разговоре встречается по десять раз подряд.
- Слова короче трёх букв не принимаются, больше пятидесяти на канал не хранится.
- Сообщения, начинающиеся с
!,~или$, сюда не попадают — их разбирают обычные команды. - Внутри ссылок слова не ищутся: «зашёл на example.com/server» — это не вопрос про сервер.
- Латиница вместо кириллицы не спасает: «cepвep» бот прочитает так же, как «сервер».
- Модерация ходит первой. Удалённое сообщение ответа не вызывает.
- Если слово подошло сразу к двум командам, выигрывает более длинное: «айпи сервера» точнее, чем «сервер».
Управление командами из чата
Всё то же самое можно делать, не открывая панель. Раздел приезжает
выключенным: !del удаляет команду одной строкой в чате,
и включать это канал должен сам — Панель → Команды → Системные →
«Управление командами из чата».
| Команда | Что делает | Пример |
|---|---|---|
!add, !addcom | Заводит команду | !add !сервер IP: 1.2.3.4 |
!edit, !editcom | Меняет ответ | !edit !сервер IP: 5.6.7.8 |
!del, !delcom | Удаляет команду | !del !сервер |
!alias | Добавляет второе имя с префиксом | !alias !сервер !ip |
!word, !слово | Добавляет слово без префикса | !word !сервер сервер, айпи |
!unword | Убирает слово | !unword !сервер айпи |
- Пользоваться этим могут стример и модераторы. Остальным бот откажет.
- Префикс в имени можно не писать:
!add сервер …и!add !сервер …— одно и то же. - Системную команду переопределить нельзя: бот скажет об этом прямо, а не промолчит.
- Изменения видны в панели сразу и попадают в ленту событий — потом видно, кто что сделал.
Занятые триггеры
Триггеры встроенных команд и их алиасы нельзя занять своей командой — иначе опечатка могла бы незаметно отключить заказ музыки или клипы. Панель откажет и покажет, какая встроенная команда занимает этот триггер.
Custom commands
Your own replies, timers and counters.
Built-in commands are implemented in code and cannot be rewritten. Everything else is yours: open Dashboard → Commands and press Create command.
Creating one
A command needs two things — a trigger and a reply.
| Field | What it does |
|---|---|
| Trigger | What the viewer types, for example !discord |
| Aliases | Other spellings that do the same thing |
| Reply | The text the bot sends |
| Access | Everyone, subscribers, VIPs, moderators or a named list |
| Timer | Repeat the reply automatically every N minutes |
If you leave the prefix out, ! is added for you. $ and
~ are kept as typed, so $hug stays $hug.
Variables
A reply can include placeholders that are filled in when the command runs. Type them into the reply field yourself — the full list lives here rather than in the dashboard.
The spellings are interchangeable: $(user), {user} and
${user} are the same thing. @{user} is not — it puts an
@ in front, giving you a ready mention.
Who ran it, and what they typed
| Variable | Becomes |
|---|---|
$(user) | The login of whoever ran the command |
@{user} | A mention of whoever ran the command |
$(channel) | The channel login |
@{channel} | A mention of the channel |
$(args) | Everything typed after the command |
$(1), $(2) | The first and second word after the command |
$(1:), $(2:) | Everything from the first or second word on |
About the stream
| Variable | Becomes |
|---|---|
$(uptime) | How long the stream has been going. Offline: «не в эфире» |
$(game) | The category being streamed. Offline: «не в эфире» |
$(viewers) | How many people are watching right now. Offline: 0 |
These three are asked of Twitch at most once a minute per channel, so the viewer count can lag by a minute — which is what keeps a command that is run every second from running into Twitch's limits.
Random
| Variable | Becomes |
|---|---|
$(random.1-100) | A random number in the range |
$(random.pick:one|two) | A random choice from a | separated list |
$(random.chatter) | Somebody who has said something recently |
Counters
| Variable | Becomes |
|---|---|
$(count) | This command's counter — goes up on every run |
$(count:giveaway) | A named counter — goes up on every run |
$(getcount:giveaway) | A named counter — read it without changing it |
Data from another service
This is what commands like !elo, !rank or !mmr
are made of. The bot knows nothing about FACEIT or Valorant — it asks the address you
gave it and puts the answer in the message.
| Variable | Becomes |
|---|---|
$(urlfetch URL) | The answer as it came, for a service that returns a ready line |
$(json URL поле) | One field, for a service that returns JSON |
Other variables can go inside the address — the nickname, or the first word after the command:
Example
!elo → “$(urlfetch https://wombot.fi/nightbot/elo/$(user))” gives
“Elo: 2857, Today: +17”
For JSON, the field is a dotted path. A number in the path is a position in a list,
counting from zero: recentMatches.0.result is the first match.
Worth knowing
httpsonly, and never an address inside our own network.- At most two requests per message; the same address twice costs one.
- Answers are cached for 10 seconds, and a channel gets 20 requests a minute. Give the command a cooldown — otherwise chat will take somebody else's service down and the address will be blocked.
- The answer is cut to 300 characters, newlines become spaces, and a leading
/or.is dropped, so another server cannot make the bot run a Twitch command. - Slower than 5 seconds or an error, and chat is told the service did not answer.
- The command lives exactly as long as the service does. It is not our address, and we do not promise it will work tomorrow.
Example
!hug → “{user} hugs {1} 🤗” gives “viewer hugs streamer 🤗”
Counters
{count} turns a command into a tally — deaths, jokes, anything worth counting.
The value is stored per channel and survives restarts.
Timers
Set a timer on a command and the bot posts it on a schedule while you are live. Useful for social links and rules. Timers pause automatically when the stream is offline.
Replies to plain words
"So what's your server?" is a sentence, not a command, and answering it by hand ten times a stream gets old. The command form has a "Reply to words without !" block: add a word there and the bot posts the same reply when it hears that word in conversation.
| Matching | What "server" catches | When to use it |
|---|---|---|
| Exact word | "server", "Server", "server?" | The default: hardly ever wrong |
| Word and its forms | plus "servers", "server's" | Inflections — the reason this exists |
| Anywhere | plus "hostserver", "myserver" | Rarely: false positives are common |
Keeping the bot from flooding chat
- After replying the command stays quiet — a minute by default. No pause at all is not an option.
- Words shorter than three letters are rejected; at most fifty per channel are kept.
- Messages starting with
!,~or$never reach this path — ordinary commands handle them. - Words inside links are ignored: "went to example.com/server" is not a question about the server.
- Moderation goes first. A deleted message triggers nothing.
- If two commands match, the longer word wins.
Managing commands from chat
The same edits can be made without opening the dashboard. The section ships
disabled: !del removes a command with one line in chat, so a
channel has to turn it on itself under Dashboard → Commands → System.
| Command | What it does | Example |
|---|---|---|
!add, !addcom | Creates a command | !add !server IP: 1.2.3.4 |
!edit, !editcom | Changes the reply | !edit !server IP: 5.6.7.8 |
!del, !delcom | Deletes it | !del !server |
!alias | Adds a second prefixed name | !alias !server !ip |
!word | Adds a plain word | !word !server server, ip |
!unword | Removes a plain word | !unword !server ip |
- The broadcaster and moderators may use these; everyone else is refused.
- The prefix is optional in the name:
!add server …works too. - Built-in commands cannot be overridden — the bot says so instead of staying silent.
- Changes show up in the dashboard immediately and land in the event feed.
Reserved triggers
Built-in triggers and their aliases cannot be taken over by a custom command — otherwise a typo could silently disable song requests or clips. The dashboard refuses such a trigger and tells you which built-in owns it.