Etapas para criar e implantar um bot do Discord
Neste artigo, você criará e implantará um bot do Discord usando o Node.js, a biblioteca oficial do discord.js e os contêineres do Back4app.
Os bots do Discord são programas que executam tarefas automatizadas no Discord. Esses bots podem interagir com os usuários, gerenciar a conduta da comunidade e fornecer funcionalidades extras não disponíveis no Discord por padrão, como tocar música, moderar conteúdo, organizar enquetes e integrar-se a serviços externos ou APIs.
Contents
Configuração de seu ambiente de desenvolvimento
Este artigo apresentará um bot do Discord que oferece aos usuários perguntas triviais para responder com base no nível de dificuldade preferido e no tipo de pergunta em um servidor do Discord.
Para acompanhar este tutorial, você precisa ter o seguinte:
- Uma conta do Discord: Você pode se inscrever gratuitamente se ainda não tiver uma.
- Node.js v20 ou superior: Você pode fazer o download e instalá-lo em seu sistema se não o tiver.
Configure seu diretório de projeto executando o comando abaixo:
mkdir discord-bot && cd discord-bot && npm init -y
O comando acima cria um diretório discord-bot
e inicializa o npm nele.
Em seguida, navegue até seu arquivo package.json
e adicione o script de inicialização
abaixo:
"start": "node server.js"
Em seguida, instale as dependências necessárias para seu projeto executando o comando abaixo:
npm install discord.js axios dotenv
As dependências que você instalou acima incluem o seguinte:
- discord.js: essa biblioteca permitirá que você interaja com a API do Discord a partir do seu aplicativo Node.js.
- dotenv: esse pacote o ajudará a gerenciar dados confidenciais, como o token do bot.
- axios: Esse pacote permitirá que você solicite a API do Trivia.
Agora, você configurou seu ambiente de desenvolvimento e instalou as dependências necessárias. Em seguida, você criará uma conta de bot do Discord.
Como criar uma conta de bot no Discord
Uma conta de bot do Discord é uma conta do Discord criada para executar um bot. Ao contrário das contas de usuário comuns que os usuários humanos controlam, o software controla as contas de bot.
Essa conta atuará como um gateway, concedendo ao seu bot as permissões necessárias para acessar os recursos do servidor, responder a eventos e executar ações na sua comunidade do Discord.
Primeiro, você deve criar um aplicativo do Discord para criar uma conta de bot do Discord. Para criar um aplicativo, navegue até o portal do desenvolvedor do Discord e clique no botão “Create App” (Criar aplicativo), conforme mostrado na imagem abaixo.
Ao clicar no botão, você será solicitado a fazer login na sua conta do Discord. Depois de fazer login, dê um nome ao seu aplicativo e clique no botão “Create” (Criar), conforme mostrado na imagem abaixo.
Em seguida, desative a opção de bot público para garantir que somente você possa adicionar seu bot aos servidores.
Em seguida, configure as permissões do bot alternando todas as “Privileged Gateway Intents” para garantir que ele tenha acesso a atualizações em tempo real sobre a atividade do servidor, como a presença de membros.
Em seguida, navegue até a guia “OAuth2” na barra lateral esquerda. Na seção “SCOPES”, marque as caixas de seleção bot e application.commands, conforme mostrado na imagem abaixo.
Selecionar o escopo do bot permite que o Discord reconheça seu aplicativo como um bot, enquanto o escopo application.commands permite que você crie comandos de barra que seu bot ouvirá.
Uma seção “BOT PERMISSIONS” será aberta quando você marcar a caixa de seleção do bot. Na seção “BOT PERMISSIONS”, marque a caixa de seleção Administrator, conforme mostrado na imagem abaixo.
Marcar essa caixa de seleção concede ao bot todas as permissões possíveis dentro do servidor. Essas permissões incluem a capacidade de gerenciar mensagens e canais.
Abaixo da seção “BOT PERMISSIONS”, o Discord gerará um URL para você adicionar esse bot a um servidor. Cole o URL em seu navegador da Web e escolha o servidor ao qual deseja adicionar seu bot.
Em seguida, obtenha seu token de bot na guia “bot” clicando no botão“Reset Token“, conforme mostrado na imagem abaixo.
Clicar no botão pela primeira vez redefinirá o token padrão do bot e fornecerá a você um novo token. Copie e armazene o token com segurança. Se você perder o token, precisará redefini-lo novamente, pois ele é exibido apenas uma vez.
Crie um arquivo .env
para adicionar suas variáveis de ambiente, como o token do bot, juntamente com outros dados, como o ID da guilda à qual você adicionou o bot e o ID do cliente do bot:
TOKEN = "<BOT TOKEN>"
GUILD_ID = "<GUILD ID>"
CLIENT_ID = "<BOT'S CLIENT ID>"
Agora você já configurou sua conta do Discord Bot. Em seguida, você criará seu bot do Discord.
Criando seu projeto de bot do Discord com o Node.js
Esta seção o orientará na criação do seu bot de perguntas do Discord e na integração dos pacotes que você instalou para registrar os comandos de barra do bot no Discord e lidar com a interação do seu bot com um membro da guilda.
Estruture o diretório de seu projeto de forma semelhante à que está abaixo para acompanhar este tutorial.
quiz-bot/
│
├── src/
│ ├── register-commands.js # Script to register slash commands with Discord
│ └── quiz-bot.js # Script for message handling and fetching questions
│
├── server.js # Entry point for your bot and script for running a server
├── node_modules/ # Node.js modules
│
├── .env
├── .gitignore
├── package.json
└── package-lock.json
Registro de comandos do bot
Os bots exigem que os usuários insiram um comando. Com os bots do Discord, você define os comandos que deseja que seu bot ouça com o prefixo de barra (/).
Para registrar o comando /quiz
do seu bot no seu servidor Discord, primeiro adicione as seguintes importações de discord.js
ao seu arquivo register-commands.js
:
// register-commands.js
const { REST, Routes, ApplicationCommandOptionType } = require('discord.js');
As classes que você importou acima incluem o seguinte:
REST
: Essa classe permite que você faça chamadas da API REST para a API do Discord.Rotas
: Essa classe fornece funções utilitárias que geram pontos de extremidade da API do Discord.ApplicationCommandOptionType
: Essa classe permite que você defina os tipos de dados para as opções que o comando aceitará.
Em seguida, você precisa definir uma matriz de objetos de comando que contenha todos os comandos do seu bot. Um objeto de comando contém um nome
, uma descrição
e uma matriz de opções
.
Essas opções permitem que os usuários personalizem o comando do bot. Nesse caso, a matriz de opções permitirá que os usuários especifiquem a dificuldade e o tipo de pergunta que o bot de quiz deve fazer.
Adicione o bloco de código abaixo ao seu arquivo register-commands.js
para criar sua matriz de comandos
:
// register-commands.js
const commands = [
{
name: 'quiz',
description:
'Select difficulty and question type to tailor the quiz experience.',
options: [
{
type: ApplicationCommandOptionType.String,
name: 'difficulty',
description: "Options include 'easy', 'medium', or 'hard'.",
required: true,
},
{
type: ApplicationCommandOptionType.String,
name: 'type',
description:
" Choose 'multiple' for multiple choice or 'boolean' for true/false",
required: true,
},
],
},
];
O bloco de código acima define o comando quiz na matriz de comandos
. O objeto quiz contém duas opções que o usuário precisa inserir junto com o comando /quiz
, como o nível de dificuldade e o tipo de pergunta para a pergunta que o bot fará.
Em seguida, você precisa registrar o comando /quiz
para torná-lo acessível por meio do seu bot. Para registrar o comando, primeiro você precisa criar uma instância da classe REST
com seu token de bot do Discord e sua versão REST
preferida.
Para registrar seu comando /quiz
e torná-lo acessível por meio do seu bot, comece criando uma instância da classe REST
usando seu token de bot do Discord e especificando sua versão REST preferida.
Assim:
// register-commands.js
const rest = new REST({ version: '10' }).setToken(process.env.TOKEN);
O Discord atualiza regularmente sua API, o que leva a alterações nos pontos de extremidade, na estrutura de resposta e no comportamento.
A definição de uma versão REST específica para o seu projeto Discord permite que você gerencie os recursos disponíveis para o seu projeto de forma eficaz. O bloco de código acima usa a v10 da API do Discord.
Em seguida, você precisa definir uma função assíncrona para registrar comandos de bot no servidor de uma guilda usando o método applicationGuildCommands
da classe Routes
.
Assim:
// register-commands.js
(async () => {
try {
console.log('Started refreshing SLASH (/) commands.');
await rest.put(
Routes.applicationGuildCommands(
process.env.CLIENT_ID,
process.env.GUILD_ID
),
{ body: commands }
);
console.log('Successfully reloaded SLASH (/) commands.');
} catch (error) {
console.error(error);
}
})();
O bloco de código acima executa uma solicitação PUT para o ponto de extremidade da API do Discord com a matriz de comandos
como o corpo da solicitação.
Ele constrói o ponto de extremidade da API usando o método applicationGuildCommands
, recebendo o ID do cliente do bot e o ID da guilda de destino.
Depois de registrar os comandos, você precisará gerenciar o fluxo de interação entre o bot e um membro da guilda.
Como lidar com a interação do usuário com o bot do Discord
Para lidar com o fluxo de interação entre seu bot e um membro da guilda, primeiro adicione as seguintes importações ao seu arquivo quiz-bot.js
:
// quiz-bot.js
const { Client, IntentsBitField } = require('discord.js');
const axios = require('axios');
Você precisa usar a classe Client
para criar uma nova instância do bot do Discord, enquanto usa a classe IntentsBitField
para especificar as intenções (eventos) que o bot receberá da API do Discord.
Em seguida, adicione o bloco de código abaixo em seu arquivo quiz-bot.js
para criar uma nova instância de cliente para seu bot e especificar intenções específicas para seu aplicativo de bot:
// quiz-bot.js
const client = new Client({
intents: [
IntentsBitField.Flags.Guilds,
IntentsBitField.Flags.GuildMembers,
IntentsBitField.Flags.GuildMessages,
IntentsBitField.Flags.MessageContent,
],
});
O bloco de código acima define intenções específicas que o bot precisa para funcionar, que incluem:
IntentsBitField.Flags.Guilds
: Essa intenção permite que o bot receba informações sobre as guildas (servidores) das quais ele é membro, incluindo seus nomes, ícones e funções.
IntentsBitField.Flags.GuildMembers
: Essa intenção permite que o bot receba informações sobre os membros da guilda, como seus nomes de usuário, status e funções.
IntentsBitField.Flags.GuildMessages
: Essa intenção concede ao bot acesso a mensagens enviadas nas guildas em que ele está, permitindo que ele responda a comandos ou eventos acionados por mensagens.
IntentsBitField.Flags.MessageContent
: Essa intenção permite que seu bot acesse o conteúdo real das mensagens enviadas nas guildas. Sem essa intenção, o conteúdo da mensagem estará vazio.
Você criará um ouvinte de eventos para o evento ready
. Esse evento é acionado quando seu bot do Discord se conecta com êxito aos servidores do Discord e está pronto para funcionar.
Adicione o bloco de código abaixo ao seu arquivo quiz-bot.js
para criar seu ouvinte de evento pronto:
// quiz-bot.js
client.on('ready', () => {
console.log(`✅ Bot is online and ready`);
});
Em seguida, você precisa criar um ouvinte de eventos para o evento interactionCreate
. Esse evento ocorre quando um usuário realiza uma interação que seu bot pode manipular, como usar um comando de barra.
Quando emitido, seu ouvinte de eventos receberá o evento interactionCreate
junto com um objeto de interação.
Esse objeto inclui todos os detalhes sobre a interação, como o tipo de interação e os dados fornecidos pelo usuário.
Adicione o bloco de código abaixo ao seu arquivo quiz-bot.js
para criar o ouvinte do evento interactionCreate
:
// quiz-bot.js
client.on('interactionCreate', async (interaction) => {
if (!interaction.isChatInputCommand()) return;
if (interaction.commandName === 'quiz') {
// Rest of the code goes here...
}
});
O bloco de código acima configura um ouvinte do evento interactionCreate
.
O ouvinte de eventos verifica se a interação entre um usuário e o bot é um comando de entrada de bate-papo (comando de barra) e filtra outros tipos de interações.
Em seguida, ele verifica se o commandName
é quiz
e prossegue com o tratamento da sessão de quiz entre o bot e o usuário.
Se o commandName
for quiz
, faça uma solicitação GET com o Axios para o URL da API Trivia para obter a pergunta e suas respostas (corretas e incorretas).
Embaralhe as respostas para randomizar as opções e, em seguida, apresente-as ao usuário.
Assim:
// quiz-bot.js
await interaction.deferReply();
const difficulty = interaction.options.getString("difficulty");
const type = interaction.options.getString("type");
try {
const url = `https://opentdb.com/api.php?amount=1&difficulty=${difficulty}&type=${type}`;
const response = await axios.get(url);
const data = response.data.results[0];
const question = data.question;
const correctAnswer = data.correct_answer;
const options = [...data.incorrect_answers, correctAnswer];
// Shuffle the options
for (let i = options.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[options[i], options[j]] = [options[j], options[i]];
}
await interaction.editReply({
content: `Question: ${question}\\nOptions: ${options.join(", ")}`,
});
} catch (error) {
console.error(error);
// Notify the user in case of an error after deferring
await interaction.followUp("Failed to fetch the question. Please try again.");
}
O bloco de código acima primeiro adia a resposta do bot com o método deferReply
para permitir que o bot tenha algum intervalo de tempo para lidar com a solicitação GET.
Em seguida, o bloco de código recupera a dificuldade selecionada pelo usuário e o tipo de pergunta do objeto de interação usando interaction.options.getString()
.
Em seguida, o bot extrai a pergunta, a resposta correta e as respostas incorretas dos dados obtidos.
Depois de embaralhar as respostas corretas e incorretas para randomizar a ordem de escolha, ele edita a resposta inicial diferida com a pergunta e as opções do questionário.
Em seguida, você precisa lidar com a resposta do usuário à pergunta, comparando-a com a resposta correta e informando ao usuário se ela estava correta ou errada.
Coleta de respostas do usuário
Para coletar a resposta do usuário à pergunta, você usará o método createMessageCollector
no canal da interação(interaction.channel
).
Esse método permite filtrar as mensagens não enviadas pelo usuário que iniciou o comando /quiz
, definir um limite de tempo para a resposta do usuário e especificar o número máximo de mensagens a serem coletadas.
Quando o usuário envia uma resposta, o método createMessageCollector
aciona um evento de coleta
.
Você precisa adicionar um ouvinte a esse evento; o ouvinte verificará a resposta do usuário em relação à resposta correta à pergunta e enviará uma mensagem apropriada.
Por outro lado, se o usuário não enviar uma resposta adequada dentro do limite de tempo especificado, o método createMessageCollector
acionará um evento de encerramento
.
Você precisa adicionar um ouvinte que responda ao usuário para notificá-lo de que o tempo dele está esgotado para esse evento.
Assim:
// quiz-bot.js
const filter = (m) => m.author.id === interaction.user.id;
const collector = interaction.channel.createMessageCollector({
filter,
time: 15000,
max: 1,
});
collector.on("collect", async (m) => {
if (m.content.toLowerCase() === correctAnswer.toLowerCase()) {
await m.reply("Correct answer! 🎉");
} else {
await m.reply(`Wrong answer! The correct answer was: ${correctAnswer}`);
}
});
collector.on("end", (collected) => {
if (collected.size === 0) {
interaction.followUp("Time is up! No answer was provided.");
}
});
O bloco de código acima cria um coletor de mensagens para o canal em que a interação ocorreu(coletor
). O coletor
filtrará as mensagens com base no ID do autor, garantindo que somente o usuário que iniciou o questionário possa fornecer uma resposta dentro de um limite de tempo de 15 segundos.
Em seguida, o bloco de código cria dois ouvintes de eventos para o collector
. O primeiro ouvinte de evento, collect
, acionará uma chamada de retorno para verificar a resposta do usuário e responder a ele de acordo.
O segundo ouvinte de evento, end
, acionará uma chamada de retorno para notificar o usuário de que ele não forneceu uma resposta dentro do limite de tempo.
Em seguida, estabeleça uma conexão entre seu bot e o Discord adicionando a linha de código no final do arquivo quiz-bot.js
:
// quiz-bot.js
client.login(process.env.TOKEN);
Criação de um arquivo de entrada
Você criará um arquivo de entrada, que é um arquivo único que inicializará todo o seu aplicativo de bot. Ele terá duas funções:
- Importando a lógica do bot: O arquivo de entrada executará a lógica do bot exigindo os arquivos JavaScript, que lidam com o registro do comando do bot no servidor Discord e respondem às mensagens do usuário.
- Iniciando o servidor: O arquivo de entrada configurará um servidor que permitirá que seu bot seja executado em um contêiner do Back4app. Os contêineres do Back4app exigem portas expostas para que a implantação do seu aplicativo seja bem-sucedida.
Adicione o bloco de código abaixo ao arquivo server.js
para criar um servidor:
// server.js
require('dotenv').config();
const http = require('http');
require('./src/register-commands.js');
require('./src/quiz-bot.js');
http
.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Bot is running!');
})
.listen(3000, () => {
console.log('Server is ready.');
});
O bloco de código acima configura seu bot do Discord para ser executado, criando um servidor HTTP simples. Esse servidor atua como um ponto de entrada, permitindo que o bot funcione no ambiente do contêiner.
O bloco de código acima importa a lógica central do seu bot e especifica uma porta do Back4app para permitir que seu bot seja implantado em um contêiner do Back4app.
Depois de criar o arquivo de entrada, você pode testar seu bot do Discord localmente antes de implantá-lo em um contêiner do Back4app.
Testando seu bot do Discord
Inicie seu bot do Discord executando o bloco de código abaixo no terminal do seu aplicativo:
node server.js
O comando registrará mensagens mostrando que você registrou seu bot com sucesso e que ele está pronto e on-line.
Vá para o servidor ao qual você adicionou seu bot. Você deve perceber que ele está on-line agora.
Para interagir com seu bot, envie o comando /quiz. O bot deve responder com opções que detalham como você deseja que a pergunta do questionário seja exibida.
Escolha as opções desejadas (por exemplo, selecionar uma categoria de questionário ou nível de dificuldade) e pressione Enter. O bot responderá com uma pergunta e definirá um limite de tempo de 15 segundos para sua resposta.
Se você enviar sua resposta dentro do limite de tempo, o bot comparará sua resposta com a resposta correta e responderá para notificá-lo se sua resposta está certa ou errada.
Você determinou que seu bot pode lidar com todos os recursos para os quais foi projetado; em seguida, implante seu bot do Discord em um contêiner do Back4app.
Implementação do bot do Discord em contêineres do Back4app com o AI Agent
Nesta seção, você implantará seu bot do Discord em contêineres do Back4app com o agente de IA do Back4app.
Para implantar um aplicativo nos contêineres do Back4app, você precisa do seguinte:
- Um Dockerfile em seu projeto
- Repositório do GitHub: Seu projeto deve ser carregado em um repositório do GitHub.
- Aplicativo Back4app GitHub: Instale e conceda as permissões necessárias ao aplicativo Back4app GitHub para seu repositório
Primeiro, crie um Dockerfile
no diretório raiz do seu projeto e adicione o bloco de código abaixo a ele:
# Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
Em seguida, você precisa carregar seu código em um repositório do GitHub para torná-lo acessível para implantação.
Antes de seguir a próxima etapa, verifique se o aplicativo Back4App Containers GitHub está instalado na sua conta do GitHub e se ele tem as permissões necessárias para acessar o aplicativo que você deseja implantar.
Navegue até a página inicial do Back4app e clique no botão “New App” (Novo aplicativo) no canto superior direito da tela.
Isso o levará a uma tela de inicialização, na qual você precisará escolher o tipo de aplicativo que deseja criar.
Selecione a opção Back4app Agent, conforme mostrado na imagem abaixo.
Ao selecionar a opção Back4app Agent, você será redirecionado para a página do agente do Back4app AI.
Dê ao agente de IA o prompt abaixo para implantar seu aplicativo:
Deploy my "YOUR_REPOSITORY_URL" repository on GitHub to a Back4App Container.
Here are the required environmental variables:
TOKEN = "YOUR_DISCORD_BOT_TOKEN"
GUILD_ID = "YOUR_GUILD_ID"
CLIENT_ID = "YOUR_CLIENT_ID"
Substitua os espaços reservados no prompt acima por seus valores reais.
Você deve receber uma resposta semelhante à que está abaixo:
A resposta acima mostra que o processo de implantação está em andamento e que seu aplicativo estará on-line e disponível no URL fornecido.
Você pode monitorar o processo de implementação no painel de contêineres do Back4app ou pode fornecer ao agente de IA o prompt abaixo após algum tempo para confirmar o status atual da implementação.
What is the current deployment status of my web app?
Você deve receber uma resposta semelhante à que está abaixo:
Como alternativa, você pode optar por implantar seu aplicativo no Back4App manualmente.
Conclusão
Neste artigo, você aprendeu a criar um bot do Discord com o Node.js. Você explorou como criar uma conta de bot do Discord, registrar comandos de bot e lidar com as respostas do usuário.
Além disso, você testou seu bot do Discord e o implantou em um contêiner do Back4app com a ajuda do agente de IA.
Os bots do Discord podem ser muito úteis para automatizar tarefas, proporcionar entretenimento etc. E, com base no seu caso de uso, você pode ajustar o bot para executar funções específicas que atendam às suas necessidades.
O código completo usado neste tutorial está disponível neste repositório do GitHub.