📋 Consulta rápida

Referência Logic Script

Todas as tabelas em um só lugar. Sem explicações — só os nomes, parâmetros e tipos que você precisa consultar.

📖 Documentação completa ✨ Abrir editor

Eventos on

EventoParâmetrosDisparado quando
messageCreatemessageMensagem enviada
messageDeletemessageMensagem deletada
messageEditmessageMensagem editada
memberJoinmemberMembro entrou
memberLeavememberMembro saiu
memberUpdatememberMembro atualizado
buttonClickinteractionBotão clicado
selectMenuinteractionMenu selecionado
command"nome", message, argsComando por prefixo
reactionAddemoji, user, messageReação adicionada
reactionRemoveemoji, user, messageReação removida
voiceJoinmemberEntrou em canal de voz
voiceLeavememberSaiu de canal de voz
banAdduserUsuário banido
banRemoveuserBan removido
channelCreatechannelCanal criado
channelDeletechannelCanal deletado
💬

Message

getUser() · messageCreate · sendMessage()
Propriedade / MétodoTipoDescrição
.idstringID da mensagem
.contentstringTexto da mensagem
.authorobjectAutor — id, username, isBot…
.channelstringID do canal
.reply(texto, opts?)functionResponde à mensagem. opts.embed, opts.components
.edit(texto, opts?)functionEdita a mensagem
.delete()functionDeleta a mensagem
.react(emoji)functionAdiciona reação. Ex: "👋"
.pin()functionFixa a mensagem
.unpin()functionDesfixa a mensagem
👤

User

getUser() · message.author
Propriedade / MétodoTipoDescrição
.idstringID do usuário
.usernamestringNome de usuário
.nicknamestringApelido no servidor
.avatarstringURL do avatar
.rolesarrayIDs de cargos
.createdAtstringData de criação (ISO)
.joinedAtstringData de entrada no servidor (ISO)
.isBotboolSe é um bot
.permissionsstringBitfield de permissões
.send(texto, opts?)functionEnvia DM
.addRole(id)functionAdiciona cargo
.removeRole(id)functionRemove cargo
.timeout(ms)functionAplica timeout em milissegundos
.removeTimeout()functionRemove timeout
.ban(motivo?)functionBane o usuário
.kick()functionExpulsa do servidor
📢

Channel

getChannel(id?)
Propriedade / MétodoTipoDescrição
.idstringID do canal
.namestringNome do canal
.typenumberTipo (0=texto, 2=voz, 5=anúncio…)
.categorystringID da categoria pai
.send(texto, opts?)functionEnvia mensagem no canal
.rename(nome)functionRenomeia o canal
.lock()functionBloqueia envio para @everyone
.unlock()functionDesbloqueia o canal
🏠

Guild

getGuild()
PropriedadeTipoDescrição
.idstringID do servidor
.namestringNome do servidor
.memberCountnumberTotal de membros
.ownerstringID do dono
.rolesarrayIDs de todos os cargos
.channelsarrayIDs de todos os canais
🖱️

Interaction

getInteraction() · buttonClick · selectMenu
Propriedade / MétodoTipoDescrição
.customIdstringID do componente clicado
.valuesarrayValores selecionados (SelectMenu)
.userIdstringID de quem disparou a interação
.user()functionRetorna o objeto User completo de quem disparou a interação (async)
.reply(texto, opts?)functionResponde. opts.ephemeral, opts.embed, opts.components
.update(texto, opts?)functionAtualiza a própria mensagem do componente clicado (mesmos opts de .reply()) — só funciona em resposta a buttonClick/selectMenu, ainda não respondidos
.defer(ephemeral?)functionAdia resposta (mostra loading)
.edit(texto, opts?)functionEdita a resposta original
.followUp(texto, opts?)functionEnvia mensagem de follow-up
.showModal(modal)ModalAbre um formulário popup — veja a seção Modal
🎨

EmbedBuilder

