Функції можна викликати в полі 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)}
Якщо вам потрібні дані, яких немає в попередньо визначених змінних, повний вебхук доступний у змінній discord_webhook. Вона заповнюється, коли будь-якому значенню присвоюється змінна save_webhook:
data = discord_webhook["data"]
msg_id = data["id"]
result = discord_reply_to_message(msg_id, "This is a reply to the message")
Змінні, що створюються автоматично
Ці змінні заповнюються автоматично для кожної події та не потребують додаткового налаштування.
| Змінна | Опис | Приклад |
|---|---|---|
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 |
Текст повідомлення, на яке відповідають | who is on duty today? |
Префікси 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
Детальніше див. у розділі Reactions.
Якщо блок має спрацьовувати лише на звичайні повідомлення, надіслані учасниками, додайте наступну умову:
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": "Show server rules"
},
{
"name": "warn",
"description": "Issue a warning",
"options": [
{
"type": 6,
"name": "user",
"description": "User",
"required": true
},
{
"type": 3,
"name": "reason",
"description": "Reason",
"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, ' — ')}