paint-brush
Creating a Discord Bot That Automates Secret Messages With Node.jsā€‚by@courier
24,470 reads
24,470 reads

Creating a Discord Bot That Automates Secret Messages With Node.js

by CourierSeptember 29th, 2022
Read on Terminal Reader
Read this story w/o Javascript

Too Long; Didn't Read

The Courier Hackathon ends September 28th and we are giving away over $1K in prizes! Join us in building a cool project and winning any of the following prizes. The hackathon ends soon,**and we will be building a Discord bot that sends daily automated messages encrypted in Morse code with Node.js and the Courier API. Register now to submit this project for a chance to win some cool prizes, including $1000 via Zelle or PayPal. The public favorite winner will receive a Keychron Keyboard and $20 Amazon gift card.

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - Creating a Discord Bot That Automates Secret Messages With Node.js
Courier HackerNoon profile picture

Before Starting

GitHub Repository:Ā https://github.com/shreythecray/infiltration


The hackathon ends soon,Ā and we are giving away over $1K in prizes! Join us in building a cool project and winning any of the following prizes. šŸ†


  • Courier Hacks 1st Place:Ā Top submission for use for notifications and demonstration of proper app-to-user notifications with the Courier API will receive $1000 via Zelle or PayPal.

  • Courier Hacks 2nd Place:Ā 2nd Place submission for use for notifications and demonstration of proper app-to-user notifications with the Courier API will receive the Apple AirPods Pro.

  • Public Favorite:Ā Public favorite winner will receive a Keychron Keyboard.

  • Runners-Up:Ā Runners-up submissions will receive a Hydro Flask.


Additionally, everyone who submits a project successfully integrating the Courier API will receive a $20 Amazon gift card! Submissions close onĀ September 28th. Register now to submit this project for a chance to win some cool prizes.


Register for the Hackathon:Ā https://courier-hacks.devpost.com/


Not sure where to start? In this tutorial, we will create a Discord bot that sends daily automated messages encrypted in Morse code with Node.js and the Courier API.

What is Going On?

Recap

We are secret agents, and we previously built an application to send secret messages encrypted in Morse code to communicate with our spy network.Ā Learn more >

Last time, headquarters told us that one of our spies had leaked sensitive, top-secret information to our enemies, so we built a lie detector that alerted our spy network when we identified the mole. We used Azure's Cognitive Services to perform facial recognition on everyone on our team and Courier to broadcast the identity of the mole to our spy network.Ā Learn more >

Whatā€™s Next:

We have successfully identified the mule and have alerted our spy network! In an unfortunate turn of events, the mule happens to be our partner, Agent X, and now we are being suspected as a traitor as well. Since we are highly skilled, Headquarters knows that the Lie Detector wonā€™t work on us, but we have been placed off-duty until we can prove that we are innocent.

Before we were removed from duty, we were able to use the Lie Detector to find out that the enemy had thousands of civilians under control in a secret Discord server. The civilians are being brainwashed with enemy propaganda every day. To prove our innocence, we decide to go undercover and infiltrate the enemyā€™s Discord server. With the help of Agent X, we have been added to the server as an administrator. Our plan is to create and install a Discord bot that automates encrypted messages to the civilians and alerts them about the situation so that they can escape.

Letā€™s Build

Pre-reqs:

  • Admin access to a Discord server

  • A cool undercover Agent name for our Discord bot

  • Optional: a cool undercover Agent profile picture for our Discord bot


Part 1: Set Up Node.js Project

Today, we will be building this with Node.js. If youā€™re curious about how to build this project using Ruby, cURL, Powershell, Go, PHP, Python, or Java, let us know:Ā https://discord.com/invite/courier. You can also access code for these within ourĀ API reference. Letā€™s get started:


  • Create a new project folder.

  • Create three new files: ā€œindex.jsā€, ā€œ.envā€, and ā€œ.gitignoreā€.


  • InstallĀ dotenv npm packageĀ to store variables:Ā npm install dotenv --save


  • Import and configure dotenv by adding to top of index.js:Ā require("dotenv").config();


  • Similarly, installĀ node-fetch npm packageĀ to make API calls:Ā npm install node-fetch@2


  • Import and configure node-fetch by adding to top of index.js:Ā const fetch = require("node-fetch");

