Pesquisar aqui

terça-feira, 3 de novembro de 2020

Discord Bot em Node.js - Parte 3

Passo 3 — primeiros comandos do bot

Neste passo,  irás criar um bot que possa lidar com comandos de um usuário. Vais implementar o primeiro comando ping, que irá responder com "pong" e o tempo necessário para responder ao comando.

Primeiro,  precisas detectar e receber quaisquer mensagens que os usuários enviam para que tu possas processar quaisquer comandos. Usando o método on no cliente Discord, o Discord irá te enviar uma notificação sobre novos eventos. O método on leva dois argumentos: o nome de um evento para esperar e uma função a executar cada vez que esse evento ocorre. Com este método,  podes esperar pelo evento message — isso ocorrerá cada vez que uma mensagem for enviada a uma guild onde o bot tiver a permissão para visualizar mensagens. Portanto, vamos criar uma função que será executada cada vez que uma mensagem for enviada, para processar comandos.

Primeiro abre o teu arquivo:

  • nano index.js

Adiciona o código a seguir ao arquivo:

index.js
...
const client = new Discord.Client();


client.on("message", function(message) { 
                                         
});                                      

client.login(config.BOT_TOKEN);

Essa função, que executa no evento message, toma message como um parâmetro. message terá o valor de uma instância Discord.js message, que contém informações sobre a mensagem enviada e os métodos para ajudar o bot a responder.

Agora, adiciona a seguinte linha de código à tua função de tratamento de comandos:

index.js
...
client.on("message", function(message) {
  if (message.author.bot) return;
});
...

Essa linha verifica se o autor da mensagem é um bot e, se assim for, para de processar o comando. Isso é importante, pois geralmente não queres processar ou responder a mensagens de bots. Os bots geralmente não precisam ou não querem usar o  nosso bot, portanto, ignorar as suas mensagens economiza energia de processamento e ajuda a evitar respostas acidentais.

Agora, vais escrever um handler de comando. Para realizar isso, é bom entender o formato usual de um comando Discord. Normalmente, a estrutura de um comando Discord contém três partes na seguinte ordem: um prefixo, um nome de comando e, às vezes, argumentos de comando.

An image of a typical Discord command reading "! add 1 2"

  • Prefix: o prefixo pode ser qualquer coisa, mas normalmente é um pedaço de pontuação ou frase abstrata que normalmente não estaria no início de uma mensagem. Isso significa que quando  incluires o prefixo no início da mensagem, o bot irá saber que a intenção para este comando é para um bot processá-lo.

  • Command name: o nome do comando que o usuário quer usar. Isso significa que o bot pode suportar vários comandos com diferentes funcionalidades e permitir aos usuários escolher entre eles fornecendo um nome de comando diferente.

  • Arguments: às vezes, se o comando exigir ou usar informações extras do usuário, o usuário pode fornecer argumentos após o nome do comando, com cada argumento separado por um espaço.

Nota: não há nenhuma estrutura de comando obrigatória, e os bots podem processar comandos como eles quiserem, mas a estrutura aqui apresentada é uma estrutura eficiente que a grande maioria dos bots usam.

Para começar a criar um parser de comando que lida com este formato, adiciona as seguintes linhas de código à função de tratamento de mensagens:

index.js
...
const prefix = "!";

client.on("message", function(message) {
  if (message.author.bot) return;
  if (!message.content.startsWith(prefix)) return;
});
...

 Adicionas a primeira linha de código para atribuir o valor "!" à constante prefix, que  usarás  como o prefixo do bot.

A segunda linha de código que adicionas , verifica se o conteúdo da mensagem que o bot está a processar começa com o prefixo que definiste e, se não começar, interrompe o processamento da mensagem.

Agora, converte o resto da mensagem em um nome de comando e todos os argumentos da mensagem. Adiciona as linhas destacadas a seguir:

index.js
...
client.on("message", function(message) {
  if (message.author.bot) return;
  if (!message.content.startsWith(prefix)) return;

  const commandBody = message.content.slice(prefix.length);
  const args = commandBody.split(' ');
  const command = args.shift().toLowerCase();
});
...

 Usas  a primeira linha aqui para remover o prefixo do conteúdo da mensagem e atribuir o resultado à constante commandBody. Isso é necessário, uma vez que não queres incluir o prefixo no nome de comando no qual  fizeste a varredura.

A segunda linha pega a mensagem com o prefixo removido e usa o método split nela, com um espaço como separador. Isso a divide em um array de sub-strings, fazendo uma divisão onde quer que haja um espaço. Isso resulta em um array contendo o nome do comando e, se incluído na mensagem, quaisquer argumentos. Tu atribuis este array à constante args.

A terceira linha remove o primeiro elemento do array args (que será o nome de comando fornecido), o converte em minúsculas e, em seguida, o atribui à constante command. Isso lhe permite isolar o nome do comando e deixar apenas argumentos no array. Tu também usass o método toLowerCase, pois os comandos normalmente não diferenciam maiúsculas de minúsculas em bots do Discord.

Sem comentários:

Enviar um comentário

Comente de forma construtiva...

Nota: só um membro deste blogue pode publicar um comentário.