Primeiro bot do Discord para envio de lembrete: do zero ao deploy! #PASSO1️⃣
Tags: discord, javascript, beginners, tutorial
Published: 2023-06-05 13:53:35

## Como iniciar o projeto sem saber nada?
Bom, como sendo meu primeiro bot para o discord meu conhecimento somava um total de 0 😆, mas faz parte, tendo em vista que comecei a mexer com javascript no final do ano passado. 
Eu tive muito da ajuda de canais no youtube e do próprio chatGPT  para o desenvolvimento e entendimento da aplicação.
Com a internet, hoje em dia, só não programa e não aprende quem não quer mesmo, não é?! Então, pensando nisso, e no fato de que eu precisava criar algo que me lembrasse de fazer algumas coisas no dia-a-dia que eram importantes, eu resolvi ir atrás de aprender e é isso mesmo que pretendo compartilhar nesse post.

_Obs.: É fundamental que se tenha uma conta criada no discord!_

## Passo 1: Criar um servidor no Discord.
Com o Discord aberto, você precisa criar um servidor (pode ser com o nome que você vai dar ao seu bot, ou qualquer outro nome que desejar) para dar segmento aos próximos passos.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e634l3k3a6hzsfozu1fc.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x0rglj9nplm0ozy9pw9a.png)

Se não quiser selecionar aqui, pode dar um **skip this question**.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iwzce0us9dd3ka6fna3k.png)

Aqui você pode dar o nome que desejar e até adicionar uma foto de perfil do servidor.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0sy8ka20dwd5g7o82yry.png)

Finalizado, ele abrirá dessa forma.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kto6nbxemgqj13gksxjg.png)

---

## Passo 2: Criar uma nova aplicação no Discord Developer.
Primeiro você precisa acessa o [Developer Portal](https://discord.com/login?redirect_to=%2Fdevelopers%2Fapplications) e ir na opção **New Application**, conforme mostra na imagem abaixo.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x2q6oamw27ydd2y12ezi.png)

---

## Passo 3: Gerar a URL do bot.
Após criar a aplicação, você vai precisar acassar o menu _OAuth2 >> URL Generator_ e marcar a opção **BOT**, feito isso, será gerada uma URL no campo **GENERATED URL**, basta copiar ela e abrir ela em nova aba no navegador.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c5nksqwss9alicovie6h.png)

Obs.: Se a URL não for gerada marcando a opção **BOT**, você precisará marcar a opção **ADMINISTRADOR** nas opções que serão abertas ao selecionar a opção **BOT**, conforme imagem.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qylyeasqn6xdx32alb6f.png)

## Passo 4: Marcações importantes que precisam ser feitas no **Developer Portal**.
Antes de partirmos para o link que foi gerado e aberto em nova aba na web, precisamos finalizar um item importante aqui no **Developer Portal** para que depois possamos codificar com total acesso as informações. Algumas marcações precisam ser realizadas, para isso, você vai precisar acessar o menu _BOT_ e encontrar o título **Privileged Gateway Intents**, no final da página e marcar as três opções, logo após salvar.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2utxombgsie9ucuypmft.png)

---

## Passo 5: Autorizar o bot a entrar no servidor.
Agora sim, vamos dar a permissão para que o bot possa acessar o nosso servidor que criamos lá no **passo 1**, para isso, vamos ir naquela aba aberta com a URL que foi gerada e vamos selecionar o nossos servidor, após, ir na opção **Authorize**.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iltp10zrou3kgjkpx5ey.png)

Após autorizar ele provavelmente irá pedir para confirmar que é um humano, após confirmar, se tudo der certo, essa tela deverá aparecer para você e inclusive a notificação no canto inferior direito.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v5mhrppuatwhbw6orlpn.png)

No servidor que criamos no discord no **Passo 1** deverá aparecer uma nova mensagem dando as boas vindas para o bot e inclusive mostrando que ele está ali, mas offline.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/msmezp4dhp32h268758c.png)

---

## Passo 6: Ferramentas necessárias e indispensáveis.
Primeiramente, você precisa ter instalado em sua máquina dois itens fundamentais, uma IDE para poder criar o código (e ai eu recomendo o [VS CODE](https://code.visualstudio.com/), mas também tem o [Sublime Text](https://www.sublimetext.com/) ou o [Eclipse](https://eclipseide.org/), além de vários outros) e você também vai precisar ter instalado o [Node.Js](https://nodejs.org/en) para que depois possamos instalar as dependências necessárias pare realizar a aplicação. 

---

## Passo 7: Instalando dependências necessárias.
Inicialmente vamos começar criando uma pasta em algum lugar do seu computador, eu normalmente gosto de criar na Área de Trabalho, mas isso depende muito de cada pessoa, eu criei a pasta com o nome <u>bot-discord</u>.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/60frtsq0ktlr9b6xj2xm.png)

Após criada a pasta, vamos abrir a nossa IDE (no meu caso o VS Code) e vamos abrir a pasta que criamos.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jue5ar3zlb7gujemg2ue.png)

Após abrir, vamos abrir o terminal (pode ser do VS Code mesmo) e roda o comando abaixo:

