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
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â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

Components V2

componentsV2: true
Mensagens baseadas em componentes (Container, TextDisplay, Section, Separator, Thumbnail, MediaGallery) em vez de content/embeds. Ative passando { componentsV2: true } nas funções de resposta.
Container()ParâmetroDescrição
.addComponents(...componentes)Component[]Adiciona TextDisplay/Section/Separator/MediaGallery (ou um Button/SelectMenu, que vira uma linha) dentro do container
.setAccentColor(v)string|numberCor de destaque da barra lateral do container
.setSpoiler(v)boolMarca o conteúdo do container como spoiler
TextDisplay(texto?)ParâmetroDescrição
.setContent(v)stringTexto do bloco (aceita Markdown)
Section(texto?)ParâmetroDescrição
.setText(v)stringTexto principal da seção
.setAccessory(v)Thumbnail|ButtonDefine o acessório da seção: um Thumbnail() ou um Button() com style link
Separator()ParâmetroDescrição
.setDivider(v)boolMostra (true) ou esconde (false) a linha divisória
.setSpacing(v)stringEspaçamento: "small" ou "large"
Thumbnail(url?)ParâmetroDescrição
.setURL(v)stringURL da imagem
.setDescription(v)stringTexto alternativo (acessibilidade)
.setSpoiler(v)boolMarca a imagem como spoiler
MediaGallery()ParâmetroDescrição
.addItem(url, descricao?, spoiler?)string, string?, bool?Adiciona uma imagem/vídeo à galeria: (url, descricao?, spoiler?)
Regra do Discord: com componentsV2: true a mensagem não pode ter content nem embeds — todo o texto vira TextDisplay() dentro dos componentes. Funciona em 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

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 valores no console do Dashboard. Aceita múltiplos valores separados por espaço, variáveis, tabelas (formatadas de forma legível e indentada) e nil, nunca quebra a execução do script, mesmo com valores inesperados.
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.