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

Components V2

componentsV2: true
Mensajes basados en componentes (Container, TextDisplay, Section, Separator, Thumbnail, MediaGallery) en lugar de content/embeds. Actívalo pasando { componentsV2: true } en las funciones de respuesta.
Container()ParámetroDescripción
.addComponents(...componentes)Component[]Agrega TextDisplay/Section/Separator/MediaGallery (o un Button/SelectMenu, que se convierte en una fila) dentro del container
.setAccentColor(v)string|numberColor de acento de la barra lateral del container
.setSpoiler(v)boolMarca el contenido del container como spoiler
TextDisplay(texto?)ParámetroDescripción
.setContent(v)stringTexto del bloque (admite Markdown)
Section(texto?)ParámetroDescripción
.setText(v)stringTexto principal de la sección
.setAccessory(v)Thumbnail|ButtonDefine el accesorio de la sección: un Thumbnail() o un Button() con style link
Separator()ParámetroDescripción
.setDivider(v)boolMuestra (true) u oculta (false) la línea divisoria
.setSpacing(v)stringEspaciado: "small" o "large"
Thumbnail(url?)ParámetroDescripción
.setURL(v)stringURL de la imagen
.setDescription(v)stringTexto alternativo (accesibilidad)
.setSpoiler(v)boolMarca la imagen como spoiler
MediaGallery()ParámetroDescripción
.addItem(url, descricao?, spoiler?)string, string?, bool?Agrega una imagen/video a la galería: (url, descripcion?, spoiler?)
Regla de Discord: con componentsV2: true el mensaje no puede tener content ni embeds — todo el texto va dentro de componentes TextDisplay(). Funciona con sendMessage, sendDM, message.reply/edit, user.send, channel.send, topic.send e interaction.reply/update/edit/followUp.
on command("painel", message, args)
  let card = Container()
    .setAccentColor("#8b5cf6")
    .addComponents(
      TextDisplay("**Bem-vindo!**\nEscolha uma opção abaixo:"),
      Separator(),
      Section("Veja nossas regras")
        .setAccessory(Thumbnail("https://exemplo.com/icone.png")),
      Button().setLabel("Abrir regras").setStyle("link").setURL("https://exemplo.com/regras")
    )

  message.reply(nil, { componentsV2: true, components: [card] })
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 valores en la consola del Dashboard. Acepta múltiples valores separados por espacio, variables, tablas (formateadas de forma legible e indentada) y nil, nunca interrumpe la ejecución del script, incluso con valores inesperados.
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.