PexoBot · Documentación

código personalizado

Escriba sus propios comandos y automatizaciones en Lua o JavaScript. Un script recibe un evento y le pide al bot que realice acciones a través de la API.

como funciona

  1. Abra el módulo Código personalizado en el panel de su servidor y agregue un script.
  2. Elija un trigger (por ejemplo, el comando /ping) y un idioma. Se recomienda Lua.
  3. Escribe el código. La variable event describe lo sucedido; funciona como acciones de cola reply().
  4. Haga clic en Run para probar (no se realiza ninguna acción), luego en Save. El comando aparece en el servidor en unos segundos.

Los scripts se ejecutan en un entorno aislado: sin Internet, archivos ni otros servidores. El bot realiza acciones después de que finaliza el script , y solo en su servidor.

Idiomas

Lua

Lua recomendado

Lua 5.4 (WebAssembly) con una capa de compatibilidad LuaJIT / Lua 5.1: bit.band/bor/bxor/lshift/rshift/bnot, unpack, table.getn, math.pow. Inicio más rápido y menor uso de memoria. Sin io, require, load, debug; os mantiene time/clock/date.

JS

JavaScript

Moderno JavaScript (QuickJS, ES2023). El código se ejecuta dentro de una función, por lo que puede usar return: el valor devuelto se convierte en la respuesta. Sin fetch, require, temporizadores ni E/S asíncronas.

Desencadenantes

gatilloevent.typecuandoreply()
comando de barra diagonalcommandAlguien usa el comando. El texto opcional va a event.input.respuesta de comando
MensajemessageUn mensaje comienza con el prefijo (por ejemplo, !points). El resto → event.input. Vacío = cada mensaje.responder al mensaje
Unirse / salirjoin / leaveUn miembro se une o abandona el servidor.canal desde la configuración del script
TemporizadortimerCada N minutos (Gratis: min 10 min, PexoBot+: 1 min). event.user = nulo.canal desde la configuración del script

el event

campoTipoDescripción
event.typestringcomando, mensaje, unirse, salir o temporizador
event.commandstringnombre del comando (para el comando)
event.inputstringtexto después del comando o prefijo, de lo contrario ""
event.user.id / .name / .tagstringID, nombre para mostrar y nombre de usuario
event.user.botbooles un robot
event.user.avatarstringURL de avatar
event.member.roleslista de identificacionesroles de miembros (sin @todos)
event.member.nickstringapodo del servidor
event.member.adminboolPermiso “Administrar servidor”
event.member.joinedAtnumberúnete al tiempo, sra.
event.channel.id / .namestringcanal de eventos
event.guild.id / .name / .members / .ownerIdstring / numberservidor
event.message.id / .contentstringmensaje (para mensaje)

Los campos que faltan para un evento son nil (Lua) / null (JS).

API

Las mismas funciones en Lua y JavaScript. Cada acción cuenta para el límite de acciones por ejecución.

FunciónDescripción
reply(msg)Responde al comando/mensaje, o publica en el canal configurado (unirse, salir, temporizador).
send(channelId, msg)Envía un mensaje a un canal en este servidor.
dm(userId, msg)Mensaje directo a un miembro del servidor.
react(emoji)Reacciona al mensaje desencadenante (por ejemplo, "👍" o "<:name:id>").
addRole(userId, roleId) / removeRole(…)Agrega/elimina un rol. El rol debe estar por debajo del rol del bot y no puede tener Administrador.
log(...) / print(...)Escribe en el registro: visible en la prueba del panel (no enviado a Discord).
kv.get(k) / kv.set(k, v) / kv.del(k)Almacén de datos de servidor persistente (texto). Vea abajo.
kv.num(k, def) / kv.add(k, n)Números: se lee con valor predeterminado e incrementa (devuelve el nuevo valor).
kv.keys()Lista de claves.
random(a, b)Entero aleatorio de a a b (inclusive).
now()Hora actual en milisegundos.
return msgLua y JS: el valor devuelto = respuesta(), a menos que el script ya haya respondido.
respuesta() acepta una cadena, un objeto {contenido, incrustar} o una matriz de cadenas (unidas por líneas). El texto vacío/nulo no envía nada.

Mensajes e incrustaciones

msg es texto (hasta 2000 caracteres) o una tabla/objeto:

Lua
reply({
  content = "Texto encima de la inserción",
  embed = {
    title = "Título", description = "Descripción con **rebaja**", color = "#22c55e",
    fields = { { name = "campo", value = "Valor", inline = true } },
    image = "https://…/image.png", thumbnail = "https://…/mini.png", footer = "Pie de página",
  }
})

El usuario menciona el trabajo (<@ID>), pero @everyone, @here y los roles nunca hacen ping.

tienda kv

Compartido por todos los scripts del servidor, persistente entre ejecuciones. Introduzca hasta 100 caracteres, valore hasta caracteres 2000 (almacenados como texto; lea números con kv.num). Examínelo y bórrelo en la pestaña Historial y datos. Las pruebas del panel no guardan los cambios.

Lua
kv.set("motd", "¡Que tengas un buen día!")
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")

Límites

FreePexoBot+
Tiempo de ejecución (Lua/JS)150 ms600 ms
Memoria16 MB64 MB
Acciones por ejecución520
teclas kv1001000
Ejecuciones por minuto (servidor)30120
Guiones325
Temporizador cada10 min1 min

La misma persona puede ejecutar el mismo script como máximo una vez cada 2 segundos.

Ejemplos

Tirada aleatoria (comando /los)

Lua
-- /los: saca un número desde 1 hasta el máximo dado (predeterminado 100)
local max = tonumber(event.input) or 100
reply("🎲 " .. event.user.name .. " enrollado **" .. random(1, max) .. "**")
JS
// /los: saca un número desde 1 hasta el máximo dado (predeterminado 100)
const max = Number(event.input) || 100;
return `🎲 ${event.user.name} enrollado **${random(1, max)}**`;

Puntos con recompensa de rol (mensaje "!punkty")

Lua
-- Mensaje que comienza con "!punkty": puntos de actividad en kv
local key = "pkt:" .. event.user.id
if event.input == "" then
  reply("tienes **" .. kv.num(key) .. "** puntos.")
else
  local n = kv.add(key, 1)
  if n == 50 then addRole(event.user.id, "123456789012345678") end  -- ID de rol Discord
  react("⭐")
end

Bienvenida con un mostrador (unirse)

Lua
-- Unirse a miembros: bienvenido en el canal configurado con un contador
local nr = kv.add("dolaczenia")
reply({
  content = "<@" .. event.user.id .. ">",
  embed = {
    title = "👋 Bienvenido a " .. event.guild.name .. "!",
    description = "Eres visitante **" .. nr .. ".** desde que comenzó el bot.",
    color = "#8a3ffc",
    fields = { { name = "Miembros", value = tostring(event.guild.members), inline = true } },
  }
})

Puntas giratorias (cada 60 min)

JS
// Cada 60 minutos: recordatorio con textos rotativos
const tips = ['Recuerda las reglas 📜', 'Vota por el servidor en Top.gg ⭐', '¿Tienes una idea? /suggest💡'];
const i = kv.add('tip') % tips.length;
reply({ embed: { title: '💡 Consejo', description: tips[i], color: '#eab308' } });

Errores

Las ejecuciones recientes (con errores) se encuentran en la pestaña History & data del módulo.