Consulta rápida

Referencia Logic Script

Todas las tablas en un solo lugar. Sin explicaciones — solo los nombres, parámetros y tipos que necesitas consultar.

Documentación completa Abrir editor
📖 Esta página tem uma nova versão, com uma página dedicada para cada função, classe e evento: acesse a nova documentação em /docs →

Eventos on

EventoParámetrosSe dispara cuando
messageCreatemessageMensaje enviado
messageDeletemessageMensaje eliminado
messageEditmessageMensaje editado
memberJoinmemberMiembro entró
memberLeavememberMiembro salió
memberUpdatememberMiembro actualizado
buttonClickinteractionBotón clicado
selectMenuinteractionMenú seleccionado
command"nome", message, argsComando por prefijo
reactionAddemoji, user, messageReacción añadida
reactionRemoveemoji, user, messageReacción eliminada
voiceJoinmemberEntró a canal de voz
voiceLeavememberSalió de canal de voz
banAdduserUsuario baneado
banRemoveuserBan eliminado
channelCreatechannelCanal creado
channelDeletechannelCanal eliminado
💬

Message

getUser() · messageCreate · sendMessage()
Propiedad / MétodoTipoDescripción
.idstringID del mensaje
.contentstringTexto del mensaje
.authorobjectAutor — id, username, isBot…
.channelstringID del canal
.reply(texto, opts?)functionResponde al mensaje. opts.embed, opts.components
.edit(texto, opts?)functionEdita el mensaje
.delete()functionElimina el mensaje
.react(emoji)functionAñade una reacción. Ej: "👋"
.pin()functionFija el mensaje
.unpin()functionDesfija el mensaje
👤

User

getUser() · message.author
Propiedad / MétodoTipoDescripción
.idstringID del usuario
.usernamestringNombre de usuario
.nicknamestringApodo en el servidor
.avatarstringURL del avatar
.rolesarrayIDs de roles
.createdAtstringFecha de creación (ISO)
.joinedAtstringFecha de entrada al servidor (ISO)
.isBotboolSi es un bot
.permissionsstringBitfield de permisos
.send(texto, opts?)functionEnvía un DM
.addRole(id)functionAñade un rol
.removeRole(id)functionElimina un rol
.timeout(ms)functionAplica un timeout en milisegundos
.removeTimeout()functionElimina el timeout
.ban(motivo?)functionBanea al usuario
.kick()functionExpulsa del servidor
📢

Channel

getChannel(id?)
Propiedad / MétodoTipoDescripción
.idstringID del canal
.namestringNombre del canal
.typenumberTipo (0=texto, 2=voz, 5=anuncio…)
.categorystringID de la categoría padre
.send(texto, opts?)functionEnvía un mensaje en el canal
.rename(nome)functionRenombra el canal
.lock()functionBloquea el envío para @everyone
.unlock()functionDesbloquea el canal
🏠

Guild

getGuild()
PropiedadTipoDescripción
.idstringID del servidor
.namestringNombre del servidor
.memberCountnumberTotal de miembros
.ownerstringID del dueño
.rolesarrayIDs de todos los roles
.channelsarrayIDs de todos los canales
🖱️

Interaction

getInteraction() · buttonClick · selectMenu
Propiedad / MétodoTipoDescripción
.customIdstringID del componente clicado
.valuesarrayValores seleccionados (SelectMenu)
.userIdstringID de quien disparó la interacción
.user()functionDevuelve el objeto User completo de quien disparó la interacción (async)
.reply(texto, opts?)functionResponde. opts.ephemeral, opts.embed, opts.components
.update(texto, opts?)functionActualiza el propio mensaje del componente clicado (mismos opts que .reply()) — solo funciona en respuesta a buttonClick/selectMenu aún no respondidos
.defer(ephemeral?)functionAplaza la respuesta (muestra loading)
.edit(texto, opts?)functionEdita la respuesta original
.followUp(texto, opts?)functionEnvía un mensaje de seguimiento
.showModal(modal)ModalAbre un formulario emergente — ver la sección Modal
🎨

EmbedBuilder

new EmbedBuilder() · Embed()
MétodoParámetroDescripción
.setTitle(v)stringTítulo del embed
.setDescription(v)stringDescripción
.setColor(v)string | numberColor. Ej: "#A9D6FF", "Blurple", 0x5865F2
.setURL(v)stringURL del título
.setTimestamp(v?)string | nilTimestamp. nil = ahora
.setThumbnail(url)stringImagen pequeña (arriba a la derecha)
.setImage(url)stringImagen 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
🔘

Button

