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:
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.
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