discord.py has an extensive collection of features. Events are one of the most useful of these. Events are used for welcoming bots, reaction roles, and lots of other functions. This guide will teach you more about events, and how you can use them in your discord bot. In the end, we will have the bot print to the console when it is signed in, and give it a simple moderation and logging system.
If you haven't yet, I suggest reading the earlier post in this series, as this builds on the previous post.
So far, we have the following code:
import discord
from discord.ext import commands
bot = commands.Bot(command_prefix="!", case_insensitive=True)
@bot.command(name='hello', description="Greet the user!")
async def hello(ctx):
await ctx.send(f"Hello {ctx.author.name}!") # f-string
bot.run('token')
But what if we want to delete a message when a user sends a link in the chat? They obviously wouldn't use a command.
We can use the on_message
event to trigger a function whenever a message is sent.
We first want to use the event
decorator to tell discord.py that this is an event.
@bot.event
async def on_message(message):
if 'https://' in message.content:
await message.delete()
await message.channel.send(f"{message.author.mention} Don't send links!")
else:
await bot.process_commands(message)
Now, if we send a link, the bot will warn us!
Automoderation π§
But what if we want to create a profanity list?
badwords = ['bad', 'words', 'here']
@bot.event
async def on_message(message):
for i in badwords: # Go through the list of bad words;
if i in message:
await message.delete()
await message.channel.send(f"{message.author.mention} Don't use that word here!")
return # So that it doesn't try to delete the message again.
await bot.process_commands(message)
Logging π
Events are called by using the dispatch
function. When a message is sent, the internals of discord.py uses bot.dispatch('message', message_object)
. This triggers other parts of discord.py to find the function called on_message
and run it. So, we could make our own event that logs profanity!
So let's adapt on the code so that it will use a logging system!
badwords = ['bad', 'words', 'here']
@bot.event
async def on_message(message):
for i in badwords: # Go through the list of bad words;
if i in message.content:
await message.delete()
await message.channel.send(f"{message.author.mention} Don't use that word!")
bot.dispatch('profanity', message, i)
return # So that it doesn't try to delete the message again, which will cause an error.
await bot.process_commands(message)
Our logging code:
Before beginning this section, you will need to know how to get channel IDs. You can follow this guide if you need to enable developer mode.
You will need to get your log channel ID so that the bot can access the specific channel. Don't worry, IDs aren't private, so you don't have to worry about sharing them.
@bot.event
async def on_profanity(message, word):
channel = bot.get_channel(channel_id_here) # for me it's bot.get_channel(817421787289485322)
embed = discord.Embed(title="Profanity Alert!",description=f"{message.author.name} just said ||{word}||", color=discord.Color.blurple()) # Let's make an embed!
await channel.send(embed=embed)
Congrats! You just:
- Created your own event
- Created a simple automoderation system
- Logged when the rules are broken
- Created an embed
Next, we'll be creating a Discord bot that moderates invite links!
Top comments (11)
hey, very helpful guide. I was wondering how to trigger an event only if a certain user triggers it? For example, if I wanted to kick a certain user that said 'hello', but not have that kick apply to anyone else who said 'hello', how would I do that?
Events are always sent through to the bot, no matter who it's from. However, you can filter them using an
if
statement. For example, this snippet would work:You'll want to make sure you use
.lower()
on the text, because if you don't, they can sendhEllo
or just change the case of other letters to dodge your system.Hi friend! very good post, and how I see you are also pythonist xD, I really like Python hehe, I have a bot in Discord.py, I do not know much every day I'm getting new things,For now Search by: YouTube, Google, Wikipedia, among other things :slight_smile: I plan to write more post and translate them so that everyone can read, to my bot also translates texts
That's actually really cool! So you're making a translation bot?
Hello, good exactly no, I mean my bot is of general purpose, translates and make searches also that if interacting with users and so, and good at discord.py because I really like python :p dev-to-uploads.s3.amazonaws.com/up...
Well your bot looks really nice!
HI,
Thanks for all this explanation.
I need to make a py script that only receive message from a server.
The server is not mine, how can I register to this server ?
Do you have tips to help me.
Thanks
You can see a guide created by the discord.py creator here to add the bot to the server, which is what you want to do. Make sure that you have the
Manage Server
permission.I haven't this permission , the channel is not mine that why I'm looking for another way
You'll need to ask a channel admin to add the bot.
hey can any can help how i can add backend trigger url in my code
@client.command(aliases=['AVN'])
async def AVN(ctx):
await ctx.send(f'@everyone Please all join AVN immediately!!!')