| Evento | Parâmetros | Disparado quando |
| messageCreate | message | Mensagem enviada |
| messageDelete | message | Mensagem deletada |
| messageEdit | message | Mensagem editada |
| memberJoin | member | Membro entrou |
| memberLeave | member | Membro saiu |
| memberUpdate | member | Membro atualizado |
| buttonClick | interaction | Botão clicado |
| selectMenu | interaction | Menu selecionado |
| command | "nome", message, args | Comando por prefixo |
| reactionAdd | emoji, user, message | Reação adicionada |
| reactionRemove | emoji, user, message | Reação removida |
| voiceJoin | member | Entrou em canal de voz |
| voiceLeave | member | Saiu de canal de voz |
| banAdd | user | Usuário banido |
| banRemove | user | Ban removido |
| channelCreate | channel | Canal criado |
| channelDelete | channel | Canal deletado |
| Propriedade / Método | Tipo | Descrição |
| .id | string | ID da mensagem |
| .content | string | Texto da mensagem |
| .author | object | Autor — id, username, isBot… |
| .channel | string | ID do canal |
| .reply(texto, opts?) | function | Responde à mensagem. opts.embed, opts.components |
| .edit(texto, opts?) | function | Edita a mensagem |
| .delete() | function | Deleta a mensagem |
| .react(emoji) | function | Adiciona reação. Ex: "👋" |
| .pin() | function | Fixa a mensagem |
| .unpin() | function | Desfixa a mensagem |
| Propriedade / Método | Tipo | Descrição |
| .id | string | ID do usuário |
| .username | string | Nome de usuário |
| .nickname | string | Apelido no servidor |
| .avatar | string | URL do avatar |
| .roles | array | IDs de cargos |
| .createdAt | string | Data de criação (ISO) |
| .joinedAt | string | Data de entrada no servidor (ISO) |
| .isBot | bool | Se é um bot |
| .permissions | string | Bitfield de permissões |
| .send(texto, opts?) | function | Envia DM |
| .addRole(id) | function | Adiciona cargo |
| .removeRole(id) | function | Remove cargo |
| .timeout(ms) | function | Aplica timeout em milissegundos |
| .removeTimeout() | function | Remove timeout |
| .ban(motivo?) | function | Bane o usuário |
| .kick() | function | Expulsa do servidor |
| Propriedade / Método | Tipo | Descrição |
| .id | string | ID do canal |
| .name | string | Nome do canal |
| .type | number | Tipo (0=texto, 2=voz, 5=anúncio…) |
| .category | string | ID da categoria pai |
| .send(texto, opts?) | function | Envia mensagem no canal |
| .rename(nome) | function | Renomeia o canal |
| .lock() | function | Bloqueia envio para @everyone |
| .unlock() | function | Desbloqueia o canal |
| Propriedade | Tipo | Descrição |
| .id | string | ID do servidor |
| .name | string | Nome do servidor |
| .memberCount | number | Total de membros |
| .owner | string | ID do dono |
| .roles | array | IDs de todos os cargos |
| .channels | array | IDs de todos os canais |
| Propriedade / Método | Tipo | Descrição |
| .customId | string | ID do componente clicado |
| .values | array | Valores selecionados (SelectMenu) |
| .userId | string | ID de quem disparou a interação |
| .user() | function | Retorna o objeto User completo de quem disparou a interação (async) |
| .reply(texto, opts?) | function | Responde. opts.ephemeral, opts.embed, opts.components |
| .update(texto, opts?) | function | Atualiza a própria mensagem do componente clicado (mesmos opts de .reply()) — só funciona em resposta a buttonClick/selectMenu, ainda não respondidos |
| .defer(ephemeral?) | function | Adia resposta (mostra loading) |
| .edit(texto, opts?) | function | Edita a resposta original |
| .followUp(texto, opts?) | function | Envia mensagem de follow-up |
| .showModal(modal) | Modal | Abre um formulário popup — veja a seção Modal |
| Método | Parâmetro | Descrição |
| .setTitle(v) | string | Título do embed |
| .setDescription(v) | string | Descrição |
| .setColor(v) | string | number | Cor. Ex: "#A9D6FF", "Blurple", 0x5865F2 |
| .setURL(v) | string | URL do título |
| .setTimestamp(v?) | string | nil | Timestamp. nil = agora |
| .setThumbnail(url) | string | Imagem pequena (topo-direita) |
| .setImage(url) | string | Imagem 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
| Método | Parâmetro | Descrição |
| .setTitle(v) | string | Tí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ção | Parâmetro | Descrição |
| interaction.showModal(modal) | Modal | Abre 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
| 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 |
| Função | 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 |
| Função | Parâmetros | Retorno |
| random(min, max) | number, number | number — inteiro entre min e max |
| random() | — | number — decimal entre 0 e 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 |
| Função | 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 strings |
| values(obj) | object | array de valores |
| Função | Parâmetros | Retorno |
| json.encode(v) | any | string — JSON |
| json.decode(s) | string | object | nil |
| Função | Parâmetros | Descrição |
| print(…) | ...any | Exibe no console do Dashboard |
| wait(ms) | number | Aguarda 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 |
| PREFIX | string | Constante 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+
|
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ção | 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 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.
| Função | Parâmetros | Retorno |
| 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.
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ção | Parâmetros | Descriçã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) | string | Cancela 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|string | Retorna true se o usuário atual pode agir agora (e já marca o cooldown); false se ainda estiver em espera |
| cooldownRestante(chave) | string | Milissegundos 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
| Op. | Descrição | Exemplo |
| + | Adição | 2 + 3 → 5 |
| - | Subtração | 10 - 4 → 6 |
| * | Multiplicação | 3 * 4 → 12 |
| / | Divisão | 10 / 2 → 5 |
| % | Módulo | 10 % 3 → 1 |
| .. | Concatenação | "Oi ".."Ayami" |
| Op. | Descrição |
| == | Igual |
| != | Diferente |
| < | Menor que |
| > | Maior que |
| <= | Menor ou igual |
| >= | Maior ou igual |
| and | E lógico |
| or | OU lógico |
| not | Negação |
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
| Limite | Valor |
| Passos por execução | 50 000 |
| Profundidade de recursão | 200 níveis |
| Total de wait() por execução | 30 000ms |
| Scripts simultâneos por servidor | 20 |
| Saídas de print() por execução | 200 linhas |
| TTL dos logs | 7 dias |
| Plano | Arquivos .logic | Funções por arquivo | HTTP / Webhook / runFlow | Bônus no /daily |
| 🌑 Gratuito | 6 | 15 | ❌ Bloqueado | — |
| ⭐ Nova Estrela | 15 | 40 | ❌ Bloqueado | 1.5x |
| 🌙 Lua Crescente | 35 | Ilimitado | ✅ Liberado | 2.5x |
| ✨ Constellation | Ilimitado | Ilimitado | ✅ Liberado | 3.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.