Button()
MétodoParámetroDescripción
.setLabel(v)stringTexto del botón
.setStyle(v)stringprimary · secondary · success · danger · link
.setCustomId(v)stringPermanente. ID fijo elegido por ti. Nunca expira — captúralo con on(buttonClick, i => { if (i.customId == "v") ... }). Sigue funcionando incluso después de que Ayami se reinicie.
.onClick(fn, opts?)functionTemporal. Registra el clic directamente, sin necesitar on(buttonClick). Expira solo (10min por defecto). opts: { user: true|"id", ttl: ms }user: true lo restringe al autor del comando.
.setEmoji(e)stringEmoji. Ej: "🎉"
.setDisabled(v)boolDeshabilita el botón
.setURL(v)stringURL (solo con style link)
primary secondary success danger link 🔗
Permanente vs. temporal: usa setCustomId para botones que deben sobrevivir reinicios (ej: un panel fijo). Usa onClick para botones de un solo uso ligados a un comando (ej: confirmar/cancelar), sin necesitar un handler aparte.
📋

SelectMenu

SelectMenu()
MétodoParámetroDescripción
.setCustomId(v)stringPermanente. ID fijo — captúralo con on(selectMenu, i => { if (i.customId == "v") ... }).
.onClick(fn, opts?)functionTemporal. Registra la selección directamente, sin on(selectMenu). fn recibe la interacción con .values ya lleno. Expira sola (10min por defecto). opts: { user: true|"id", ttl: ms }.
.setPlaceholder(v)stringTexto de placeholder
.setMinValues(n)numberMínimo de selecciones
.setMaxValues(n)numberMáximo de selecciones
.addOptions(...opts)object[]{ label, value, description?, emoji? }
📝

Modal

Modal()
MétodoParámetroDescripción
.setTitle(v)stringTí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ónParámetroDescripción
interaction.showModal(modal)ModalAbre 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
🗄️

db — Global

Alcance: servidor
MétodoParámetrosRetorno
db.set(chave, valor)string, any
db.get(chave)stringany | nil
db.has(chave)stringbool
db.delete(chave)string
👤

db.user(user)

Alcance: usuario por servidor
MétodoParámetrosRetorno
.set(chave, valor)string, any
.get(chave)stringany | nil
.has(chave)stringbool
.add(chave, n)string, numbernumber (novo valor)
.sub(chave, n)string, numbernumber (novo valor)
🏠

db.guild()

Alcance: metadatos del servidor
MétodoParámetrosRetorno
.set(chave, valor)string, any
.get(chave)stringany | nil
🔤

Funções de String

FunciónParámetrosRetorno
length(s)stringnumber
contains(s, sub)string, stringbool
replace(s, de, para)string, string, stringstring
split(s, sep)string, stringarray
join(arr, sep)array, stringstring
lower(s)stringstring
upper(s)stringstring
trim(s)stringstring
tostring(v)anystring
tonumber(s)stringnumber
type(v)anystring
🔢

Funções Matemáticas

FunciónParámetrosRetorno
random(min, max)number, numbernumber — entero entre min y max
random()number — decimal entre 0 y 1
round(n)numbernumber
floor(n)numbernumber
ceil(n)numbernumber
abs(n)numbernumber
max(a, b, …)...numbernumber
min(a, b, …)...numbernumber
📋

Funções de Array & Object

FunciónParámetrosRetorno
push(arr, v)array, anyarray
pop(arr)arrayany — último elemento
insert(arr, i, v)array, number, anyarray
remove(arr, i)array, numberarray
size(v)array | objectnumber
keys(obj)objectarray de cadenas
values(obj)objectarray de valores
📦

json

FunciónParámetrosRetorno
json.encode(v)anystring — JSON
json.decode(s)stringobject | nil
🛠️

Utilitários

FunciónParámetrosDescripción
print(…)...anyMuestra en la consola del Dashboard
wait(ms)numberEspera 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
PREFIXstringConstante 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+
🌐

http

🌙 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ónParámetrosRetorno
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.

🪝

webhook

🌙 Lua Crescente+
FunciónParámetrosRetorno
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.

⏱️

Tempo

Persistido — sobrevive a reinicios

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ónParámetrosDescripció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)stringCancela 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|stringDevuelve true si el usuario actual puede actuar ahora (y marca el cooldown); false si aún está en espera
cooldownRestante(chave)stringMilisegundos 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
⚙️

Operadores

Op.DescripciónExemplo
+Suma2 + 35
-Resta10 - 46
*Multiplicación3 * 412
/División10 / 25
%Módulo10 % 31
..Concatenación"Oi ".."Ayami"
Op.Descripción
==Igual
!=Diferente
<Menor que
>Mayor que
<=Menor o igual
>=Mayor o igual
andY lógico
orO lógico
notNegación
📝

Palabras clave reservadas

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ímites del Sandbox

LímiteValor
Pasos por ejecución50 000
Profundidad de recursión200 niveles
Total de wait() por ejecución30 000ms
Scripts simultáneos por servidor20
Salidas de print() por ejecución200 líneas
TTL de los logs7 días
🌌

Archivos .logic por plan

Ver todos los planes en /premium
PlanArchivos .logicFunciones por archivoHTTP / Webhook / runFlowBono en /daily
Gratis615❌ Bloqueado
Nueva Estrella1540❌ Bloqueado1.5x
Luna Creciente35Ilimitado✅ Habilitado2.5x
ConstellationIlimitadoIlimitado✅ Habilitado3.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.