Base de bot de discord

Criadores

Principais estruturas da base para criação de comandos e sistemas

Nesta base, para criar comandos e sistemas você deve utilizar as funções criadoras, que são createCommand, createEvent e createResponder.

Ao executar essas funções passando os dados da estruturas respectivas, elas serão criadas e registradas.

Você pode definir algumas opções no arquivo index da pasta discord, veja:

src/discord/index.ts
import { setupCreators } from "@constatic/base";

export const { createCommand, createEvent, createResponder } = setupCreators();

Essa função recebe opções e retorna os criadores de comandos, eventos e responders para você utilizar. Exportando já esse retorno você pode importar eles a qualquer momento pelo atalho da base:

import { createCommand, createEvent, createResponder } from "#base";

Opções de comandos

Você pode definir algumas opções de comandos na função setupCreators:

Defina quais serão as permissões padrões de todos os comandos, caso não seja definida nenhuma com a opção defaultMemberPermissions (É o mesmo array de permissões do comando).

/* ... */ setupCreators({
    commands: {
        defaultMemberPermissions: ["SendMessages", "Connect"]
    },
});

Dessa forma, ao criar um comando e não definir nenhuma permissão padrão de membro, o que você definiu na função setupCreators, será o padrão de todos os comandos.

command.ts
createCommand({
    name: "ping",
    description: "Responde com pong",
    type: ApplicationCommandType.ChatInput,
    // defaultMemberPermissions: [] <-- Não foi definido!
    // Mas por padrão será registrado na aplicação com ["SendMessages", "Connect"]
    async run(interaction){
        // ...
    }
})

Opções de Responders

Você pode definir algumas opções de responders na função setupCreators:

Você pode definir uma função middleware que será executada antes da função run dos responders

/* ... */ setupCreators({
    responders: {
        async middleware(interaction, _block, params){
            console.log("Comando executado:", interaction.customId);
            console.log("Parâmetros:", params);
        }
    },
});

Assim como nos comandos, você pode fazer muita coisa com isso, como exibir logs padronizados para todos os responders executados, injetar informações adicionais na interação, ou até mesmo bloquear a execução com base em checagens.

Você pode executar a função block para bloquear a execução dos responders.

/* ... */ setupCreators({
    responders: {
        async middleware(interaction, block){
            if (interaction.isButton() && blockedUsers.includes(interaction.user.id)){
                interaction.reply({ content: "Você não pode clicar em nenhum botão!" });
                block();
                return;
            }
        }
    },
});

Opções de Eventos

Você pode definir algumas opções de eventos na função setupCreators:

Você pode definir uma função middleware que será executada antes da função run dos eventos

/* ... */ setupCreators({
    events: {
        async middleware(event){
            console.log("Evento", event.name, "emitido");
        }
    },
});

Assim como nos comandos e responders, você pode fazer muita coisa com isso, como exibir logs padronizados para todos os eventos executados, injetar informações adicionais nos argumentos de eventos específicos, ou até mesmo bloquear a execução com base em checagens.

No primeiro argumento, é recebido um objeto com os dados do evento, onde name é o nome do evento emitido e args são os argumentos desse evento, então verificando qual é o nome do evento, a tipagem dos argumentos é definida automaticamente:

/* ... */ setupCreators({
    events: {
        async middleware(event) {
            if (event.name === "guildMemberUpdate"){
                const [oldMember, newMember] = event.args;
                // ...
                return;
            }
            if (event.name === "guildAuditLogEntryCreate"){
                const [entry, guild] = event.args;
                // ...
                return;
            }
            if (event.name === "messageCreate"){
                const [message] = event.args;
                // ...
                return;
            }
        },
    },
});

Você pode executar a função block para bloquear a execução dos eventos.

/* ... */ setupCreators({
    events: {
        async middleware(event, block){
            if (event.name === "messageDelete"){
                const [message] = event.args;
                if (message.inGuild() && message.author.id == message.guild.id){
                    block();
                    return;
                }
            }
        }
    },
});

No caso dos eventos também é possível passar tags como argumento da função block, dessa maneira, você pode ter 3 eventos do mesmo tipo, por exemplo messageCreate, mas bloquear apenas aqueles com as tags previamente definidas:

createEvent({
    name: "Morning workflow",
    event: "messageCreate",
    tags: ["morning"],
    async run(message) {
        // ...
    },
});

createEvent({
    name: "Night workflow",
    event: "messageCreate",
    tags: ["night"],
    async run(message) {
        // ...
    },
});

createEvent({
    name: "Messages Workflow",
    event: "messageCreate",
    async run(message) {
        // ...
    },
});

Você pode passar quantas tags quiser para função block

// ...
block("morning", "night", "foo", "bar", "baz")
// ...

Todos os eventos que conter alguma das tags passadas como argumento da função block, não serão executados

On this page