Part 2: Create a Discord Bot

  • Sign up for (or log into) Courier >

  • Open Discord provider in Channels. Here we will need our Discord bot token to continue.

  • In order to access a Discord bot token, weā€™ll create a Discord application and add a Discord bot.

    • Click on ā€œNew Applicationā€ within theĀ Discord Developer Dashboard.
    • Type the appā€™s name and click ā€œCreateā€.
    • In the left menu, open the ā€œBotā€ page and click ā€œAdd Botā€. We can update the icon and username (bot icon file can be found in the GitHub linked above).
  • Once the bot has been created, copy the bot token provided and paste it in Courier (make sure to keep this token private).

  • We will need to give this application permission to post as the bot within our server. Check out theĀ Bot permissions documentation.

    • Within the application, head over to OAuth2 and click on URL generator
    • Select theĀ botĀ scope
    • Select the following permissions:Ā View Channels,Ā Send Messages, andĀ Read Message History
    • Go to the generated URL below. This URL will invite the bot to the server and authorize it with the permissions chosen.
  • On Discord, click on User Settings (next to username on the bottom left). Access the Advanced settings page and enable Developer Mode āœ….

  • Back in the Discord server, right click on the channel and copy the channel ID (bottom of list). Add this as the value ofĀ channelIDĀ in the .env file within the project and save it as a variable within the index.js file:

    1const channelID = process.env.channelID
    

Now, Courier has access to sending messages to this server as the bot.

Part 3: Send Messages

  • Create a new notification within theĀ Notification Designer

  • Add the Chat notification channel with Discord as the provider

  • Select on the Chat channel on the right to edit the message



  • Write and publish the message. We need to create a clear message that will indicate to our civilians how to escape. Our message will be:Ā Run while you can. You can find shelter here: https://discord.com/invite/courier.


  • Copy the notification template ID from the notificationā€™s settings and add it as the value ofĀ templateIDĀ in the .env file within the project and save it as a variable within the index.js file:


    const templateID = process.env.templateID
    


  • Create a test event and replace theĀ channel_idĀ in the JSON with theĀ channel_idĀ we received from Discord earlier.


{
    "courier": {},
    "data": {},
    "profile": {
      "discord": {
        "channel_id": "768866348853383208"
      }
    },
    "override": {}
  }


  • Test a message to ensure that the Discord provider integration is working correctly.

  • Replace the message with a variableĀ {secretMessage}Ā so that, later, we can edit the message from our code directly.




Part 4: Encrypt Message with the Morse API

  • Create an asynchronous function calledĀ encryptMessage(), which takesĀ originalMessageĀ as a parameter. This function will call the Morse API, which will allow us to translate any message from English to Morse code. The enemy will have to spend more time and resources into decrypting our messages, which will give our civilians time to escape from the server.


async function encryptMessage(originalMessage) {
  }


  • Letā€™s define the GET API call options:


const morseOptions = {
      method: 'GET',
      headers: {
          Accept: 'application/json',
          'Content-Type': 'application/json'
      }
  };


  • We need to attach theĀ originalMessageĀ function parameter to the Morse API endpoint:


const morseEndpoint = "https://api.funtranslations.com/translate/morse.json?text="+originalMessage


  • We need to be able to access the translation from this API call in the body of the Courier API call. To call the API, we can use node-fetch as we did before.


  • Create a variable calledĀ morseResponse, which will hold the entire response from this call.

  • Convert the JSON object into a JavaScript objectĀ morseResponseJSONĀ so that we can read it within our code.

  • Get the translated message out of that object and save it in a new variable calledĀ encryptedMessage.


  • ReturnĀ encryptedMessageĀ so that we can call this function to access it elsewhere.


const morseResponse = await fetch(morseEndpoint, morseOptions);
const morseResponseJSON = await morseResponse.json();
const encryptedMessage = morseResponseJSON.contents.translated;
console.log(encryptedMessage);
return encryptedMessage;


NOTE: The Morse API has a rate limit, which may give you an error if you run it too many times within the hour. In this case, you will have to wait for some time before continuing.

