@DoubleCool

Почему бот не работает так, как это планировалось?

Решил написать код для фильтрации чата. Суть такова: есть чёрный список слов, и белый список слов, а к ним прилагается белый список ролей (роли, на которые бот не должен реагировать, даже если они написали что-то из чёрного списка слов).

Сама проблема: в данный момент в коде указано две роли из белого списка ролей, но бот продолжает удалять сообщения, будто такого понятия, как "white_list_roles" - не существует. Зато если указана одна роль, то всё работает.

Также отдельная благодарность будет, если вы скажете, как в этот код интегрировать проверку регистра.

@client.event
async def on_message(message):
	black_list=["нига","негр"]
	white_list=["книга","неграмотный"]
	white_list_role1=discord.utils.get(message.guild.roles, name="Модератор")
	white_list_role2=discord.utils.get(message.guild.roles, name="Администратор")
	white_list_roles=[white_list_role1,white_list_role2]
	for roles in white_list_roles:
		if roles in message.author.roles:
			pass
		else:
			if message.content in black_list:
				await message.delete()
			elif message.content in white_list:
				pass
  • Вопрос задан
  • 117 просмотров
Решения вопроса 1
@o5a
Можно просто проверять как пересечение двух множеств
if set(white_list_roles) & set(message.author.roles):
    # я админ, могу ругаться
else:
    # я холоп, ругаться нельзя
    if any(bad_word in message.content for bad_word in black_list):
        await message.delete()

Для учета регистра нужно там же использовать содержимое сообщения в нижнем регистре message.content.lower()

В данной постановке не совсем понятно, как именно должен учитываться список разрешенных слов?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
SagePtr
@SagePtr
Еда - это святое
Нужно сначала проверить выполнение всех белых условий, и только потом проверять чёрные условия, если ни одно белое не сработало. Иначе - при первой же непрошедшей белой проверке начнёт проверять чёрные и удалит сообщение.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы