DEV Community

Cover image for Creating a Moderation Bot for Discord
Emīls Oto Leimanis
Emīls Oto Leimanis

Posted on

3 1 1 2 2

Creating a Moderation Bot for Discord

In this guide, we’ll create a simple moderation bot for Discord using Node.js and the Discord.js library. This bot will include features like banning, muting, and monitoring chat activity.

Creating a Moderation Bot for Discord

In this guide, we’ll create a simple moderation bot for Discord using Node.js and the Discord.js library. This bot will include features like banning, muting, and monitoring chat activity.


Prerequisites

  1. Node.js Installed: Download and install Node.js from nodejs.org.
  2. Discord Account: Ensure you have a Discord account and administrative access to the server where you’ll test the bot.
  3. Basic JavaScript Knowledge: Familiarity with JavaScript basics is recommended.

Step 1: Create a New Discord Bot

  1. Go to the Discord Developer Portal.
  2. Click New Application and give your bot a name.
  3. In the left sidebar, go to Bot and click Add Bot.
  4. Copy the bot’s Token for later use (keep it private).
  5. Under "Privileged Gateway Intents," enable MESSAGE CONTENT INTENT to allow the bot to read messages.

Step 2: Set Up Your Project

  1. Open a terminal and create a new folder for your bot:
   mkdir discord-moderation-bot
   cd discord-moderation-bot
Enter fullscreen mode Exit fullscreen mode
  1. Initialize a new Node.js project:
   npm init -y
Enter fullscreen mode Exit fullscreen mode
  1. Install Discord.js:
   npm install discord.js
Enter fullscreen mode Exit fullscreen mode
  1. Create an index.js file in the folder to hold your bot’s code:
   touch index.js
Enter fullscreen mode Exit fullscreen mode

Step 3: Write the Bot Code

Open index.js in a code editor and add the following code:

1. Import and Configure Discord.js

const { Client, GatewayIntentBits } = require('discord.js');
const client = new Client({
    intents: [
        GatewayIntentBits.Guilds,
        GatewayIntentBits.GuildMessages,
        GatewayIntentBits.MessageContent,
        GatewayIntentBits.GuildMembers
    ]
});

const TOKEN = 'YOUR_BOT_TOKEN'; // Replace with your bot token
Enter fullscreen mode Exit fullscreen mode

2. Set Up Bot Login and Ready Event

client.once('ready', () => {
    console.log(`Logged in as ${client.user.tag}!`);
});

client.login(TOKEN);
Enter fullscreen mode Exit fullscreen mode

3. Add Moderation Commands

Ban Command

client.on('messageCreate', (message) => {
    if (message.content.startsWith('!ban')) {
        if (!message.member.permissions.has('BanMembers')) {
            return message.reply('You do not have permission to ban members.');
        }

        const member = message.mentions.members.first();
        if (!member) {
            return message.reply('Please mention a user to ban.');
        }

        member.ban()
            .then(() => message.reply(`${member.user.tag} has been banned.`))
            .catch((err) => message.reply('I was unable to ban the member.'));  
    }
});
Enter fullscreen mode Exit fullscreen mode

Mute Command

client.on('messageCreate', (message) => {
    if (message.content.startsWith('!mute')) {
        if (!message.member.permissions.has('ManageRoles')) {
            return message.reply('You do not have permission to mute members.');
        }

        const member = message.mentions.members.first();
        if (!member) {
            return message.reply('Please mention a user to mute.');
        }

        let muteRole = message.guild.roles.cache.find(role => role.name === 'Muted');
        if (!muteRole) {
            return message.reply('No "Muted" role found. Please create one first.');
        }

        member.roles.add(muteRole)
            .then(() => message.reply(`${member.user.tag} has been muted.`))
            .catch((err) => message.reply('I was unable to mute the member.'));  
    }
});
Enter fullscreen mode Exit fullscreen mode

Clear Messages Command

client.on('messageCreate', (message) => {
    if (message.content.startsWith('!clear')) {
        if (!message.member.permissions.has('ManageMessages')) {
            return message.reply('You do not have permission to manage messages.');
        }

        const args = message.content.split(' ');
        const amount = parseInt(args[1]);

        if (isNaN(amount) || amount <= 0) {
            return message.reply('Please specify a valid number of messages to delete.');
        }

        message.channel.bulkDelete(amount, true)
            .then((deletedMessages) => message.reply(`Deleted ${deletedMessages.size} messages.`))
            .catch((err) => message.reply('I was unable to delete messages.'));  
    }
});
Enter fullscreen mode Exit fullscreen mode

Step 4: Invite the Bot to Your Server

  1. Go back to the Discord Developer Portal.
  2. In the left sidebar, click OAuth2 > URL Generator.
  3. Under Scopes, select bot. Under Bot Permissions, select:
    • Ban Members
    • Manage Roles
    • Manage Messages
  4. Copy the generated URL and paste it into your browser to invite the bot to your server.

Step 5: Test Your Bot

  1. Run the bot:
   node index.js
Enter fullscreen mode Exit fullscreen mode
  1. In your Discord server, try using the following commands:
    • !ban @user to ban a user.
    • !mute @user to mute a user (ensure a "Muted" role exists).
    • !clear <number> to delete a specified number of messages.

Additional Tips

  1. Improve Error Handling: Add better logging and user feedback for errors.
  2. Add a Help Command: Provide users with a list of commands and their descriptions.
  3. Secure Your Bot Token: Use environment variables or a configuration file to keep your token safe.
  4. Expand Features: Add warnings, unmute, or even automatic spam detection using a message tracker.

With this guide, you have a fully functional moderation bot that you can customize to suit your server’s needs!

Image of Timescale

Timescale – the developer's data platform for modern apps, built on PostgreSQL

Timescale Cloud is PostgreSQL optimized for speed, scale, and performance. Over 3 million IoT, AI, crypto, and dev tool apps are powered by Timescale. Try it free today! No credit card required.

Try free

Top comments (2)

Collapse
 
colinmcdermott profile image
Colin McDermott

Nice tutorial

Collapse
 
john_fighters_7d4c21d3ca6 profile image
john fighters

what terminal

Image of Timescale

Timescale – the developer's data platform for modern apps, built on PostgreSQL

Timescale Cloud is PostgreSQL optimized for speed, scale, and performance. Over 3 million IoT, AI, crypto, and dev tool apps are powered by Timescale. Try it free today! No credit card required.

Try free

👋 Kindness is contagious

Explore a sea of insights with this enlightening post, highly esteemed within the nurturing DEV Community. Coders of all stripes are invited to participate and contribute to our shared knowledge.

Expressing gratitude with a simple "thank you" can make a big impact. Leave your thanks in the comments!

On DEV, exchanging ideas smooths our way and strengthens our community bonds. Found this useful? A quick note of thanks to the author can mean a lot.

Okay