Part 5: Automate Messages

Learn about Automations >


Check out the Automations API reference >


  • Create a new asynchronous function calledĀ runDiscordAutomation(), which will call theĀ encryptMessage()Ā function to translate a message and use the Courier API to automatically send messages to the enemy Discord server everyday.


async function runDiscordAutomation() {
  }


  • Before we can run our message through the Morse translation API, we need to ensure that it is in the correct format, with all spaces converted into their URL encoding,Ā %20Ā as shown below. We can callĀ encryptMessage()Ā withĀ originalMessageĀ as a parameter to translate it.Ā encryptedMessageĀ will evaluate as the translated message.


const originalMessage = "run%20while%20you%20can%20you%20can%20find%20shelter%20here";
  const encryptedMessage = await encryptMessage(originalMessage);


  • Add the link to the safe server in the notification template within the designer: ā€œhttps://discord.com/invite/courierā€
  • Letā€™s define the Courier Automation endpoint and options. Here we will need access to our Courier API Key, which can be found within theĀ Courier Settings page. Save the first value in the .env file as apiKey and access it in this file as process.env.apiKey.


const automationsEndpoint = "https://api.courier.com/automations/invoke"

  const courierOptions = {
      method: "POST",
      headers: {
          Accept: "application/json",
          "Content-Type": "application/json",
          Authorization: 'Bearer ' + process.env.apiKey
      },
      body: JSON.stringify({
          //next steps
      }),
  };


  • The body object within the options will encompass two objects:Ā automationĀ andĀ data


body: JSON.stringify({
      "automation": {
      },
      "data": {
      } 
  }),



  • TheĀ automationĀ object will include aĀ stepsĀ array, which will consist of all steps required for the automation. Our automation consists of reminders that are sent once a day - in this case we will be adding three steps: a send step, a delay, and another send step (so on).


"automation": {
      "steps": [],
  },


  • Each step will need to be defined with two objects: the type ofĀ actionĀ (send, delay, cancel, etc.) andĀ message. TheĀ messageĀ consists of the notification template ID (we saved this in the .env file earlier) and information about where this message is being sent. A Discord message requires either aĀ user_idĀ or aĀ channel_id. In order to reach as many innocent civilians as possible, as quickly as possible, we will directly send messages in a channel.

  • This is what the send and delay steps would look like:


{
      "action": "send",
      "message": {
          "template": templateID,
          "to": {
              "discord": {
                  "channel_id": process.env.channelID
              }
          }
      }
  },
{
      "action": "send",
      "duration":"1 day"
  },

.

  • The data object would need to contain theĀ encryptedMessage:


"data": {
      "secretMessage": encryptedMessage
  }


  • Learn more about sending to a channel via Courier >


  • For testing purposes, itā€™s easier to either remove 1 delay step or keep it at a short period likeĀ 1 minute


  • Finally, we can use node-fetch again to call the Automations API and trigger this automation


fetch(automationsEndpoint, courierOptions)
      .then((response) => response.json())
      .then((response) => console.log(response))
      .catch((err) => console.error(err));




Conclusion

Our Discord bot is ready to save some civilians. Try building a Discord bot of your own and tweet a screenshot of your Courier automated messages in action, and we will send a gift to the first three Secret Agents to complete this task! Head toĀ courier.com/hack-nowĀ to get started. Donā€™t forget to submit your project to ourĀ HackathonĀ for a chance to win over $1000 in cash and prizes!

Quick Links

šŸ”— GitHub Repository:Ā https://github.com/shreythecray/infiltration

šŸ”— Courier:Ā app.courier.com

šŸ”— Register for the Hackathon:Ā https://courier-hacks.devpost.com/

šŸ”— Discord Application and Bot Guide:Ā https://discord.com/developers/docs/getting-started

šŸ”— Courier Discord Provider Docs:Ā https://www.courier.com/docs/guides/providers/direct-message/discord/

šŸ”— Courier Automations Docs:Ā https://www.courier.com/docs/automations/

šŸ”— Courier Automations API Reference:Ā https://www.courier.com/docs/reference/


Originally published here.