Функции можно вызывать в поле Variables блока или непосредственно в тексте ответа с помощью #{...}:
#{discord_add_role(message_from, '1465674567090704592')}
ID сервера, канала, роли и сообщения Discord — это длинные числовые значения. Проще всего их скопировать, включив Settings → Advanced → Developer Mode. После этого в контекстном меню любого объекта появится опция Copy ID.
Подключение бота описано в статье How to Create a Chatbot in Discord.
Где взять ID сообщения
ID сообщения, вызвавшего блок, хранится в переменной discord_message_id. Получать его отдельно не нужно:
#{discord_delete_message(discord_message_id)}
Если нужны данные, которых нет в предопределённых переменных, полный webhook доступен в переменной discord_webhook. Она заполняется, когда любой переменной присваивается значение save_webhook:
data = discord_webhook["data"]
msg_id = data["id"]
result = discord_reply_to_message(msg_id, "Это ответ на сообщение")
Автоматически создаваемые переменные
Эти переменные заполняются автоматически для каждого события и не требуют дополнительной настройки.
| Переменная | Описание | Пример |
|---|---|---|
guild_id |
ID сервера | 1465674567090704591 |
discord_event |
Тип события одним словом | message |
discord_message_id |
ID сообщения с префиксом mid
|
mid1465674569095319625 |
message_from |
ID автора события с префиксом uid
|
uid413984787162726410 |
from_username |
Имя пользователя Discord автора | 00rei |
from_name |
Отображаемое имя автора в чате | Rus |
username |
Имя пользователя для личных сообщений боту | 00rei |
is_bot |
1, если автор события — другой бот |
0 |
nickname |
Прозвище на сервере; пусто, если не задано | Moderator |
roles |
Список ID ролей автора | ["1465674567090704592"] |
is_admin |
1, если пользователь — администратор или владелец сервера |
1 |
reply_from |
ID автора сообщения, на которое отвечают | uid493121376652230668 |
reply_from_username |
Имя пользователя автора, на которого отвечают | _deikin |
reply_from_name |
Отображаемое имя автора, на которого отвечают | Rus |
reply_to_bot |
1, если ответ адресован боту |
0 |
reply_message_id |
ID сообщения, на которое отвечают | mid1534837349219958804 |
reply_text |
Текст сообщения, на которое отвечают | кто сегодня дежурит? |
Префиксы uid, cid и mid являются частью значения. Передавайте эти переменные в функции как есть; удалять префиксы не нужно.
from_name vs. from_username
from_name содержит имя, которое следует использовать для обращения к пользователю в чате:
- Прозвище на сервере, если задано.
- Отображаемое имя аккаунта.
- Имя пользователя.
Это рекомендуемая переменная для использования в приветствиях, поскольку from_username может выглядеть как _deikin или 00rei.
Переменные reply_* заполняются только тогда, когда входящее сообщение является ответом на другое сообщение. Для обычных сообщений все они очищаются.
Поэтому следующее условие надёжно отличает ответ от обычного сообщения:
#{reply_from != ''}
Переменные nickname, roles и is_admin относятся к автору текущего события.
Discord не предоставляет эти данные для событий реакций, поэтому проверки администратора следует выполнять на событии сообщения или слеш-команды.
Текст входящего сообщения хранится в стандартной переменной question, как и в других каналах.
События
Помимо обычных сообщений, в воронку отправляются и служебные события.
Их текст хранится в переменной question, поэтому вы можете обрабатывать их с помощью обычных текстовых условий.
discord_event |
Текст в question
|
Когда происходит |
|---|---|---|
message |
Текст сообщения | Участник отправляет сообщение |
message_edit |
Обновлённый текст сообщения | Сообщение редактируется |
interaction |
/warn @user spam |
Используется слеш-команда или нажата кнопка |
reaction_add |
new_like ❤️ uid413984787162726410 |
Добавлена реакция |
reaction_remove |
reaction_remove ❤️ uid413984787162726410 |
Удалена реакция |
message_delete |
message_delete mid1465674569095319625 |
Сообщение удалено |
messages_delete_bulk |
messages_delete_bulk 12 |
Удалено несколько сообщений |
member_join |
member_join uid413984787162726410 |
Участник присоединяется к серверу |
member_leave |
member_leave uid413984787162726410 |
Участник покидает сервер |
member_update |
member_update uid413984787162726410 |
Изменяется прозвище или роли участника |
member_ban |
member_ban uid413984787162726410 |
Участник забанен |
member_unban |
member_unban uid413984787162726410 |
Участник разбанен |
Для пользовательской реакции вместо самого эмодзи используется ID пользовательского эмодзи:
new_like beer:1479419477396291696 uid413984787162726410
Подробнее см. в разделе Реакции.
Если блок должен срабатывать только на обычные сообщения от участников, добавьте следующее условие:
discord_event == 'message'
Это сразу отфильтрует все служебные события.
Проверка только текста события ненадёжна, так как участник может вручную отправить сообщение вида member_join.
Важно:
member_updateсрабатывает при любом обновлении участника, включая назначение роли самим ботом. Блок, реагирующий наmember_updateи назначающий роль, может создать цикл, поэтому такие условия всегда следует соответствующим образом ограничивать.
Сообщения
| Функция | Описание |
|---|---|
discord_send_message(channel_id, text) |
Отправить сообщение в любой канал |
discord_send_dm(user_id, text) |
Отправить личное сообщение участнику |
discord_reply_to_message(message_id, text) |
Ответить на сообщение |
discord_edit_message(message_id, text) |
Редактировать сообщение, отправленное ботом |
discord_delete_message(message_id) |
Удалить сообщение |
discord_bulk_delete_messages(channel_id, message_ids) |
Удалить несколько сообщений за раз |
discord_get_message(channel_id, message_id) |
Получить сообщение |
discord_pin_message(message_id) |
Закрепить сообщение |
discord_unpin_message(message_id) |
Открепить сообщение |
Ограничения Discord: Нет ограничения по времени для редактирования или удаления собственных сообщений. Массовое удаление работает только для сообщений младше 14 дней, и за раз можно удалить от 2 до 100 сообщений.
Реакции
| Функция | Описание |
|---|---|
discord_send_reaction(message_id, reaction) |
Добавить реакцию |
discord_delete_reaction(message_id, reaction, user_id) |
Удалить реакцию. Если user_id опущен, удаляется реакция бота |
Параметр reaction принимает либо обычный эмодзи, например ❤️, либо ID пользовательского эмодзи сервера.
Где взять ID пользовательской реакции
Добавьте нужную пользовательскую реакцию к любому сообщению в канале.
В чате появится такой колбэк:
new_like beer:1479419477396291696 uid413984787162726410
Здесь:
beer:1479419477396291696
— это ID реакции.
Вы можете скопировать его и использовать в функциях реакций:
#{discord_send_reaction(discord_message_id, 'beer:1479419477396291696')}
Обычные эмодзи отображаются в колбэках как есть:
new_like ❤️ uid413984787162726410
где uid413984787162726410 — ID участника, добавившего реакцию.
Модерация
| Функция | Описание |
|---|---|
discord_timeout_member(user_id, seconds) |
Отправить участника в тайм-аут на указанное количество секунд, до 28 дней |
discord_remove_timeout(user_id) |
Досрочно снять тайм-аут |
discord_kick_member(user_id) |
Кикнуть участника с сервера; он может вернуться по приглашению |
discord_ban_member(user_id, delete_message_seconds) |
Забанить участника; второй аргумент указывает, сколько секунд истории сообщений удалить, до 7 дней |
discord_unban_member(user_id) |
Разбанить участника |
Discord не позволяет боту модерировать участника, чья роль выше роли бота. Владелец сервера также не может быть подвергнут модерации.
Роли и участники
| Функция | Описание |
|---|---|
discord_add_role(user_id, role_id) |
Назначить роль |
discord_remove_role(user_id, role_id) |
Снять роль |
discord_get_roles() |
Получить роли сервера и их ID |
discord_get_member(user_id) |
Получить данные участника, включая прозвище, роли и дату присоединения |
discord_set_nickname(user_id, nickname) |
Изменить прозвище участника на сервере |
Роль бота должна быть выше роли, которую он назначает.
Роль @everyone и роли, управляемые интеграциями, включая роли других ботов, не могут быть назначены.
Каналы и тикеты
| Функция | Описание |
|---|---|
discord_create_channel(name, type, parent_id, permission_overwrites) |
Создать канал |
discord_delete_channel(channel_id) |
Удалить канал |
discord_set_channel_permission(channel_id, target_id, allow, deny, type) |
Разрешить или запретить права доступа к каналу |
discord_create_invite(channel_id, max_age, max_uses) |
Создать ссылку-приглашение |
discord_get_invites() |
Получить ссылки-приглашения сервера |
Для discord_create_channel значение по умолчанию type:
| Значение | Тип канала |
|---|---|
0 |
Текстовый канал |
2 |
Голосовой канал |
4 |
Категория |
Вы можете передать ID категории в parent_id, чтобы создать канал внутри этой категории.
Для discord_set_channel_permission последний аргумент указывает, кто получает права:
| Значение | Цель |
|---|---|
1 |
Участник |
0 |
Роль |
Параметры allow и deny принимают следующие значения:
| Значение | Право |
|---|---|
1024 |
Просмотр канала |
2048 |
Отправка сообщений |
3072 |
Просмотр канала и отправка сообщений |
65536 |
Чтение истории сообщений |
Для discord_create_invite время жизни приглашения указывается в секундах.
Например:
86400
означает 24 часа.
Значение max_uses равное 0 означает неограниченное количество использований.
Слеш-команды
| Функция | Описание |
|---|---|
discord_get_commands() |
Получить команды, зарегистрированные на сервере |
discord_set_commands(commands) |
Заменить весь набор команд |
discord_set_commands принимает список команд:
#{discord_set_commands('[
{
"name": "rules",
"description": "Показать правила сервера"
},
{
"name": "warn",
"description": "Выдать предупреждение",
"options": [
{
"type": 6,
"name": "user",
"description": "Пользователь",
"required": true
},
{
"type": 3,
"name": "reason",
"description": "Причина",
"required": false
}
]
}
]')}
Требования Discord
-
nameдолжен содержать только строчные символы, без пробелов, и быть длиной от 1 до 32 символов. -
descriptionобязателен и должен быть длиной от 1 до 100 символов. - Обязательные опции должны располагаться перед необязательными.
- Передача пустого списка удаляет все команды бота с сервера.
Типы опций
| Тип | Описание |
|---|---|
3 |
Строка |
4 |
Целое число |
5 |
Булево значение |
6 |
Участник |
7 |
Канал |
8 |
Роль |
При вызове команды она отправляется в воронку в виде строки, например:
/warn @user spam
Иными словами, имя команды и значения опций разделяются пробелами.
Вы можете обработать её с помощью обычного текстового условия.
Отдельная функция для кнопок не требуется. Кнопки настраиваются в обычном блоке ответа, а нажатие кнопки обрабатывается так же, как слеш-команда: значение кнопки появляется в тексте.
Баллы и таблица лидеров
Интеграция с Discord включает встроенную систему благодарности. Баллы начисляются автору цитируемого сообщения.
Вы можете использовать её для создания уровней, рангов и таблиц лидеров.
| Функция | Описание |
|---|---|
discord_add_thanks_score(value) |
Добавить баллы автору цитируемого сообщения |
discord_add_thanks_score_for_answer(value) |
Добавить баллы участнику, который ответил |
discord_minus_thanks_score(value) |
Удалить баллы |
discord_get_score(user_id) |
Вернуть баллы участника в виде числа. Без аргумента использует автора события |
discord_get_level(user_id, points_per_level) |
Получить уровень участника. Порог по умолчанию: 100 баллов за уровень |
discord_get_user_info(user_id) |
Получить баллы, позицию в таблице лидеров и имя в виде одного объекта |
discord_get_top(count, shift, humanize, delimiter) |
Получить таблицу лидеров |
Для discord_get_top:
-
count— количество строк для возврата; -
shift— количество строк для пропуска, полезно для пагинации; -
humanize=true— возвращает готовый к отображению текст; -
delimiter— разделитель между именем участника и баллами.
При сравнении баллов в условии блока используйте discord_get_score. Эта функция возвращает число, поэтому числовые сравнения работают как ожидается.
Примеры
Приветствие нового участника через личное сообщение
Условие блока:
member_join
В поле Переменные:
discord_send_dm(
message_from,
'Привет, #{from_name}! Ознакомься с закреплёнными правилами.'
)
Удаление сообщения, содержащего стоп-слово, и тайм-аут участника на 24 часа
Условие блока: список стоп-слов.
Дополнительное условие:
is_admin != 1
Функции:
discord_delete_message(discord_message_id)
discord_timeout_member(message_from, 86400)
Назначение роли за реакцию на определённое сообщение
Условие блока:
new_like 🍕
Дополнительное условие:
contains(discord_message_id, '1534927170965602324')
Функция:
discord_add_role(
message_from,
'1465674567090704592'
)
Создание приватного канала тикета по кнопке
ticket = discord_create_channel(
'ticket-' + from_username
)
ticket_channel = get(
get(ticket, 'data'),
'id'
)
discord_set_channel_permission(
ticket_channel,
guild_id,
None,
1024,
0
)
discord_set_channel_permission(
ticket_channel,
message_from,
3072,
None,
1
)
discord_send_message(
ticket_channel,
'Опишите вашу проблему в одном сообщении.'
)
Первая строка разрешений скрывает канал от всех (здесь guild_id представляет роль @everyone).
Вторая строка делает канал доступным для участника, создавшего тикет.
Начисление баллов за благодарность и назначение роли по уровню
Условие блока:
thanks;thx;thank you
Дополнительное условие:
reply_from != '' and reply_from != message_from and reply_to_bot != 1
Функции:
discord_add_thanks_score(1)
if (discord_get_level(reply_from) >= 1) {
discord_add_role(
reply_from,
'1465674567090704592'
)
}
Условие:
reply_from != message_from
предотвращает начисление баллов самому себе.
Условие:
reply_to_bot != 1
предотвращает начисление баллов боту.
Показ своих баллов с помощью команды
Условие блока:
/xp
В поле Переменные:
points = discord_get_score()
lvl = discord_get_level()
Текст ответа:
#{from_name}, у вас #{points} XP · Уровень #{lvl}
Показ таблицы лидеров с помощью команды
Условие блока:
/top
Текст ответа:
🏆 Таблица лидеров XP:
#{discord_get_top(10, 0, true, ' — ')}