Как удалять сообщение, если слово из списка есть в сообщении? 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)

Примечания:

  1. Перебираем все "запрещённые" слова.
  2. Если слово есть в сообщении...
  3. ... Удаляем сообщение и ...
  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()

→ Ссылка