#python #discord.py
Вопрос:
Я пытаюсь блокировать сообщения, содержащие ругательства.Кстати, ругательства в текстовом файле.Итак,я застрял,потому что всякий раз, когда я пишу ругательства, бот не отвечает на мое сообщение.Это мой код:
@client.event
async def on_message(message):
global swearword_count
global badwords
if message.author == client.user:
await client.process_commands(message)
else:
msg = message.content
for x in msg:
try:
if x in badwords:
if exception_counter[str(message.author.id)] == 0:
await message.channel.send("Please do not use this word ever")
swearword_count[str(message.author.id)] = 1
if swearword_count[str(message.author.id)] > 5 and exception_counter == 1:
await message.author.send("You've been banned due to bad words that you used.")
elif swearword_count[str(message.author.id)] > 5 and exception_counter == 0:
await message.author.send("You've been banned due to bad words that you used.")
await message.channel.send("Don't use this word")
else:
pass
except KeyError:
exception_handling[str(message.author.id)] = 1
swearword_count[str(message.author.id)] = 0
await message.author.send("If you use this word,you will get banned.")
continue
await client.process_commands(message)
@client.event
async def on_member_join(member):
channel = discord.utils.get(member.guild.text_channels, name="welcome")
await channel.send(f"{member.name},welcome :)")
global swearword_count
swearword_count[str(member.id)] = 0
exception_handling[str(member.id)] = 0
dm_channell = await member.create_dm()
await dm_channell.send(f"{member},welcome mate :)")
Я использовал словари для хранения данных пользователей.Итак, как я могу решить эту проблему?Если у вас есть какой-нибудь совет,я бы с удовольствием его посмотрел
PS:Мои команды работают правильно.
Комментарии:
1. Это выглядит как сообщение.содержимое представляет собой поток или список символов. Вам нужно разбить его на слова, прежде чем вы начнете искать их в списке плохих слов.
Ответ №1:
Это потому for x in msg:
, что разбивает ваше сообщение на отдельные буквы. Вы должны разрезать его , например, пробелами: for x in msg.split(" "):
, но таким образом, если кто-то напишет «плохое слово» без пробелов (например, «плохое слово«), это не сработает. Так что попробуйте это:
for x in badwords:
try:
if x in msg:
...
Это поймает все «плохие слова», но если вы напишете слово, в котором содержится ругательство, оно также будет поймано.
Комментарии:
1. Кроме того, об этом, возможно, стоит упомянуть. Тот
for loop
выходит один на один для всех матерных слов, поэтому, если у вас несколько матерных слов в одном сообщении, что они будут пойманы несколько раз, так что вы можете переместить код, который отправляет сообщения послеfor loop
использования илиbreak
заявление после ловли бранное слово, поэтому вы не будете слать сообщения несколько раз, или рассчитывать все бранные слова, потому что кто-то может получить бан после одного сообщения.