DEV Community

Lucas Gragg
Lucas Gragg

Posted on

Server moderation automation

Server moderation is often the most tedious part of managing an online community. If you've ever tried to keep a Discord or Telegram server free from spam and toxic behavior, you know exactly what I mean. Automating the moderation process can save you a lot of time and headaches. In this post, I'll share how I approached building an automated moderation system using Python, and some pitfalls and insights I discovered along the way.

Understanding the Basics

Before diving into the code, it's important to understand what server moderation typically involves. The primary responsibilities are:

  • Detecting and filtering spam
  • Removing inappropriate content
  • Managing user bans and warnings
  • Logging incidents for review

The goal is to automate these as much as possible, while still allowing some human oversight for more nuanced decisions.

Setting Up the Bot Framework

To start, I used the discord.py library for Discord and python-telegram-bot for Telegram. Both libraries provide the essential tools needed to interact with their respective APIs.

Here's a basic setup for a Discord bot using discord.py:

import discord
from discord.ext import commands

bot = commands.Bot(command_prefix='!')

@bot.event
async def on_ready():
    print(f'Logged in as {bot.user}')

# A simple command to check if the bot is working
@bot.command()
async def ping(ctx):
    await ctx.send('Pong!')

bot.run('YOUR_DISCORD_TOKEN')
Enter fullscreen mode Exit fullscreen mode

For Telegram, the setup is similar, where you define handlers for different types of messages and events.

Implementing Auto-Moderation

One of the crucial features of an automated moderation system is spam detection. In the simplest form, this can be done using keyword matching. However, more sophisticated methods involve machine learning models that can classify messages based on training data. For now, let's stick with a basic example:

@bot.event
async def on_message(message):
    if message.author == bot.user:
        return

    bad_words = ['spam', 'offensive_word']
    if any(word in message.content.lower() for word in bad_words):
        await message.delete()
        await message.channel.send(f'{message.author.mention}, watch your language!')

    await bot.process_commands(message)
Enter fullscreen mode Exit fullscreen mode

This snippet checks each message for certain keywords and deletes the message if it finds any. You can expand this to involve more complex checks or integrate with machine learning models for better accuracy.

The Gotcha: False Positives

One major issue I ran into was the problem of false positives. A simple keyword approach can often flag innocent messages. To mitigate this, I started with a simple logging mechanism to review flagged messages:

import logging

logging.basicConfig(level=logging.INFO, filename='moderation.log', filemode='w')

def log_moderation_action(action, user, message):
    logging.info(f'{action} by {user}: {message}')
Enter fullscreen mode Exit fullscreen mode

This allowed me to keep track of what was being flagged and refine my list of bad words or adjust thresholds on a more sophisticated model.

Bringing It All Together

Developing an effective server moderation system involves continual refinement and iteration. You start with a basic setup, monitor the results, and adjust your approach based on the findings. If you're managing multiple servers or want a more robust solution without the hassle, I actually packaged this into a tool called Discord & Telegram Bot. It provides a unified framework for building bots on both platforms with built-in auto-moderation features.

With the right tools and a well-thought approach, server moderation doesn't have to be a pain. Automating these processes lets you focus on what truly matters—building a healthy and engaged community.

Also available on Payhip with instant PayPal checkout.


If you need a server to run your bots 24/7, I use DigitalOcean — $200 free credit for new accounts.

Top comments (0)