Tutoriais

Mensagens Interativas

Crie um comando customizado com botões duráveis e novas execuções Lua.

Publicado por solever7 solever7
tutorial componentes botões stateless

Este tutorial transforma um comando simples em um pequeno menu. Cada clique recarrega
o mesmo script em uma nova sessão Lua e chama a função indicada pelo botão. A Macchi
guarda uma rota para a função, nunca uma closure Lua ou uma sessão viva.

Crie O Comando

Crie um comando customizado pessoal chamado guia, abra Editar código e cole:

function regras()
  macchi.reply("Leia as regras antes de enviar mensagens.")
end

function ajuda()
  macchi.reply("Procure a moderação se o guia não responder sua dúvida.")
end

function run()
  message.new()
    :text("Do que você precisa?")
    :button("regras", "Regras")
    :button("ajuda", "Ajuda")
    :send()
end

Rode o comando e clique nos dois botões. run cria a mensagem. regras e ajuda são
entradas Lua comuns, carregadas depois para a pessoa que clicar.

Mantenha A Rota Válida

  • O nome da função deve ser igual ao primeiro valor passado para :button.
  • A versão publicada ou o rascunho atual fica fixado na rota do componente.
  • A pessoa, o servidor, o canal e a rota são validados antes da execução Lua.
  • Mensagens e componentes são inertes até :send() ou
    macchi.replyMessage(message) ser chamado.

Não guarde estado em variável global entre cliques. Se o fluxo precisar de valores
duráveis, use a API de armazenamento com capacidade e escopo explícitos.

Use Os Componentes Atuais

Components V2 podem organizar texto sem transformar toda resposta em painel. Uma resposta
feita apenas com string continua sendo uma mensagem normal do Discord. Monte uma mensagem
quando precisar de layout:

local galeria = components.gallery()
  :item("https://example.com/preview.webp", "Prévia do painel")

message.new()
  :title("Notas da versão")
  :display("O novo painel está pronto para revisão.")
  :separator(false, "large")
  :addGallery(galeria)
  :sectionButton("Abra a revisão guiada.", components.button("revisar", "Revisar"))
  :accent("D95C5C")
  :send()

O construtor também oferece sections com miniatura, selects, selects de entidades,
spoiler no container e botões com link. Galerias aceitam de uma a dez URLs HTTP(S)
diretas. A Macchi não baixa uma URL para fingir que ela é um anexo do Discord.

Modais usam os campos rotulados atuais do Discord:

local formulario = components.modal("Publicar", "publicar")
formulario:radio("visibilidade", "Visibilidade")
  :option("Público", "publico")
  :option("Não listado", "nao_listado")
  :done()
  :checks("assuntos", "Assuntos", "Marque todos os relevantes", false, 0, 3)
  :option("Lua", "lua")
  :option("Gaming", "gaming")
  :done()
  :check("confirmado", "Revisei as informações")

message.new():text("Tudo pronto para publicar?"):addModal(formulario):send()

Use ctx.component:field("visibilidade") para um valor. Em grupos de checkbox e
uploads, use fieldCount(chave) e fieldAt(chave, índice). Uploads expõem URLs
validadas da CDN do Discord como valores escalares; objetos brutos do Discord nunca
chegam ao Lua.
Use display(texto) para instruções dentro do modal e users, roles, channels ou
mentionables quando a resposta deve ser uma entidade do Discord, não texto livre.

Continue

Consulte a API Lua para estilos, selects e construtores de mensagem.
Para comportamento automático em um canal, siga para Automação de
Canal
.