PexoBot · Dokumentacja

Własny kod

Pisz własne komendy i automatyzacje w Lua albo JavaScript. Skrypt dostaje zdarzenie, a funkcjami API zleca botowi akcje.

Jak to działa

  1. W panelu serwera otwórz moduł Własny kod i dodaj skrypt.
  2. Wybierz wyzwalacz (np. komenda /ping) i język. Lua jest zalecana.
  3. Napisz kod. Zmienna event opisuje, co się stało; funkcje takie jak reply() zlecają akcje.
  4. Kliknij Uruchom, żeby przetestować (akcje się nie wykonają), potem Zapisz. Komenda pojawi się na serwerze po kilku sekundach.

Skrypt działa w izolowanej piaskownicy: nie ma dostępu do internetu, plików ani innych serwerów. Akcje wykonuje bot po zakończeniu skryptu i tylko na Twoim serwerze.

Języki

Lua

Lua zalecany

Lua 5.4 (WebAssembly) z warstwą zgodności z LuaJIT / Lua 5.1: bit.band/bor/bxor/lshift/rshift/bnot, unpack, table.getn, math.pow. Najszybszy start i najmniejsze zużycie pamięci. Bez io, require, load, debug; z os zostają time/clock/date.

JS

JavaScript

Nowoczesny JavaScript (QuickJS, ES2023). Kod działa wewnątrz funkcji, więc możesz użyć return — zwrócona wartość staje się odpowiedzią. Bez fetch, require, timerów i async I/O.

Wyzwalacze

Wyzwalaczevent.typeKiedyreply()
Komenda /commandKtoś użyje komendy. Opcjonalny tekst trafia do event.input.odpowiedź na komendę
WiadomośćmessageWiadomość zaczyna się od prefiksu (np. !punkty). Reszta tekstu → event.input. Puste = każda wiadomość.odpowiedź na wiadomość
Dołączenie / wyjściejoin / leaveOsoba dołączy albo opuści serwer.kanał z ustawień skryptu
Co jakiś czastimerCo N minut (Free: min. 10 min, PexoBot+: 1 min). event.user = nil.kanał z ustawień skryptu

Obiekt event

PoleTypOpis
event.typestringcommand, message, join, leave albo timer
event.commandstringnazwa komendy (dla command)
event.inputstringtekst po komendzie lub prefiksie, w przeciwnym razie ""
event.user.id / .name / .tagstringID, wyświetlana nazwa i nazwa użytkownika
event.user.botboolczy to bot
event.user.avatarstringadres avatara
event.member.roleslista IDrole osoby (bez @everyone)
event.member.nickstringpseudonim na serwerze
event.member.adminbooluprawnienie „Zarządzanie serwerem”
event.member.joinedAtnumberkiedy dołączył(a), ms
event.channel.id / .namestringkanał zdarzenia
event.guild.id / .name / .members / .ownerIdstring / numberserwer
event.message.id / .contentstringwiadomość (dla message)

Pola, których nie ma w danym zdarzeniu, mają wartość nil (Lua) / null (JS).

API

Te same funkcje w Lua i JavaScript. Każda akcja liczy się do limitu akcji na uruchomienie.

FunkcjaOpis
reply(msg)Odpowiada na komendę / wiadomość albo pisze na kanał z ustawień (join, leave, timer).
send(channelId, msg)Wysyła wiadomość na kanał tego serwera.
dm(userId, msg)Wiadomość prywatna do członka serwera.
react(emoji)Reakcja na wiadomość, która uruchomiła skrypt (np. "👍" albo "<:nazwa:id>").
addRole(userId, roleId) / removeRole(…)Nadaje / zabiera rolę. Rola musi być niżej niż rola bota i nie może mieć uprawnień administratora.
log(...) / print(...)Zapis do logu — widoczny w teście w panelu (nie trafia na Discorda).
kv.get(k) / kv.set(k, v) / kv.del(k)Trwały magazyn danych serwera (tekst). Zobacz niżej.
kv.num(k, def) / kv.add(k, n)Liczby: odczyt z wartością domyślną i dodawanie (zwraca nową wartość).
kv.keys()Lista kluczy.
random(a, b)Losowa liczba całkowita od a do b (włącznie).
now()Aktualny czas w milisekundach.
return msgLua i JS: zwrócona wartość = reply(), jeśli skrypt sam nie odpowiedział.
reply() przyjmuje tekst, obiekt { content, embed } albo tablicę tekstów (łączoną w linie). Pusty tekst / null nic nie wysyła.

