DEV Community

shadowtime2000
shadowtime2000

Posted on • Edited on

How to make a Discord bot Creating An Announcement Discord Bot

A tutorial on creating a simple discord bots for announcements.

How it will work

Our bot will work in the following steps:

  1. Take announcement command e.g. !announce <announcement here>
  2. Check if user has announcer role
  3. Post announcement through Discord webhook

Setting up

First, enter a blank folder an set it up with npm init. Then, install discord.js with npm i discord.js --save. Then, head towards the Discord Developer Portal and create a new application. You can name it whatever you want, but you should probably name it something like Announcement Bot. Then, open the bot page and click create a bot. Inside your development folder create a file named config.json, and in it write this:

{
  "token":"put your discord token here",
  "announcer-role": "announcer role Id",
  "webhookToken": "webhook token",
  "webhookID": "webhook ID"
}
Enter fullscreen mode Exit fullscreen mode

Fill in the Discord bot token in the token field.
You can invite your bot to a test server with the link: https://discord.com/oauth2/authorize?client_id=APPID&scope=bot, but fill in the APPID with the ID of your Discord application.
In your server, create a role called Announcer and copy the role ID. You can get the ID if you turn on developer mode in the Appearance section of Discord's settings. Fill in the announcer-role field of config.json. Also, create a channel for announcements and create a webhook for that channel. Fill in the webhook fields accordingly.

Now lets get started with the programming!

Coding the bot

Create a file named index.js and fill in the following code:

const Discord = require("discord.js");
const config = require("./config.json");

const client = new Discord.Client();
const webhookClient = new Discord.WebhookClient(config.webhookID, config.webhookToken);

client.once("ready", () => {
  console.log("Ready for action!");
});

client.on("message", (message) => {
  if (!message.member.roles.cache.has(config["announcer-role"]) || !message.content.startsWith("!") || message.author.bot) return;

  const args = message.content.slice(1).trim().split(' ');
  const command = args.shift().toLowerCase();

  if (command == "announce") {
    var announcement = "";
    for (const word in args) {
      announcement = announcement + args[word] + " ";
    }
    webhookClient.send(announcement)
  }
})

client.login(config.token);
Enter fullscreen mode Exit fullscreen mode

Next Steps

So you have done it! You have successfully made a Discord announcement bot!

A couple things you could do:

  • This bot is built to work with only one server. Try customizing it so it could work on multiple servers
  • Allow customization of prefix in the config.json file
  • Currently, the bot is just repeating whatever someone says with the command, which isn't that useful. Try getting it to send announcements in a better format

The source code for this tutorial is uploaded on Github

Latest comments (10)

Collapse
 
jjproplay profile image
JJProplay • Edited

Hmm, is there some additional module missing

/home/container/index.js:12
if (!message.member.roles.cache.has(config["announcer-role"]) || !message.content.startsWith("!") || message.author.bot) return;
^

TypeError: Cannot read property 'roles' of null
at Client. (/home/container/index.js:12:23)
at Client.emit (events.js:314:20)
at MessageCreateAction.handle (/home/container/node_modules/discord.js/src/client/actions/MessageCreate.js:31:14)
at Object.module.exports as MESSAGE_CREATE
at WebSocketManager.handlePacket (/home/container/node_modules/discord.js/src/client/websocket/WebSocketManager.js:386:31)
at WebSocketShard.onPacket (/home/container/node_modules/discord.js/src/client/websocket/WebSocketShard.js:436:22)
at WebSocketShard.onMessage (/home/container/node_modules/discord.js/src/client/websocket/WebSocketShard.js:293:10)
at WebSocket.onMessage (/home/container/node_modules/ws/lib/event-target.js:132:16)
at WebSocket.emit (events.js:314:20)
at Receiver.receiverOnMessage (/home/container/node_modules/ws/lib/websocket.js:1008:20)
container@jnode~ Server marked as offline...

Collapse
 
nlmfr profile image
NLM-fr

Hey I was wondering if they was a way to make an announcement embed everytime ?

Collapse
 
infinitequinox profile image
InfinitEquinox

How would you turn on your bot?

Collapse
 
shadowtime2000 profile image
shadowtime2000

You need NodeJS. You can run the bot with

$ node index.js
Enter fullscreen mode Exit fullscreen mode
Collapse
 
elcorporation1 profile image
E.L. Corporation

Where should I run that? Every time I get the same error.

C:\Users\leoth>node LeOS\index.js
node:internal/modules/cjs/loader:903
throw err;
^

Error: Cannot find module 'C:\Users\leoth\LeOS\index.js'
←[90m at Function.Module._resolveFilename (node:internal/modules/cjs/loader:900:15)←[39m
←[90m at Function.Module._load (node:internal/modules/cjs/loader:745:27)←[39m
←[90m at Function.executeUserEntryPoint as runMain←[39m
←[90m at node:internal/main/run_main_module:17:47←[39m {
code: ←[32m'MODULE_NOT_FOUND'←[39m,
requireStack: []
}

Thread Thread
 
shadowtime2000 profile image
shadowtime2000

You should be inside the folder that you put the code in.

Collapse
 
katusha83 profile image
katusha83

is devvlopers poral ?

Collapse
 
shadowtime2000 profile image
shadowtime2000

Sorry, but I don't understand what you mean by that question. Could you elaborate?

Some comments may only be visible to logged-in visitors. Sign in to view all comments.