PexoBot · Dokumentace

Vlastní kód

Pište své vlastní příkazy a automatizace v Lua nebo JavaScript. Skript přijme událost a požádá robota, aby provedl akce prostřednictvím rozhraní API.

Jak to funguje

  1. Otevřete modul Custom code na řídicím panelu serveru a přidejte skript.
  2. Vyberte trigger (např. příkaz /ping) a jazyk. Lua se doporučuje.
  3. Napište kód. Proměnná event popisuje, co se stalo; funkce jako akce fronty reply().
  4. Klikněte na Run pro provedení testu (neprovádějí se žádné akce), poté na Save. Příkaz se na serveru objeví během několika sekund.

Skripty běží v izolované karanténě: žádný internet, soubory ani jiné servery. Bot provádí akce poté, co skript dokončí, a to pouze na vašem serveru.

Jazyky

Lua

Lua doporučeno

Lua 5.4 (WebAssembly) s vrstvou kompatibility LuaJIT / Lua 5.1: bit.band/bor/bxor/lshift/rshift/bnot, unpack, table.getn, math.pow. Nejrychlejší start a nejnižší využití paměti. Ne io, require, load, debug; os si ponechává time/clock/date.

JS

JavaScript

Moderní JavaScript (QuickJS, ES2023). Kód běží uvnitř funkce, takže můžete použít return – vrácená hodnota se stane odpovědí. Žádné fetch, require, časovače nebo asynchronní I/O.

Spouštěče

Spoušťevent.typeKdyreply()
Příkaz lomítkocommandNěkdo používá příkaz. Volitelný text přejde na event.input.odezva na příkaz
ZprávamessageZpráva začíná prefixem (např. !points). Zbytek → event.input. Prázdné = každá zpráva.odpovědět na zprávu
Připojte se / odejdětejoin / leaveČlen se připojí nebo opustí server.kanál z nastavení skriptu
ČasovačtimerKaždých N minut (zdarma: min 10 min, PexoBot+: 1 min). event.user = nula.kanál z nastavení skriptu

The event

poleTypPopis
event.typestringpříkaz, zpráva, připojení, odchod nebo časovač
event.commandstringnázev příkazu (pro příkaz)
event.inputstringtext za příkazem nebo předponou, jinak ""
event.user.id / .name / .tagstringID, zobrazované jméno a uživatelské jméno
event.user.botboolje bot
event.user.avatarstringURL avatara
event.member.rolesseznam IDčlenské role (bez @everyone)
event.member.nickstringpřezdívka serveru
event.member.adminboolOprávnění „Spravovat server“.
event.member.joinedAtnumberpřipojte se, paní
event.channel.id / .namestringkanál událostí
event.guild.id / .name / .members / .ownerIdstring / numberserver
event.message.id / .contentstringzpráva (pro zprávu)

Pole chybějící pro událost jsou nil (Lua) / null (JS).

API

Stejné funkce v Lua a JavaScript. Každá akce se započítává do limitu akce za běh.

FunkcePopis
reply(msg)Odpovědi na příkaz / zprávu nebo příspěvky do nakonfigurovaného kanálu (připojit se, odejít, časovač).
send(channelId, msg)Odešle zprávu kanálu na tomto serveru.
dm(userId, msg)Přímá zpráva pro člena serveru.
react(emoji)Reaguje na spouštěcí zprávu (např. "👍" nebo "<:name:id>").
addRole(userId, roleId) / removeRole(…)Přidá/odstraní roli. Role musí být pod rolí robota a nesmí mít správce.
log(...) / print(...)Zapisuje do protokolu — viditelné v testu řídicího panelu (neodesíláno do Discord).
kv.get(k) / kv.set(k, v) / kv.del(k)Trvalé úložiště dat serveru (text). Viz níže.
kv.num(k, def) / kv.add(k, n)Čísla: čtení s výchozím nastavením a přírůstkem (vrátí novou hodnotu).
kv.keys()Seznam klíčů.
random(a, b)Náhodné celé číslo od a do b (včetně).
now()Aktuální čas v milisekundách.
return msgLua & JS: vrácená hodnota = reply(), pokud skript již neodpověděl.
reply() přijímá řetězec, objekt { content, embed } nebo pole řetězců (spojených řádky). Prázdný text / null nic neodešle.

Zprávy a vložení

msg je text (až 2000 znaků) nebo tabulka/objekt:

Lua
reply({
  content = "Text nad vložením",
  embed = {
    title = "Název", description = "Popis s **markdown**", color = "#22c55e",
    fields = { { name = "pole", value = "Hodnota", inline = true } },
    image = "https://…/image.png", thumbnail = "https://…/mini.png", footer = "Zápatí",
  }
})

Uživatel zmíní práci (<@ID>), ale @everyone, @here a role nikdy nepingnou.

kv prodejna

Sdíleno všemi skripty na serveru, trvalé mezi spuštěními. Klíč až 100 znaků, hodnota až 2000 znaků (uloženo jako text — číst čísla pomocí kv.num). Procházejte a vymažte ji na kartě History & data. Testy řídicího panelu neukládají změny.

Lua
kv.set("motd", "Přeji hezký den!")
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")

Limity

FreePexoBot+
Doba běhu (Lua/JS)150 ms600 ms
Paměť16 MB64 MB
Akce za běh520
kv klíče1001000
Běží za minutu (server)30120
Skripty325
Časovač každý10 min1 min

Stejná osoba může spustit stejný skript maximálně jednou za 2 sekundy.

Příklady

Náhodný hod (příkaz /los)

Lua
-- /los — hodí číslo od 1 do daného maxima (výchozí 100)
local max = tonumber(event.input) or 100
reply("🎲 " .. event.user.name .. " válcované **" .. random(1, max) .. "**")
JS
// /los — hodí číslo od 1 do daného maxima (výchozí 100)
const max = Number(event.input) || 100;
return `🎲 ${event.user.name} válcované **${random(1, max)}**`;

Body s odměnou za roli („!punkty“ zpráva)

Lua
-- Zpráva začínající "!punkty": body aktivity v kv
local key = "pkt:" .. event.user.id
if event.input == "" then
  reply("máš **" .. kv.num(key) .. "** body.")
else
  local n = kv.add(key, 1)
  if n == 50 then addRole(event.user.id, "123456789012345678") end  -- ID role Discord
  react("⭐")
end

Vítejte s počítadlem (připojit se)

Lua
-- Member join: vítejte v nakonfigurovaném kanálu s počítadlem
local nr = kv.add("dolaczenia")
reply({
  content = "<@" .. event.user.id .. ">",
  embed = {
    title = "👋 Vítejte " .. event.guild.name .. "!",
    description = "Jste návštěvník **" .. nr .. ".** od spuštění robota.",
    color = "#8a3ffc",
    fields = { { name = "členové", value = tostring(event.guild.members), inline = true } },
  }
})

Rotující hroty (každých 60 minut)

JS
// Každých 60 minut: připomenutí s rotujícími texty
const tips = ['Pamatujte na pravidla 📜', 'Hlasujte pro server na Top.gg ⭐', 'Máte nápad? /suggest 💡'];
const i = kv.add('tip') % tips.length;
reply({ embed: { title: '💡 Tip', description: tips[i], color: '#eab308' } });

Chyby

Poslední běhy (s chybami) jsou na kartě History & data modulu.