Wiadomości i embedy

msg to tekst (do 2000 znaków) albo tabela/obiekt:

Lua
reply({
  content = "Tekst nad embedem",
  embed = {
    title = "Tytuł", description = "Opis z **markdown**", color = "#22c55e",
    fields = { { name = "Pole", value = "Wartość", inline = true } },
    image = "https://…/obraz.png", thumbnail = "https://…/mini.png", footer = "Stopka",
  }
})

Wzmianki osób działają (<@ID>), ale @everyone, @here i role nigdy nie pingują.

Magazyn kv

Wspólny dla wszystkich skryptów serwera, trwały między uruchomieniami. Klucz do 100 znaków, wartość do 2000 znaków (zapisywana jako tekst — liczby odczytuj przez kv.num). Podgląd i czyszczenie: zakładka Historia i dane. Test w panelu nie zapisuje zmian.

Lua
kv.set("motd", "Miłego dnia!")
local wizyty = kv.add("wizyty:" .. event.user.id)   -- 1, 2, 3…
if kv.get("motd") then reply(kv.get("motd") .. " (" .. wizyty .. ")") end
kv.del("stare")

Limity

FreePexoBot+
Czas działania (Lua/JS)150 ms600 ms
Pamięć16 MB64 MB
Akcje na uruchomienie520
Klucze kv1001000
Uruchomienia na minutę (serwer)30120
Skrypty325
Minutnik co10 min1 min

Ta sama osoba może uruchomić ten sam skrypt najwyżej co 2 sekundy.

Przykłady

Losowanie (komenda /los)

Lua
-- /los — losuje liczbę od 1 do podanej (domyślnie 100)
local max = tonumber(event.input) or 100
reply("🎲 " .. event.user.name .. " wylosował(a) **" .. random(1, max) .. "**")
JS
// /los — losuje liczbę od 1 do podanej (domyślnie 100)
const max = Number(event.input) || 100;
return `🎲 ${event.user.name} wylosował(a) **${random(1, max)}**`;

Punkty i nagroda rolą (wiadomość „!punkty”)

Lua
-- Wiadomość zaczynająca się od "!punkty": punkty za aktywność w kv
local key = "pkt:" .. event.user.id
if event.input == "" then
  reply("Masz **" .. kv.num(key) .. "** pkt.")
else
  local n = kv.add(key, 1)
  if n == 50 then addRole(event.user.id, "123456789012345678") end  -- ID roli z Discorda
  react("⭐")
end

Powitanie z licznikiem (dołączenie)

Lua
-- Dołączenie osoby: powitanie na kanale z ustawień + licznik
local nr = kv.add("dolaczenia")
reply({
  content = "<@" .. event.user.id .. ">",
  embed = {
    title = "👋 Witaj na " .. event.guild.name .. "!",
    description = "Jesteś naszym **" .. nr .. ".** gościem od startu bota.",
    color = "#8a3ffc",
    fields = { { name = "Członkowie", value = tostring(event.guild.members), inline = true } },
  }
})

Rotujące wskazówki (co 60 min)

JS
// Co 60 minut: przypomnienie z rotującymi tekstami
const tips = ['Pamiętaj o regulaminie 📜', 'Zagłosuj na serwer na Top.gg ⭐', 'Masz pomysł? /suggest 💡'];
const i = kv.add('tip') % tips.length;
reply({ embed: { title: '💡 Wskazówka', description: tips[i], color: '#eab308' } });

Błędy

Historia ostatnich uruchomień (z błędami) jest w zakładce Historia i dane modułu.