| Evento | Parámetros | Se dispara cuando |
| messageCreate | message | Mensaje enviado |
| messageDelete | message | Mensaje eliminado |
| messageEdit | message | Mensaje editado |
| memberJoin | member | Miembro entró |
| memberLeave | member | Miembro salió |
| memberUpdate | member | Miembro actualizado |
| buttonClick | interaction | Botón clicado |
| selectMenu | interaction | Menú seleccionado |
| command | "nome", message, args | Comando por prefijo |
| reactionAdd | emoji, user, message | Reacción añadida |
| reactionRemove | emoji, user, message | Reacción eliminada |
| voiceJoin | member | Entró a canal de voz |
| voiceLeave | member | Salió de canal de voz |
| banAdd | user | Usuario baneado |
| banRemove | user | Ban eliminado |
| channelCreate | channel | Canal creado |
| channelDelete | channel | Canal eliminado |
| Propiedad / Método | Tipo | Descripción |
| .id | string | ID del mensaje |
| .content | string | Texto del mensaje |
| .author | object | Autor — id, username, isBot… |
| .channel | string | ID del canal |
| .reply(texto, opts?) | function | Responde al mensaje. opts.embed, opts.components |
| .edit(texto, opts?) | function | Edita el mensaje |
| .delete() | function | Elimina el mensaje |
| .react(emoji) | function | Añade una reacción. Ej: "👋" |
| .pin() | function | Fija el mensaje |
| .unpin() | function | Desfija el mensaje |
| Propiedad / Método | Tipo | Descripción |
| .id | string | ID del usuario |
| .username | string | Nombre de usuario |
| .nickname | string | Apodo en el servidor |
| .avatar | string | URL del avatar |
| .roles | array | IDs de roles |
| .createdAt | string | Fecha de creación (ISO) |
| .joinedAt | string | Fecha de entrada al servidor (ISO) |
| .isBot | bool | Si es un bot |
| .permissions | string | Bitfield de permisos |
| .send(texto, opts?) | function | Envía un DM |
| .addRole(id) | function | Añade un rol |
| .removeRole(id) | function | Elimina un rol |
| .timeout(ms) | function | Aplica un timeout en milisegundos |
| .removeTimeout() | function | Elimina el timeout |
| .ban(motivo?) | function | Banea al usuario |
| .kick() | function | Expulsa del servidor |
| Propiedad / Método | Tipo | Descripción |
| .id | string | ID del canal |
| .name | string | Nombre del canal |
| .type | number | Tipo (0=texto, 2=voz, 5=anuncio…) |
| .category | string | ID de la categoría padre |
| .send(texto, opts?) | function | Envía un mensaje en el canal |
| .rename(nome) | function | Renombra el canal |
| .lock() | function | Bloquea el envío para @everyone |
| .unlock() | function | Desbloquea el canal |
| Propiedad | Tipo | Descripción |
| .id | string | ID del servidor |
| .name | string | Nombre del servidor |
| .memberCount | number | Total de miembros |
| .owner | string | ID del dueño |
| .roles | array | IDs de todos los roles |
| .channels | array | IDs de todos los canales |
| Propiedad / Método | Tipo | Descripción |
| .customId | string | ID del componente clicado |
| .values | array | Valores seleccionados (SelectMenu) |
| .userId | string | ID de quien disparó la interacción |
| .user() | function | Devuelve el objeto User completo de quien disparó la interacción (async) |
| .reply(texto, opts?) | function | Responde. opts.ephemeral, opts.embed, opts.components |
| .update(texto, opts?) | function | Actualiza el propio mensaje del componente clicado (mismos opts que .reply()) — solo funciona en respuesta a buttonClick/selectMenu aún no respondidos |
| .defer(ephemeral?) | function | Aplaza la respuesta (muestra loading) |
| .edit(texto, opts?) | function | Edita la respuesta original |
| .followUp(texto, opts?) | function | Envía un mensaje de seguimiento |
| .showModal(modal) | Modal | Abre un formulario emergente — ver la sección Modal |
| Método | Parámetro | Descripción |
| .setTitle(v) | string | Título del embed |
| .setDescription(v) | string | Descripción |
| .setColor(v) | string | number | Color. Ej: "#A9D6FF", "Blurple", 0x5865F2 |
| .setURL(v) | string | URL del título |
| .setTimestamp(v?) | string | nil | Timestamp. nil = ahora |
| .setThumbnail(url) | string | Imagen pequeña (arriba a la derecha) |
| .setImage(url) | string | Imagen grande (pie) |
| .setAuthor(opts) | object | { name, url?, iconURL? } |
| .setFooter(opts) | object | { text, iconURL? } |
| .addFields(...fields) | object[] | { name, value, inline? } — múltiples |
| .setFields(...fields) | object[] | Reemplaza todos los campos |
Nombres de colores disponibles en setColor()
Default
White
Aqua
Green
Blue
Yellow
Purple
LuminousVividPink
Fuchsia
Gold
Orange
Red
Grey
Navy
DarkGold
DarkOrange
Blurple
Greyple
DarkButNotBlack
NotQuiteBlack
DarkGreen
DarkBlue
DarkRed
DarkGrey
DarkerGrey
LightGrey
DarkNavy
Random
| Método | Parámetro | Descripción |
| .setTitle(v) | string | Título del formulario (máx. 45 caracteres) |
| .addTextInput(customId, label, opts?) | string, string, object? | Añade un campo de texto. opts: { style: "short"|"long", placeholder, required, minLength, maxLength, value } |
| .onSubmit(fn, opts?) | function, object? | Registra el envío del formulario. fn(interaction, fields) — fields tiene el valor de cada campo por su customId. opts: { user: true|"id", ttl: ms } |
| En el objeto de interacción | Parámetro | Descripción |
| interaction.showModal(modal) | Modal | Abre el formulario. modal ya debe haber pasado por .onSubmit(fn) |
Limitación de Discord: un Modal solo se abre en respuesta a una interacción ya existente (dentro de on(buttonClick) o on(selectMenu), o en el .onClick() temporal de un Button/SelectMenu) — nunca desde on(command), que es un mensaje normal sin token de interacción detrás.
on command("feedback", message, args)
let btn = Button()
.setLabel("Dar feedback")
.onClick(function(interaction)
let modal = Modal()
.setTitle("Feedback")
.addTextInput("nota", "Nota de 1 a 5", { style: "short" })
.addTextInput("comentario", "Comentário", { style: "long", required: false })
.onSubmit(function(interaction, fields)
interaction.reply("Recebido! Nota: " .. fields.nota .. " — " .. fields.comentario)
end)
interaction.showModal(modal)
end)
message.reply("Clica pra dar feedback:", { components: [btn] })
end
| Método | Parámetros | Retorno |
| db.set(chave, valor) | string, any | — |
| db.get(chave) | string | any | nil |
| db.has(chave) | string | bool |
| db.delete(chave) | string | — |
| Método | Parámetros | Retorno |
| .set(chave, valor) | string, any | — |
| .get(chave) | string | any | nil |
| .has(chave) | string | bool |
| .add(chave, n) | string, number | number (novo valor) |
| .sub(chave, n) | string, number | number (novo valor) |
| Método | Parámetros | Retorno |
| .set(chave, valor) | string, any | — |
| .get(chave) | string | any | nil |
| Función | Parámetros | Retorno |
| length(s) | string | number |
| contains(s, sub) | string, string | bool |
| replace(s, de, para) | string, string, string | string |
| split(s, sep) | string, string | array |
| join(arr, sep) | array, string | string |
| lower(s) | string | string |
| upper(s) | string | string |
| trim(s) | string | string |
| tostring(v) | any | string |
| tonumber(s) | string | number |
| type(v) | any | string |
| Función | Parámetros | Retorno |
| random(min, max) | number, number | number — entero entre min y max |
| random() | — | number — decimal entre 0 y 1 |
| round(n) | number | number |
| floor(n) | number | number |
| ceil(n) | number | number |
| abs(n) | number | number |
| max(a, b, …) | ...number | number |
| min(a, b, …) | ...number | number |
| Función | Parámetros | Retorno |
| push(arr, v) | array, any | array |
| pop(arr) | array | any — último elemento |
| insert(arr, i, v) | array, number, any | array |
| remove(arr, i) | array, number | array |
| size(v) | array | object | number |
| keys(obj) | object | array de cadenas |
| values(obj) | object | array de valores |
| Función | Parámetros | Retorno |
| json.encode(v) | any | string — JSON |
| json.decode(s) | string | object | nil |
| Función | Parámetros | Descripción |
| print(…) | ...any | Muestra en la consola del Dashboard |
| wait(ms) | number | Espera N ms. Máximo acumulado: 30 000ms por ejecución |
| sendMessage(canal, texto, opts?) | string|object, string, object? | Envía un mensaje. opts.embed, opts.components |
| sendDM(user, texto, opts?) | string|object, string, object? | Envía un DM directo |
| getUser() | — | Devuelve el usuario del contexto actual |
| getChannel(id?) | string? | Devuelve un canal (del contexto o por ID) |
| getGuild() | — | Devuelve el servidor actual |
| getInteraction() | — | Devuelve la interacción actual |
| getMessage() | — | Devuelve el mensaje del contexto |
| PREFIX | string | Constante con el prefijo de comandos configurado en el servidor (ej: "!") — no es una función, es una variable global |
| runFlow(flowId) | string |
Ejecuta un Flujo del Logic Builder por su ID, compartiendo el servidor/canal/usuario del contexto actual.
🌙 Lua Crescente+
|
Peticiones HTTP fuera de Discord. Siempre pasan por el mismo filtro de seguridad: límite de tamaño de respuesta, timeout, bloqueo de localhost/IPs privadas y un límite de peticiones por ejecución de script.
| Función | Parámetros | Retorno |
| http.get(url, opts?) | string, object? | { ok, status, headers, body, json, text } |
| http.post(url, body?, opts?) | string, any?, object? |
| http.put(url, body?, opts?) | string, any?, object? |
| http.patch(url, body?, opts?) | string, any?, object? |
| http.delete(url, opts?) | string, object? |
opts.headers acepta un objeto de cabeceras personalizadas en todos los métodos. En servidores sin esta función habilitada, llamar a cualquier método de http lanza un error explicando el plan necesario.
| Función | Parámetros | Retorno |
| webhook.send(url, texto, opts?) |
string, string, object? |
{ ok, status } |
Envía un mensaje mediante un Webhook de Discord (URL externa). opts.username, opts.avatarUrl y opts.embed son opcionales.
Todo parámetro de tiempo de abajo acepta 3 formatos: un número en milisegundos (60000), una duración como texto ("1h", "30m", "10s", "2d"), o una hora fija en formato "HH:MM" (ej: "9:00") — en ese caso, se ejecuta la próxima vez que llegue esa hora.
| Función | Parámetros | Descripción |
| schedule(tempo, canal, texto, opts?) |
number|string, string|object, string, object? |
Programa un mensaje. Sin opts.recurrente, se ejecuta una sola vez. Con { recurrente: true }: si tiempo es una hora ("9:00"), se repite todos los días a esa hora; si es una duración ("2h"), se repite cada ese intervalo. Devuelve el id de la programación.
|
| cancelSchedule(id) | string | Cancela una programación pendiente por el id devuelto por schedule() |
| listSchedules() | — | Lista las programaciones pendientes de este servidor: { id, channelId, texto, executeAt, recorrente }[] |
| cooldown(chave, tempo) | string, number|string | Devuelve true si el usuario actual puede actuar ahora (y marca el cooldown); false si aún está en espera |
| cooldownRestante(chave) | string | Milisegundos restantes del cooldown con esa clave para el usuario actual (0 si no hay ninguno) |
on command("bomdia", message, args)
schedule("9:00", message.channel, "☀️ Bom dia!", { recorrente: true })
message.reply("Agendado pra todo dia às 9h.")
end
on command("lembrar", message, args)
if not cooldown("lembrar", "1m") then
message.reply("⏳ Espera um pouco antes de criar outro lembrete.")
return
end
schedule("1h", message.channel, "⏰ Lembrete: " .. args._[0])
message.reply("Beleza! Te lembro em 1 hora.")
end
| Op. | Descripción | Exemplo |
| + | Suma | 2 + 3 → 5 |
| - | Resta | 10 - 4 → 6 |
| * | Multiplicación | 3 * 4 → 12 |
| / | División | 10 / 2 → 5 |
| % | Módulo | 10 % 3 → 1 |
| .. | Concatenación | "Oi ".."Ayami" |
| Op. | Descripción |
| == | Igual |
| != | Diferente |
| < | Menor que |
| > | Mayor que |
| <= | Menor o igual |
| >= | Mayor o igual |
| and | Y lógico |
| or | O lógico |
| not | Negación |
let
const
function
return
if
elseif
else
then
end
while
for
in
do
break
continue
on
import
export
from
and
or
not
true
false
nil
new
| Límite | Valor |
| Pasos por ejecución | 50 000 |
| Profundidad de recursión | 200 niveles |
| Total de wait() por ejecución | 30 000ms |
| Scripts simultáneos por servidor | 20 |
| Salidas de print() por ejecución | 200 líneas |
| TTL de los logs | 7 días |
| Plan | Archivos .logic | Funciones por archivo | HTTP / Webhook / runFlow | Bono en /daily |
| Gratis | 6 | 15 | ❌ Bloqueado | — |
| Nueva Estrella | 15 | 40 | ❌ Bloqueado | 1.5x |
| Luna Creciente | 35 | Ilimitado | ✅ Habilitado | 2.5x |
| Constellation | Ilimitado | Ilimitado | ✅ Habilitado | 3.5x |
"Funciones por archivo" cuenta solo las declaraciones function/export function en el nivel superior del archivo (fuera de bloques on(...)). HTTP, Webhook y runFlow() se habilitan a partir del plan Luna Creciente — llamarlos sin el plan necesario lanza un error explicando el plan mínimo requerido.