Building Discord Bot using Nodejs - Project 01
Tags: node, javascript, discord, tutorial
Published: 2020-11-14 16:16:15

Project Idea: 
Inspiration quotes are as important as your daily dose of coffee to keep yourself motivated enough to deal with your day to day challenges.
So let's build a bot, which gives a dose of random inspiration quote every time a user types in the command `!inspire` in our discord server.

The basic steps required to be done in the Discord's Application Dashboard before jumping into coding is written in the below-linked Article

[Building a Discord Bot (Basic Setups)](https://dev.to/vishnudileesh/building-a-discord-bot-basic-setups-4a53)

Okay, so we have gone through all the steps mentioned in the above article. Now it's time to jump into doing some actual coding.

* Step 1:

Open your terminal and create a new project folder.
Inside the project folder initialize npm

`npm init -y`

When the initialization is done you will have a package.json file in your folder.

Great now let's install discordjs and dotenv npm packages.

> discord.js is a powerful node.js module that allows you to interact with the Discord API very easily.

> Dotenv is a zero-dependency module that loads environment variables from a .env file into process.env.

Run the below command to install the packages
`npm install discord.js dotenv`

Awesome, so now we have the packages installed.
Now let's make two files in our project folder.
This is the time to open the project in your choice of text editor.

The first file is the .env file, We will store our bot token in this file. This file is never pushed to Github or not the content of the files is shared with anyone. Anyone who gets access to that secret token can log in to your server as the bot and can do malicious activities.

```
BOT_TOKEN=<copy-pasted-token-value-here>
```
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/3rllb42trx4xn2wc2wcr.png)

The token is found on Discord's Application dashboard under the bot information page.

Great, so now our .env file is all set. Let's move on to the real action.

Create a new file named index.js

```
const Discord = require('discord.js')
const client = new Discord.Client()

const config = require('dotenv').config()
```
In the above code, we are first importing the discord.js package, initializing it, and storing it in a constant named client.
Then we are importing and activating dotenv to deal with our secrets.

```
const quotes = [
  'Chase the vision, not the money; the money will end up following you. — Tony Hsieh',
  'Don’t worry about failure; you only have to be right once. — Drew Houston',
  'Ideas are commodity. Execution of them is not. — Michael Dell',
  'If you are not embarrassed by the first version of your product, you’ve launched too late. — Reid Hoffman',
  'I knew that if I failed I wouldn’t regret that, but I knew the one thing I might regret is not trying. — Jeff Bezos',
]

const randomQuote = () => quotes[Math.floor(Math.random() * quotes.length)]

```

Okay, now it's time to set up our inspirational quotes. If you want you could get innovative and use some available inspiration quotes API services. Here, am going humble, and gonna store the quotes in an Array named quotes. Also created a simple anonymous function named randomQuote to do some magic and pickup random quote from the array of quotes.

```
client.on('ready', () => {
  console.log('Inspire Bot running')
  console.log(randomQuote())
})
```
Client.on ready function lets us do stuff when the bot successfully logs in and is ready to go wild in our server. Here, am just console logging a message and a random quote because am superstitious. You could also get innovative and maybe make the bot add a message to your channel saying, the bot is all ready to spread some motivational vibes.

```
const prefix = "!"
```

Okay, so what is the prefix? Well, prefix could literally be anything. It is all about how we want our bot to be invoked by the users. Here we are going for the exclamation point, I might have just gone ahead with maybe a dollar symbol?. It doesn't matter, just choose one.

```
client.on('message', (msg) => {

  if(msg.author.bot) return
  if(!msg.content.startsWith(prefix)) return

  const commandBody = msg.content.slice(prefix.length)

  const command = commandBody.toLowerCase()

  if(command === 'inspire'){
    msg.reply(randomQuote())
  }

})
```

Just like client.on ready, client.on message, let us do some stuff when someone writes a message on our server. So, what do we wanna do, when a new message comes up?

First, let's check if the author of the message is a bot. If so do nothing, stay quiet.

Second, If the message doesn't start with a prefix (the exclamation point in our case) just ignore and do nothing.

Third, let's extract the command from the message by removing the prefix from the start of the message. So if the message was !inspire, we will extract the word inspire and will store it in a variable named commandBody.

Fourth, This is an optional step, oftentimes, your bot will have multiple commands to deal with so this step just allows you to do that check. So we are converting the commandBody to lowercase and storing it in a variable named command. Then we are doing an if check to see if the command is equal to the word inspire. Again you could come up with any command names, here am just choosing to call my command inspire. 

When the command is - inspire, we are replying to the message with our randomly generated inspirational quote.
msg.reply will make sure that the bot replies directly to the user who invoked and asked for the inspirational vibe.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/djg0oppkwctpchy7yazf.png)

Now our bot is all set to spread some inspirational vibes in our discord server. All that now required to do is to let the bot login to our server.

```
client.login(process.env.BOT_TOKEN)
```

Bot needs the secret token to do the login. Remember we have the token all hidden on our .env file. To use it in our index.js file and pass it to client.login function we have earlier imported and activated dotenv package. That lets us call the token here without revealing it to anyone by calling process.env.BOT_TOKEN.

To run the bot locally on your system, open your terminal in the project folder and run the below command

`node index.js`

Also in the package.json file, we will add a start script.

```
"scripts": {
 "start": "node index.js"
}
```

Now you can run the bot by using either of the below commands

`node index.js`

or 

`npm run`

Once the bot successfully logs in and all ready to go, we will see our console message, also in the discord server, the bot will appear online.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/irz8375x5tohy4u92ax5.png)

Try invoking the bot by sending the below message to your discord server.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/fg5ure8itd49azu5g3zl.png)

And if all went well, you will get an inspirational quoted reply from your bot. If you are getting errors, no worries, errors are part of the journey. Google is your friend, try some googling and scavaging around StackOverflow.

[Full source code on GitHub](https://github.com/VishnuDileesh/inspireBot)

Still not able to resolve the error and get the bot working?
Well free to connect and let's figure it out.

[Connect on LinkedIn](https://www.linkedin.com/in/vishnu-dileesh/)
[Connect on Instagram](https://www.instagram.com/vi_c0de/)

Comment below your thoughts and bugs


Happy Coding
Keep Coding