Руководства

Команды «/» и кнопки

Команды «/» появляются в подсказках поля ввода на серверах, где есть бот. Когда человек вызывает команду или нажимает кнопку под сообщением бота, боту приходит событие INTERACTION_CREATE, и он должен ответить в течение 3 секунд.

Регистрация команд

Глобальные команды действуют на всех серверах бота, серверные — только на одном (удобно для отладки). PUT заменяет весь набор: команды, которых нет в списке, удаляются.

curl -X PUT https://voice-chat.ru/api/applications/@me/commands \
  -H "Authorization: Bot $VOICE_TOKEN" -H "Content-Type: application/json" \
  -d '[{
    "name": "погода",
    "description": "Погода в городе",
    "options": [
      { "type": "string", "name": "город", "description": "Город", "required": true },
      { "type": "string", "name": "единицы", "description": "Шкала",
        "choices": [{ "name": "Цельсий", "value": "c" }, { "name": "Фаренгейт", "value": "f" }] }
    ]
  }]'

Формат команды

ПолеТипОписание
nameобяз.stringСтрочные буквы (можно кириллицу), цифры, «-» и «_», до 32 символов. Уникально в наборе.
descriptionобяз.stringОт 1 до 100 символов.
optionsOption[]До 25 параметров. Обязательные — раньше необязательных.
Поле параметраТипОписание
typeобяз.stringstring, integer, number, boolean, user, channel или role.
nameобяз.stringКак у команды.
descriptionобяз.stringОт 1 до 100 символов.
requiredbooleanОбязательный параметр.
choices{ name, value }[]До 25 вариантов (для string и чисел) — человек выбирает из списка.
min, maxnumberГраницы для integer и number.

Сервер проверяет значения до того, как событие уйдёт боту: числа — в границах, user — участник этого сервера, channel — канал этого сервера, role — роль сервера. Боту приходят уже проверенные значения: для user/channel/role — id.

До 100 команд в наборе (глобальном и на каждом сервере). Команды работают в каналах серверов; кнопки — и в личных сообщениях.

Событие INTERACTION_CREATE

Команда
{
  "id": "1791234567890123456",
  "token": "q2V…",
  "type": "command",
  "applicationId": "1790000000000000001",
  "channelId": "c_…",
  "serverId": "s_…",
  "user": { "id": "u_…", "username": "alice", "displayName": "Алиса", "avatar": "/uploads/avatars/…" },
  "data": {
    "id": "1790000000000000777",
    "name": "погода",
    "options": [{ "name": "город", "type": "string", "value": "Казань" }]
  }
}
Кнопка
{
  "id": "…", "token": "…", "type": "component",
  "applicationId": "…", "channelId": "c_…", "serverId": "s_…",
  "user": { "id": "u_…", "username": "alice", "displayName": "Алиса" },
  "message": { "id": "m_…", "content": "Голосование", "components": [ … ] },
  "data": { "customId": "vote_yes", "componentType": "button" }
}

Ответ

POST /api/interactions/:id/:token/callback — один раз, в течение 3 секунд. Если не ответить, человек увидит «… не ответил вовремя».

typeЧто делает
messageСообщение-ответ. data: content, embeds, components, ephemeral.
defer«Бот думает…»: ответ придёт позже через followup (до 15 минут).
updateТолько для кнопок: изменить сообщение, на котором нажали (data: content, embeds, components).
deferred_updateТолько для кнопок: подтвердить нажатие, ничего не меняя.
// d — данные INTERACTION_CREATE
await fetch(`https://voice-chat.ru/api/interactions/${d.id}/${d.token}/callback`, {
  method: "POST",
  headers: { Authorization: `Bot ${TOKEN}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    type: "message",
    data: { content: "Видно только вам 🤫", ephemeral: true },
  }),
});

Ответ «видно только вам»

ephemeral: true (или flags: 64, как в Discord) — сообщение получает только вызвавший; оно нигде не хранится и пропадает после перезагрузки.

Продолжения

МетодЧто делает
POST /api/interactions/:id/:token/followupЕщё одно сообщение (тело — как data у message).
PATCH /api/interactions/:id/:token/originalИзменить первый ответ.
DELETE /api/interactions/:id/:token/originalУдалить первый ответ.

Токен взаимодействия действует 15 минут и только для бота, которому пришло событие. Полный список полей — в справочнике.