new EmbedBuilder() · Embed()
MétodoParâmetroDescrição
.setTitle(v)stringTítulo do embed
.setDescription(v)stringDescrição
.setColor(v)string | numberCor. Ex: "#A9D6FF", "Blurple", 0x5865F2
.setURL(v)stringURL do título
.setTimestamp(v?)string | nilTimestamp. nil = agora
.setThumbnail(url)stringImagem pequena (topo-direita)
.setImage(url)stringImagem grande (rodapé)
.setAuthor(opts)object{ name, url?, iconURL? }
.setFooter(opts)object{ text, iconURL? }
.addFields(...fields)object[]{ name, value, inline? } — múltiplos
.setFields(...fields)object[]Substitui todos os campos
Nomes de cores disponíveis em 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âmetroDescrição
.setLabel(v)stringTexto do botão
.setStyle(v)stringprimary · secondary · success · danger · link
.setCustomId(v)stringPermanente. ID fixo escolhido por você. Nunca expira — capture com on(buttonClick, i => { if (i.customId == "v") ... }). Continua funcionando mesmo depois da Ayami reiniciar.
.onClick(fn, opts?)functionTemporária. Registra o clique direto, sem precisar de on(buttonClick). Expira sozinha (10min por padrão). opts: { user: true|"id", ttl: ms }user: true restringe ao autor do comando.
.setEmoji(e)stringEmoji. Ex: "🎉"
.setDisabled(v)boolDesabilita o botão
.setURL(v)stringURL (só com style link)
primary secondary success danger link 🔗
Permanente vs. temporária: use setCustomId pra botões que precisam sobreviver a reinícios (ex: painel fixo). Use onClick pra botões de uso único ligados a um comando (ex: confirmar/cancelar), sem precisar de handler separado.
📋

SelectMenu

SelectMenu()
MétodoParâmetroDescrição
.setCustomId(v)stringPermanente. ID fixo — capture com on(selectMenu, i => { if (i.customId == "v") ... }).
.onClick(fn, opts?)functionTemporária. Registra a seleção direto, sem on(selectMenu). fn recebe a interação com .values preenchido. Expira sozinha (10min por padrão). opts: { user: true|"id", ttl: ms }.
.setPlaceholder(v)stringTexto de placeholder
.setMinValues(n)numberMínimo de seleções
.setMaxValues(n)numberMáximo de seleções
.addOptions(...opts)object[]{ label, value, description?, emoji? }
📝

Modal

Modal()
MétodoParâmetroDescrição
.setTitle(v)stringTítulo do formulário (máx. 45 caracteres)
.addTextInput(customId, label, opts?)string, string, object?Adiciona um campo de texto. opts: { style: "short"|"long", placeholder, required, minLength, maxLength, value }
.onSubmit(fn, opts?)function, object?Registra o envio do formulário. fn(interaction, fields)fields tem o valor de cada campo pelo customId. opts: { user: true|"id", ttl: ms }
No objeto de interaçãoParâmetroDescrição
interaction.showModal(modal)ModalAbre o formulário. modal precisa já ter passado por .onSubmit(fn)
Limitação do Discord: um Modal só abre em resposta a uma interação que já existe (dentro de on(buttonClick) ou on(selectMenu), ou no .onClick() temporário de um Button/SelectMenu) — nunca a partir de on(command), que é mensagem comum e não tem token de interação por trá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

Escopo: 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)

Escopo: usuário 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()

Escopo: metadados do servidor
MétodoParâmetrosRetorno
.set(chave, valor)string, any
.get(chave)stringany | nil
🔤

Funções de String

FunçãoParâ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

FunçãoParâmetrosRetorno
random(min, max)number, numbernumber — inteiro entre min e max
random()number — decimal entre 0 e 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

FunçãoParâ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 strings
values(obj)objectarray de valores
📦

json

FunçãoParâmetrosRetorno
json.encode(v)anystring — JSON
json.decode(s)stringobject | nil
🛠️

Utilitários

