If someone says a bad word that triggers the automod, the bot will delete the message, DM the user, and log it in a log channel.
The problem is if someone blocks the bot and says a bad word, the bot can’t DM the user which doesn’t allow the bot to log the event in a log channel.
I tried multiple ways to fix this by adding if
and else
and except
but those do not help. Below is the current code that I have already, so how can I make the bot still log the event if the offender has blocked the bot?
@commands.Cog.listener() async def on_message(self, message): curseWord = ['bad words here'] msg_content = message.content.lower() if any(word in msg_content for word in curseWord): if message.channel.type == discord.ChannelType.private: return if message.author.id == 330988962162147329: #johnny return if message.author.id == 467715040087244800: #me return if message.author.id == 261578097978114050: #devvy return if message.author.id == 835307493558321172: #examplebot return await message.delete() embed=discord.Embed(title="No No Word", description=f"{message.author.mention}, Hey! Those words arent allowed here!", color=0x00FFFF) embed.timestamp = datetime.datetime.utcnow() author = message.author pfp = author.avatar_url embed.set_author(name=f"{author.name}", icon_url=pfp) await message.channel.send(embed=embed) dmembed=discord.Embed(title="AutoMod", description="You were caught saying a bad word!", color=0x00FFFF) dmembed.add_field(name="**Message:**", value=f"{msg_content}", inline=False) pfp = author.avatar_url dmembed.add_field(name="**Server:**", value=f"{message.guild.name}", inline=False) dmembed.set_author(name=f"{author.name}", icon_url=pfp) dmembed.timestamp = datetime.datetime.utcnow() with open('logchannel.json', 'r', encoding='utf-8') as fp: log_channel = json.load(fp) try: await message.author.send(embed=dmembed) if log_channel: log_channel = message.guild.get_channel(log_channel[str(message.guild.id)]) logembed=discord.Embed(title="Bot Log", description="Bad Word Said", color=0x00FFFF) logembed.add_field(name="**Message:**", value=f"{msg_content}", inline=False) logembed.add_field(name="**Member:**", value=f"{message.author.name}", inline=False) author = message.author pfp = author.avatar_url logembed.set_author(name=f"{author}", icon_url=pfp) logembed.timestamp = datetime.datetime.utcnow() await log_channel.send(embed=logembed) else: await log_channel.send(embed=logembed) except (AttributeError, KeyError): await log_channel.send(embed=logembed)
Advertisement
Answer
Try/except
When you have a try
/except
in your code, Python will try to execute the code, and if there is and error he will execute the code in the except
section. So a code in the try
section may be not executed.
What in your code needs a try
/except
?
In your code, the things which could raise an error are :
await message.author.send(embed=dmembed) #DM closed log_channel = ...(log_channel[str(message.guild.id)]) #key error await log_channel.send(embed=logembed) #NoneType has no attribute send (if the channel doesn't exist)
Which means that if there is an error on the first possibility, all the following code in the try
will not be executed.
Solution
I advise you to have two try
/except
, the first for the DM, and the second for the log.
You code with my solution is now :
try: await message.author.send(embed=dmembed) except: pass #ignore error if DM are closed try: if log_channel: log_channel = message.guild.get_channel(log_channel[str(message.guild.id)]) logembed=discord.Embed(title="Bot Log", description="Bad Word Said", color=0x00FFFF) logembed.add_field(name="**Message:**", value=f"{msg_content}", inline=False) logembed.add_field(name="**Member:**", value=f"{message.author.name}", inline=False) author = message.author pfp = author.avatar_url logembed.set_author(name=f"{author}", icon_url=pfp) logembed.timestamp = datetime.datetime.utcnow() await log_channel.send(embed=logembed) else: #You can remove that, because if `log_channel` is not, you can't send an embed await log_channel.send(embed=logembed) #So you can also remove that except (AttributeError, KeyError): await log_channel.send(embed=logembed) #Same here, if the above code raises an error, this code can be executed without raising another error. pass