```shell
$ npm init
```

Após rodar o comando acima, ele vai pedir algumas coisas, basta dar ENTER em todas elas e no final, terá o seguinte retorno:

```json
{
  "name": "bot-discord",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}
```

Além desse retorno no terminal, na pasta onde criamos, dentro do VS Code, vai aparecer o arquivo **package.json**.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9l9u6n1q28c8ll2eaewl.png)

Nesse ponto já podemos começar a baixar algumas dependências que iremos precisar, a principal dela é a [Discord.js](https://discord.js.org/), então vamos baixá-la.

```shell
$ npm install discord.js
```

Também vamos precisar ter o [node-cron](https://www.npmjs.com/package/node-cron) ou [node-schedule](https://www.npmjs.com/package/node-schedule) para trabalharmos com cron job, no meu caso, estarei utilizando o **node-schedule**.

```shell
$ npm install node-schedule
```

Também vamos precisar instalar o [fs](https://nodejs.org/docs/latest-v20.x/api/fs.html) que é uma lib para gerenciamento de arquivos do sistema, ele permite ler arquivos, renomear, criar, atualizar e excluir, mas não irei me aprofundar muito nesse assunto, vamos ao que interessa.

```shell
$ npm install fs
```

---

## Passo 8: Criando arquivos e montando estrutura do projeto.
Vamos começar criando um arquivo **bot.js** (ou pode ser **index.js**), vamos precisar criar também um arquivo **config.json**, também vamos criar uma pasta chamada **Comands**(ou o nome que desejar, lembrando que essa pasta eu criei com a primeira letra maiúscula) e dentro dessa pasta uma outra pasta **general** (tudo minúsculo e também pode ser um outro nome que desejar), ali dentro criaremos o arquivo **sendMessage.js**.
Fora da pasta **Comands**, ou seja, na raíz do projeto, criaremos uma pasta chamada **handler** e dentro dela o arquivo 
**index.js**, a estrutura de arquivos, então, ficará dessa forma.

```
.
├── Comands
│   └── general
│       └── sendMessage.js
├── handler
│   └── index.js
├── bot.js
├── config.json
├── package.json
```

---

## Passo 9: Configurando a pasta **config.json**.
Esse arquivo vai conter o token do seu bot, é muito importante que esse token não seja espalhado e muito menos divulgado no github quando for publicá-lo (caso suba ele no github, claro). Por isso, se pretende subir esse projeto no seu github, como eu fiz com o meu, você precisa criar um arquivo **.gitignore** e dentro dele informar o nome do arquivo **config.json**, dessa forma.

```
// arquivo .gitignore
config.json
```

Agora sim, sabendo disso, vamos montar a estrutura do arquivo.

```json
{
  "token": "TOKEN_DO_SEU_SERVIDOR_DISCORD"
}
```

Para encontrar esse token, você precisa ir no [Developer Portal](https://discord.com/login?redirect_to=%2Fdevelopers%2Fapplications), no menu **Bot** e na opção **Reset Token** e então copiá-lo e colar ele no lugar do **"TOKEN_DO_SEU_SERVIDOR_DISCORD"**, dentro do arquivo **config.json**.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i6kwh00zlty63wtm2m7y.png)

Ficará dessa forma o arquivo.

```json
{
  "token": "123456fdsd78sd54d"
}
```

---

## Passo 10: Hora de fazer acontecer!!!
Agora vamos começar a trabalhar no nosso bot e na sua funcionalidade de enviar lembretes. Primeiramente, dentro do arquivo **bot.js** vamos adicionar esse código.

```javascript
1 const Discord = require("discord.js");
2 const config = require("./config.json")
3 const client = new Discord.Client({ 
4  intents: [
5   "Guilds", 
6   "GuildMembers", 
7   "MessageContent", 
8   "GuildMessages"
9  ] 
10 });
11
12 module.exports = client
13
14 client.on('interactionCreate', (interaction) => {
15
16  if (interaction.type === 
17  Discord.InteractionType.ApplicationCommand) {
18
19    const cmd = client.slashCommands
20    .get(interaction.commandName);
21
22    if (!cmd) return interaction.reply(`Error`);
23
24    interaction["member"] = 
25    interaction.guild.members.cache
26    .get(interaction.user.id);
27
28    cmd.run(client, interaction)
29
30  }
31 })
32
33 client.on("ready", () => {
34 console.log(`Estou online em ${client.user.username}`)
35
36  client.user.setActivity({
37    name: 'Lembrete',
38    type: Discord.ActivityType.Watching
39  })
40 })
41
42 client.slashCommands = new Discord.Collection()
43 require("./handler")(client)
44
45 client.login(config.token)
``` 

Para facilitar a explicação eu adicionei o número das linhas ao lado, então vamos lá.

| Linha         | Explicação                                      | 
| ------------- |:-----------------------------------------------:|
| 1             | Importa a biblioteca do discord.js.             |
| 2             | Importa o arquivo config.json com o nosso token.|
| 3             | Novo cliente é criado usando a classe Discord.Client(). O parâmetro **intents** especifica quais eventos o bot irá ouvir.                                                 |
| 12             |  Exporta o objeto cliente.                    |
| 14             |   É um ouvinte de eventos que lida com interações de comandos de aplicativo no Discord. Essa parte do código é responsável por receber e processar os comandos de aplicativo no Discord, permitindo que o bot execute ações específicas em resposta a esses comandos.                        |
| 33             |  É um ouvinte de eventos do evento **ready**. |
| 34             |  Mostra uma mensagem no **console do terminal** mostrando a mensagem **"Estou online em Lembretes"** para que possamos identificar se realmente está funcionando.              |
| 42             |  Nestas linhas, uma nova coleção **slashCommands** é criada e atribuída ao objeto **client**. Em seguida, um arquivo chamado **"handler.js"** é importado e executado.                                                       |
| 45             |  O código faz o login do bot utilizando o token fornecido no arquivo **config.json**.                            |

Próximo passo, vamos adicionar essa função dentro da pasta **handler >> index.js**.

```javascript
1 const fs = require("fs")
2
3 module.exports = async (client) => {
4
5  const SlashsArray = []
6
7  fs.readdir(`./Comands`, (error, folder) => {
8    folder.forEach(subfolder => {
9      fs.readdir(`./Comands/${subfolder}/`, (error, files) => {
10        files.forEach(files => {
11
12          if (!files?.endsWith('.js')) return;
13          files = require(`../Comands/${subfolder}/${files}`);
14          if (!files?.name) return;
15          client.slashCommands.set(files?.name, files);
16
17          SlashsArray.push(files)
18        });
19      });
20    });
21  });
22  client.on("ready", async () => {
23    client.guilds.cache.forEach(guild => 
24    guild.commands.set(SlashsArray))
25  });
26 };

```
| Explicação                                     | 
|:----------------------------------------------:|
| Essa função lê os arquivos de comandos de slash de um diretório, carrega esses arquivos como módulos, adiciona-os ao mapa "slashCommands" do cliente e define esses comandos para cada servidor quando o cliente está pronto.           |

Por fim, vamos adicionar essa função ao arquivo **sendMessage.js**.

```javascript
1 const Discord = require("discord.js");
2 const schedule = require("node-schedule");
3 const client = require("../../bot")
4
5 const jobOne = schedule.scheduleJob("0 8 * * *", () => {
6  sendMessage("8:00", "Correr");
7 });
8
9 const jobTwo = schedule.scheduleJob("0 12 * * *", () => {
10  sendMessage("12:00", "Caminhar");
11 });
12
13 async function sendMessage(time, activity) {
14  const channelToSend = await client.channels
15    .fetch("1113553458931437720")
16    .catch(() => null);
17
18  if (channelToSend) {
19    const embed = new Discord.EmbedBuilder()
20      .setDescription(`Olá, são ${time}, hora de  
21      ${activity}`)
22      .setColor(0x2a3756);
23
24    channelToSend.send({ embeds: [embed] });
25  }
26 }
```

| Linha         | Explicação                                     | 
| ------------- |:----------------------------------------------:|
| 1             | Importa a biblioteca do discord.js.            |
| 2             | Importa a biblioteca do node-schedule.         |
| 3             | Exporta o objeto cliente de dentro do **bot.js.|
| 5             | Cria uma variável **jobOne** que chama a função **scheduleJob** de dentro de schedule e define o horário em que quer que a função **sendMessage** execute, nesse caso às 08:00h da manhã ele vai chamar a função passando o horário como string "08:00" e o nome da atividade que deve ser feita, no caso "Correr".|
| 9             | Cria uma variável **jobTwo** que chama a função **scheduleJob** de dentro de schedule e define o horário em que quer que a função **sendMessage** execute, nesse caso às 12:00h da manhã ele vai chamar a função passando o horário como string "12:00" e o nome da atividade que deve ser feita, no caso "Caminhar".                                                      |
| 13            | Cria a função **sendMessage** que recebe o time e activity como parâmetro.                                         |
| 14            | Cria um parâmetro **channelToSend** e passa por parâmetro no fetch o ID do canal após as explicações, explico como encontrar o ID do canal.                                         |
| 18            | Esse trecho de código verifica se a variável **channelToSend** está definida e não é nula. Se for verdadeiro, cria uma instância de um objeto Embed do Discord com uma descrição contendo uma mensagem de saudação, o horário atual e uma atividade. O objeto Embed também define uma cor para o visual da mensagem. Em seguida, a função send() é chamada no channelToSend para enviar a mensagem contendo o objeto Embed como um parâmetro. Essa mensagem é exibida no canal de texto especificado pela variável channelToSend.            |

---

## Passo 11: Como encontrar o ID do canal?
Agora explicarei como encontrar o ID que foi comentado no passo anterior. 
Primeiramente, você precisará estar com o modo desenvolvedor do discord ativado.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eb2v2a40u6cjfi6kmsf4.png)

Após ativar, é só ir no servidor que criamos no **passo 1** e no canal que **general**, pressionar o **botão direito do mouse >> copy Channel ID**.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7mnm8bs2f8e9q0ka6ee4.jpg)