From a5c586e700dbe38a2b794736d15921091b87e6c6 Mon Sep 17 00:00:00 2001 From: Whyverum Date: Fri, 20 Feb 2026 23:11:10 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D1=81=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B2=D1=82=D0=BE=D1=80=D0=B0=D0=BC=D0=B8=20=D1=81=D0=B8?= =?UTF-8?q?=D0=BC=D0=B2=D0=BE=D0=BB=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot/middlewares/banwords_mdw.py | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/bot/middlewares/banwords_mdw.py b/bot/middlewares/banwords_mdw.py index 99e2ea3..7d4f459 100644 --- a/bot/middlewares/banwords_mdw.py +++ b/bot/middlewares/banwords_mdw.py @@ -10,7 +10,7 @@ Middleware для проверки сообщений на запрещённы - Нет уведомлений в режиме тишины """ -from typing import Callable, Dict, Any, Awaitable, Optional, Set +from typing import Callable, Dict, Any, Awaitable, Optional import re import unicodedata @@ -20,7 +20,7 @@ from aiogram.exceptions import TelegramBadRequest from configs import settings, UNICODE_MAP, LATIN_TO_CYRILLIC, CYRILLIC_NORMALIZE from database import get_manager, BanWordType -from bot.special import process_text, extract_words, get_lemma +from bot.special import extract_words, get_lemma from middleware.loggers import logger __all__ = ("BanWordsMiddleware",) @@ -40,7 +40,7 @@ class TextNormalizer: FULL_MAP.update(UNICODE_MAP) # Символы-разделители, которые могут быть вставлены между буквами - SEPARATORS = re.compile(r'[\s\.\-_,;:|]+', re.UNICODE) + SEPARATORS = re.compile(r'[\s.\-_,;:|]+', re.UNICODE) # Паттерн для поиска повторяющихся букв (3+ раза) REPEAT_PATTERN = re.compile(r'([а-яёa-z])\1{2,}', re.IGNORECASE) @@ -68,15 +68,10 @@ class TextNormalizer: @classmethod def collapse_repeats(cls, text: str, max_repeat: int = 2) -> str: - """ - Заменяет повторения символов более max_repeat подряд на один/два символа. - По умолчанию оставляет максимум 2 (леееейн → леейн? но обычно хватит 2). - Можно настроить: для банворда "лейн" превратит "леееейн" в "леейн", что всё равно содержит "лейн". - """ def repl(m): ch = m.group(1) - # Оставляем два символа, чтобы не терять удвоенные буквы (например, "дд" в слове "поддон") - return ch * 2 + return ch # вместо ch * 2 — теперь схлопываем до одного символа + return cls.REPEAT_PATTERN.sub(repl, text) @classmethod @@ -160,9 +155,9 @@ class BanWordsMiddleware(BaseMiddleware): Возвращает словарь с причиной блокировки или None. """ # 1. Повторяющиеся символы (например, "леееейн") — блокируем сразу - repeat_result = self._check_repeated_chars(text) - if repeat_result: - return repeat_result + # repeat_result = self._check_repeated_chars(text) + # if repeat_result: + # return repeat_result # 2. Получаем кэшированные списки substring_words = self.manager.get_banwords_cached(BanWordType.SUBSTRING)