FunçãoParâmetrosDescrição
print(…)...anyExibe no console do Dashboard
wait(ms)numberAguarda N ms. Máximo acumulado: 30 000ms por execução
sendMessage(canal, texto, opts?)string|object, string, object?Envia mensagem. opts.embed, opts.components
sendDM(user, texto, opts?)string|object, string, object?Envia DM direta
getUser()Retorna o usuário do contexto atual
getChannel(id?)string?Retorna canal (do contexto ou por ID)
getGuild()Retorna o servidor atual
getInteraction()Retorna a interação atual
getMessage()Retorna a mensagem do contexto
PREFIXstringConstante com o prefixo de comandos configurado no servidor (ex: "!") — não é função, é uma variável global
runFlow(flowId)string Executa um Fluxo do Logic Builder pelo ID, compartilhando o servidor/canal/usuário do contexto atual. 🌙 Lua Crescente+
🌐

http

🌙 Lua Crescente+

Requisições HTTP para fora do Discord. Sempre passam pelo mesmo filtro de segurança: limite de tamanho de resposta, timeout, bloqueio de localhost/IPs privados e um limite de requisições por execução de script.

FunçãoParâ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 aceita um objeto de cabeçalhos customizados em todos os métodos. Em servidores sem esse recurso liberado, chamar qualquer método de http lança um erro explicando o plano necessário.

🪝

webhook

🌙 Lua Crescente+
FunçãoParâmetrosRetorno
webhook.send(url, texto, opts?) string, string, object? { ok, status }

Envia uma mensagem por um Webhook do Discord (URL externa). opts.username, opts.avatarUrl e opts.embed são opcionais.

⏱️

Tempo

Persistido — sobrevive a restart

Todo parâmetro de tempo abaixo aceita 3 formatos: um número em milissegundos (60000), uma duração como texto ("1h", "30m", "10s", "2d"), ou um horário fixo no formato "HH:MM" (ex: "9:00") — nesse caso, executa na próxima vez que der esse horário.

FunçãoParâmetrosDescrição
schedule(tempo, canal, texto, opts?) number|string, string|object, string, object? Agenda uma mensagem. Sem opts.recorrente, executa uma única vez. Com { recorrente: true }: se tempo for um horário ("9:00"), repete todo dia nesse horário; se for uma duração ("2h"), repete a cada esse intervalo. Retorna o id do agendamento.
cancelSchedule(id)stringCancela um agendamento pendente pelo id retornado por schedule()
listSchedules()Lista os agendamentos pendentes deste servidor: { id, channelId, texto, executeAt, recorrente }[]
cooldown(chave, tempo)string, number|stringRetorna true se o usuário atual pode agir agora (e já marca o cooldown); false se ainda estiver em espera
cooldownRestante(chave)stringMilissegundos restantes do cooldown com essa chave para o usuário atual (0 se não houver)
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.DescriçãoExemplo
+Adição2 + 35
-Subtração10 - 46
*Multiplicação3 * 412
/Divisão10 / 25
%Módulo10 % 31
..Concatenação"Oi ".."Ayami"
Op.Descrição
==Igual
!=Diferente
<Menor que
>Maior que
<=Menor ou igual
>=Maior ou igual
andE lógico
orOU lógico
notNegação
📝

Palavras-chave 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
🔒

Limites da Sandbox

LimiteValor
Passos por execução50 000
Profundidade de recursão200 níveis
Total de wait() por execução30 000ms
Scripts simultâneos por servidor20
Saídas de print() por execução200 linhas
TTL dos logs7 dias
🌌

Arquivos .logic por plano

Ver todos os planos em /premium
PlanoArquivos .logicFunções por arquivoHTTP / Webhook / runFlowBônus no /daily
🌑 Gratuito615❌ Bloqueado
⭐ Nova Estrela1540❌ Bloqueado1.5x
🌙 Lua Crescente35Ilimitado✅ Liberado2.5x
✨ ConstellationIlimitadoIlimitado✅ Liberado3.5x

"Funções por arquivo" conta apenas declarações function/export function no topo do arquivo (fora de blocos on(...)). HTTP, Webhook e runFlow() são liberados a partir do plano 🌙 Lua Crescente — chamá-los sem o plano necessário lança um erro explicando o plano mínimo exigido.