PexoBot · Документація

Спеціальний код

Напишіть власні команди та засоби автоматизації на Lua або JavaScript. Сценарій отримує подію та просить бота виконати дії через API.

Як це працює

  1. Відкрийте модуль Custom code на інформаційній панелі сервера та додайте сценарій.
  2. Виберіть trigger (наприклад, команду /ping) і мову. Рекомендується Lua.
  3. Напишіть код. Змінна event описує, що сталося; функціонує як дії черги reply().
  4. Натисніть Run для перевірки (жодних дій не виконується), а потім Save. Команда з'являється на сервері протягом декількох секунд.

Сценарії виконуються в ізольованому програмному середовищі: немає Інтернету, файлів чи інших серверів. Бот виконує дії after завершує скрипт і тільки на вашому сервері.

Мови

Lua

Lua рекомендований

Lua 5.4 (WebAssembly) із рівнем сумісності LuaJIT / Lua 5.1: bit.band/bor/bxor/lshift/rshift/bnot, unpack, table.getn, math.pow. Найшвидший запуск і найменше використання пам'яті. № io, require, load, debug; os зберігає time/clock/date.

JS

JavaScript

Сучасний JavaScript (QuickJS, ES2023). Код виконується всередині функції, тому ви можете використовувати return — повернуте значення стає відповіддю. Без fetch, require, таймерів або асинхронного введення/виведення.

Тригери

Тригерevent.typeКолиreply()
Слеш командаcommandХтось використовує команду. Додатковий текст переходить до event.input.відповідь на команду
повідомленняmessageПовідомлення починається з префікса (наприклад, !points). Решта → event.input. Порожньо = кожне повідомлення.відповісти на повідомлення
Приєднатися / вийтиjoin / leaveУчасник приєднується або залишає сервер.канал із налаштувань сценарію
ТаймерtimerКожні N хвилин (безкоштовно: хв. 10 хв., PexoBot+: хв. 1). event.user = нуль.канал із налаштувань сценарію

The event

ПолеТипопис
event.typestringкоманда, повідомлення, приєднання, вихід або таймер
event.commandstringназва команди (для команди)
event.inputstringтекст після команди або префікса, інакше ""
event.user.id / .name / .tagstringID, відображуване ім’я та ім’я користувача
event.user.botboolце бот
event.user.avatarstringURL-адреса аватара
event.member.rolesсписок ідентифікаторівролі учасників (без @everyone)
event.member.nickstringпсевдонім сервера
event.member.adminboolДозвіл «Керувати сервером».
event.member.joinedAtnumberчас приєднання, мс
event.channel.id / .namestringканал подій
event.guild.id / .name / .members / .ownerIdstring / numberсервер
event.message.id / .contentstringповідомлення (для повідомлення)

Відсутні поля для події: nil (Lua) / null (JS).

API

Такі ж функції в Lua та JavaScript. Кожна дія зараховується до ліміту дій на виконання.

функціяопис
reply(msg)Відповідає на команду/повідомлення або публікує на налаштованому каналі (приєднатися, залишити, таймер).
send(channelId, msg)Надсилає повідомлення на канал на цьому сервері.
dm(userId, msg)Пряме повідомлення учаснику сервера.
react(emoji)Реагує на повідомлення ініціатора (наприклад, «👍» або «<:name:id>»).
addRole(userId, roleId) / removeRole(…)Додає / видаляє роль. Роль має бути нижчою за роль бота та не може мати права адміністратора.
log(...) / print(...)Записує в журнал — видно в тесті приладової панелі (не надсилається на Discord).
kv.get(k) / kv.set(k, v) / kv.del(k)Постійне сховище даних сервера (текст). Дивіться нижче.
kv.num(k, def) / kv.add(k, n)Числа: читання із замовчуванням і збільшенням (повертає нове значення).
kv.keys()Список ключів.
random(a, b)Випадкове ціле число від a до b (включно).
now()Поточний час у мілісекундах.
return msgLua & JS: повернуте значення = reply(), якщо сценарій уже не відповів.
reply() приймає рядок, об’єкт { content, embed } або масив рядків (об’єднаних лініями). Порожній текст / null нічого не надсилає.

Повідомлення та вставки

msg — це текст (до 2000 символів) або таблиця/об’єкт:

Lua
reply({
  content = "Текст над вставкою",
  embed = {
    title = "Назва", description = "Опис із **уцінкою**", color = "#22c55e",
    fields = { { name = "Поле", value = "Значення", inline = true } },
    image = "https://…/image.png", thumbnail = "https://…/mini.png", footer = "нижній колонтитул",
  }
})

Користувач згадує роботу (<@ID>), але @кожний, @тут і ролі ніколи не пінгують.

магазин кв

Спільний для всіх сценаріїв на сервері, постійний між запусками. Ключ до 100 символів, значення до 2000 символів (зберігається як текст — читайте числа за допомогою kv.num). Перегляньте та очистіть його на вкладці History & data. Тести інформаційної панелі не зберігають зміни.

Lua
kv.set("motd", "Гарного дня!")
local visits = kv.add("visits:" .. event.user.id)   -- 1, 2, 3…
if kv.get("motd") then reply(kv.get("motd") .. " (" .. visits .. ")") end
kv.del("old")

Межі

FreePexoBot+
Час роботи (Lua/JS)150 ms600 ms
Пам'ять16 MB64 MB
Дії за прогін520
ключі kv1001000
Пробігів за хвилину (сервер)30120
Сценарії325
Таймер кожен10 min1 min

Одна й та сама особа може запускати той самий сценарій не більше одного разу на 2 секунди.

Приклади

Випадковий кидок (команда /los)

Lua
-- /los — кинути число від 1 до заданого максимуму (за замовчуванням 100)
local max = tonumber(event.input) or 100
reply("🎲 " .. event.user.name .. " згорнутий **" .. random(1, max) .. "**")
JS
// /los — кинути число від 1 до заданого максимуму (за замовчуванням 100)
const max = Number(event.input) || 100;
return `🎲 ${event.user.name} в рулоні **${random(1, max)}**`;

Очки з винагородою за роль (повідомлення «!punkty»)

Lua
-- Повідомлення, що починається на "!punkty": бали активності в кв
local key = "pkt:" .. event.user.id
if event.input == "" then
  reply("ти маєш **" .. kv.num(key) .. "** балів.")
else
  local n = kv.add(key, 1)
  if n == 50 then addRole(event.user.id, "123456789012345678") end  -- Ідентифікатор ролі Discord
  react("⭐")
end

Ласкаво просимо з лічильником (приєднуйтесь)

Lua
-- Приєднання до учасників: вітаємо в налаштованому каналі з лічильником
local nr = kv.add("dolaczenia")
reply({
  content = "<@" .. event.user.id .. ">",
  embed = {
    title = "👋 Ласкаво просимо до " .. event.guild.name .. "!",
    description = "Ви відвідувач **" .. nr .. ".** з моменту запуску бота.",
    color = "#8a3ffc",
    fields = { { name = "Члени", value = tostring(event.guild.members), inline = true } },
  }
})

Обертові підказки (кожні 60 хв)

JS
// Кожні 60 хвилин: нагадування зі змінним текстом
const tips = ['Пам\'ятайте про правила📜', 'Голосуйте за сервер на Top.gg ⭐', 'Є ідея? /suggest 💡'];
const i = kv.add('tip') % tips.length;
reply({ embed: { title: '💡 Порада', description: tips[i], color: '#eab308' } });

Помилки

Останні запуски (з помилками) знаходяться на вкладці History & data модуля.