我正试图创建我的discord.py机器人,以删除带有脏话的邮件,然后发布公告,宣布该行为并滥用他的行为。我在.txt文件中加载了坏词列表,看起来像:“ Badword,badword2等”
我尝试了很多方法,但是我真的不知道该怎么做。
import discord
from discord.ext import commands,tasks
import datetime
from itertools import cycle
import os
bot = commands.Bot(command_prefix = '/')
with open('badwords.txt','r') as file:
bad_words = [bad_word.strip(', ').lower() for bad_word in file.read()]
@bot.event
async def on_message(message):
if any(bad_word in message.content.strip().lower() for bad_word in bad_words):
await message.channel.send(f"{message.author.mention}, твое сообщение не прошло цензуру")
await message.channel.purge(limit=1)
await bot.process_commands(message)
该机器人称呼自己太多,看起来像是递归的! 他不仅会对坏话做出反应,还会对好话做出反应。
答案 0 :(得分:0)
我想说的最好的解决方案是使用re
。
如果至少是为了清楚起见并且不删除其发送的消息,那么您可能只使用GuildChannel.purge
时就使用message.delete
,而bot.process_commands
永远不会如果您使用该逻辑,除非有一个不好的词被调用,如果没有不好的词或将其放在方法的末尾,则调用它。
with open('badwords.txt','r') as f:
bad_words = '|'.join(s for l in f for s in l.split(', '))
bad_word_checker = re.compile(bad_words).search
@bot.event
async def on_message(message)
if bad_word_checker(message.content):
await message.delete()
await message.channel.send(...)
else:
await bot.process_commands(message)
答案 1 :(得分:0)
问题是
[bad_word.strip(', ').lower() for bad_word in file.read()]
file.read()读取一个字符串中的整个文件,对其进行迭代就意味着您要对字符串的字符进行迭代,因此对于列表理解,bad_words不包含单词而是包含字母。 在您显示的示例中,用户发送了一个字符的消息,因此,如果该字符在文件中至少出现一次,则您的漫游器会将其视为一个坏词。
确切的解决方案取决于您的badwords.txt格式,您说这是同一行中所有用','分隔的单词,那么这应该可行
bad_words = file.read().strip().lower().split(', ')
答案 2 :(得分:0)
所以我现在解决这个问题。就像 polku 所说的那样,这是一个迭代错误,那就是! 我还用了俄语单词,我猜他们在加密方面犯了错误(您可以通过 MIMEtext 解决它)。这是我的最终代码:
with open('badwords.txt') as file:
file = file.read().split()
#----------------------------------EVENTS----------------------------------
@bot.event
async def on_message(message):
for badword in file:
if badword in message.content.lower():
await message.delete()
await message.channel.send(f'{message.author.mention}! Your message has not passed moderation!')
else:
await bot.process_commands(message)