Как удалять сообщение, если слово из списка есть в сообщении? aiogram3
Сделал вот такой код:
@router.message()
async def message_censore(msg: Message):
with open('sensore.txt', 'r') as f:
censored_letters = [line.strip() for line in f]
if str(censored_letters) in msg.text:
await msg.delete()
Но он работает только в том случае, если censored_letters заменить на слово в ковычках, например 'мат'. Пробовал выводить список, все слова импортируются.
Ответы (3 шт):
Автор решения: wchistow
→ Ссылка
Проверку надо сделать такой:
if any([cen in msg.text for cen in censored_letters]):
Функция any возвращает True если хотя бы один элемент переданного ей списка истинен.
Автор решения: чистов_n
→ Ссылка
Код:
@router.message()
async def message_censore(msg: Message):
with open('sensore.txt', 'r') as f:
censored_letters = [line.strip() for line in f]
for cen in censored_letters: # (1)
if cen in msg.text: # (2)
await msg.delete() # (3)
return # (4)
Примечания:
- Перебираем все "запрещённые" слова.
- Если слово есть в сообщении...
- ... Удаляем сообщение и ...
- Прерываем работу функции.
Автор решения: Иван Ипатов
→ Ссылка
Я это реализовал вот так:
@router.message(F.text, lambda msg: any(x in msg.text.lower().replace("ё", "е") for x in core.swear_words_list.swears))
async def censure(message: Message):
await message.delete()
await message.answer("Без мата, пожалуйста ⛔")
Мне кажется, что быстрее будет создать python-файл со списком, чем прочитывать его каждый раз из текстового файла и не забудьте его поставить первым в аргументах dp.include_routers()