From 4f5aaba0ce8f5f71581e679187c80fcc51cf5e62 Mon Sep 17 00:00:00 2001 From: Verum Date: Mon, 23 Feb 2026 14:07:32 +0700 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=BD=D0=B8=D1=86=D0=B8=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=82=D0=BE=D1=80=20=D0=BC=D0=BE=D0=B4=D1=83?= =?UTF-8?q?=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot/__init__.py | 4 + bot/core/__init__.py | 5 + bot/filters/__init__.py | 11 ++ bot/handlers/__init__.py | 16 +++ bot/handlers/commands/__init__.py | 16 +++ bot/handlers/commands/admins/__init__.py | 18 +++ bot/handlers/commands/settings/__init__.py | 19 +++ bot/handlers/commands/users/__init__.py | 37 ++++++ bot/handlers/messages/__init__.py | 15 +++ bot/keyboards/__init__.py | 2 + bot/middlewares/__init__.py | 142 +++++++++++++++++++++ bot/special/__init__.py | 1 + bot/states/__init__.py | 0 bot/tasks/__init__.py | 4 + bot/templates/__init__.py | 1 + bot/utils/__init__.py | 39 ++++++ configs/__init__.py | 3 + database/__init__.py | 39 ++++++ middleware/__init__.py | 2 + middleware/loggers/__init__.py | 1 + middleware/validators/__init__.py | 2 + 21 files changed, 377 insertions(+) create mode 100644 bot/__init__.py create mode 100644 bot/core/__init__.py create mode 100644 bot/filters/__init__.py create mode 100644 bot/handlers/__init__.py create mode 100644 bot/handlers/commands/__init__.py create mode 100644 bot/handlers/commands/admins/__init__.py create mode 100644 bot/handlers/commands/settings/__init__.py create mode 100644 bot/handlers/commands/users/__init__.py create mode 100644 bot/handlers/messages/__init__.py create mode 100644 bot/keyboards/__init__.py create mode 100644 bot/middlewares/__init__.py create mode 100644 bot/special/__init__.py create mode 100644 bot/states/__init__.py create mode 100644 bot/tasks/__init__.py create mode 100644 bot/templates/__init__.py create mode 100644 bot/utils/__init__.py create mode 100644 configs/__init__.py create mode 100644 database/__init__.py create mode 100644 middleware/__init__.py create mode 100644 middleware/loggers/__init__.py create mode 100644 middleware/validators/__init__.py diff --git a/bot/__init__.py b/bot/__init__.py new file mode 100644 index 0000000..bfe8a87 --- /dev/null +++ b/bot/__init__.py @@ -0,0 +1,4 @@ +from .core import * +from .handlers import router +from .middlewares import * +from .filters import * diff --git a/bot/core/__init__.py b/bot/core/__init__.py new file mode 100644 index 0000000..a3d3c93 --- /dev/null +++ b/bot/core/__init__.py @@ -0,0 +1,5 @@ +""" +Модуль управления ботом +""" +from .bots import * +from .webhook import * diff --git a/bot/filters/__init__.py b/bot/filters/__init__.py new file mode 100644 index 0000000..8c63804 --- /dev/null +++ b/bot/filters/__init__.py @@ -0,0 +1,11 @@ +""" +Модуль фильтров для aiogram +""" +from .subscription import * +from .admin import * +from .spam import * +from .modes import * +from .chat_type import * +from .msg_content import * +from .chat_rights import * +from .callback import * diff --git a/bot/handlers/__init__.py b/bot/handlers/__init__.py new file mode 100644 index 0000000..8a43f06 --- /dev/null +++ b/bot/handlers/__init__.py @@ -0,0 +1,16 @@ +from aiogram import Router + +from .commands import router as cmd_routers +from .messages import router as messages_routers +from .chl_comment import router as channels_routers + +# Настройка экспорта и роутера +__all__ = ("router",) +router: Router = Router(name=__name__) + +# Подключение роутеров +router.include_routers( +channels_routers, + cmd_routers, + messages_routers, +) diff --git a/bot/handlers/commands/__init__.py b/bot/handlers/commands/__init__.py new file mode 100644 index 0000000..f8baa9f --- /dev/null +++ b/bot/handlers/commands/__init__.py @@ -0,0 +1,16 @@ +from aiogram import Router + +#from .admins import router as admin_cmd_router +from .users import router as users_cmd_router +#from .settings import router as settings_cmd_router + +# Настройка экспорта и роутера +__all__ = ("router",) +router: Router = Router(name=__name__) + +# Подключение роутеров +router.include_routers( + #settings_cmd_router, + #admin_cmd_router, + users_cmd_router, +) diff --git a/bot/handlers/commands/admins/__init__.py b/bot/handlers/commands/admins/__init__.py new file mode 100644 index 0000000..fec40b1 --- /dev/null +++ b/bot/handlers/commands/admins/__init__.py @@ -0,0 +1,18 @@ +from aiogram import Router + +#from .ban_cmd import router as ban_cmd_router +from .all_cmd import router as all_cmd_router +from .pin_cmd import router as pin_cmd_router +from .kick_cmd import router as kick_cmd_router + +# Настройка экспорта и роутера +__all__ = ("router",) +router: Router = Router(name=__name__) + +router.include_routers( +#ban_cmd_router, + kick_cmd_router, + pin_cmd_router, + all_cmd_router, + +) diff --git a/bot/handlers/commands/settings/__init__.py b/bot/handlers/commands/settings/__init__.py new file mode 100644 index 0000000..af7d05f --- /dev/null +++ b/bot/handlers/commands/settings/__init__.py @@ -0,0 +1,19 @@ +from aiogram import Router + +from .set_description_cmd import router as set_description_cmd_router +from .set_name_cmd import router as set_name_cmd_router +from .set_widget_cmd import router as set_widget_cmd_router +from .settings_cmd import router as settings_cmd_router + +# Настройка экспорта и роутера +__all__ = ("router",) +router: Router = Router(name=__name__) + + +# Подключение роутеров +router.include_routers( +settings_cmd_router, + set_name_cmd_router, + set_description_cmd_router, + set_widget_cmd_router, +) \ No newline at end of file diff --git a/bot/handlers/commands/users/__init__.py b/bot/handlers/commands/users/__init__.py new file mode 100644 index 0000000..a6cbd95 --- /dev/null +++ b/bot/handlers/commands/users/__init__.py @@ -0,0 +1,37 @@ +from aiogram import Router + +from .start_cmd import router as start_cmd_router +from .listwords import router as listwords_cmd_router +from .word import router as word_cmd_router +from .slience import router as slice_router +from .conflict import router as conflict_router +from .stats import router as stats_router +from .report import router as report_router +from .admins import router as admin_router +from .notifications import router as notifications_router +from .id import router as id_router +from .emoji import router as emoji_router +from .cancel import router as cancel_router +from .bot_settings import router as setting_router + +# Настройка экспорта и роутера +__all__ = ("router",) +router: Router = Router(name=__name__) + + +# Подключение роутеров +router.include_routers( +cancel_router, +notifications_router, +report_router, +admin_router, + start_cmd_router, +listwords_cmd_router, +word_cmd_router, +slice_router, +conflict_router, +stats_router, +id_router, +emoji_router, +setting_router, +) diff --git a/bot/handlers/messages/__init__.py b/bot/handlers/messages/__init__.py new file mode 100644 index 0000000..9efe58a --- /dev/null +++ b/bot/handlers/messages/__init__.py @@ -0,0 +1,15 @@ +from aiogram import Router + +from .default_msg import router as default_message_router +from .ping_test import router as ping_test_message_router + +# Настройка экспорта и роутера +router: Router = Router(name=__name__) + +# Подготовка роутера команд +# router.include_routers( +# ping_test_message_router, +# ) + +# Подключение стандартного роутера +router.include_router(default_message_router) diff --git a/bot/keyboards/__init__.py b/bot/keyboards/__init__.py new file mode 100644 index 0000000..93f594b --- /dev/null +++ b/bot/keyboards/__init__.py @@ -0,0 +1,2 @@ +from .inline import * +from .reply import * diff --git a/bot/middlewares/__init__.py b/bot/middlewares/__init__.py new file mode 100644 index 0000000..c1db9b0 --- /dev/null +++ b/bot/middlewares/__init__.py @@ -0,0 +1,142 @@ +""" +Middleware для бота PrimoGuardBot. + +Порядок выполнения middleware важен: +1. TimingMiddleware - замер времени выполнения +2. LoggingMiddleware - логирование всех событий +3. BanCheckMiddleware - проверка статуса бана (блокирует забаненных) +4. ErrorHandlingMiddleware - обработка ошибок (последний) + +Message-level middleware: +1. RateLimitMiddleware/AntiSpamMiddleware - защита от флуда +2. SubscriptionMiddleware - проверка подписки на каналы +3. ReferralMiddleware - обработка реферальных ссылок +""" +from aiogram import Dispatcher, Bot + +from configs import settings +from middleware.loggers import logger +from .error_mdw import ErrorHandlingMiddleware +from .logging_mdw import LoggingMiddleware +from .referal_mdw import ReferralMiddleware +from .spam_mdw import AntiSpamMiddleware, spam_stats +from .sub_mdw import SubscriptionMiddleware +from .time_mdw import TimingMiddleware +from .banwords_mdw import BanWordsMiddleware + +__all__ = ( + # Middleware классы + "TimingMiddleware", + "LoggingMiddleware", + "ErrorHandlingMiddleware", + "AntiSpamMiddleware", + "SubscriptionMiddleware", + "ReferralMiddleware", + "BanWordsMiddleware", + + # Статистика + "spam_stats", + + # Утилиты + "setup_middlewares", +) + + +def setup_middlewares( + dp: Dispatcher, + bot: Bot, + admin_ids: list[int] = settings.ADMIN_ID+settings.OWNER_ID, + channel_ids: list[int | str] | None = None, + enable_spam_check: bool = False, + enable_subscription_check: bool = False, +) -> dict: + """ + Регистрирует все middleware в диспетчере. + + Args: + dp: Диспетчер aiogram + bot: Экземпляр бота + admin_ids: ID администраторов (для защиты и уведомлений) + channel_ids: ID каналов для проверки подписки + enable_spam_check: Включить антиспам + enable_subscription_check: Включить проверку подписки + + Returns: + dict: Словарь с экземплярами middleware для доступа к методам + """ + channel_ids = channel_ids or [] + + # === UPDATE LEVEL MIDDLEWARE (для всех событий) === + middlewares_updates = [] + instances = {} + + # 1. Timing - замер времени (первый!) + timing_mdw = TimingMiddleware() + middlewares_updates.append(timing_mdw) + instances['timing'] = timing_mdw + + # 2. Logging - логирование всех событий + loggings_mdw = LoggingMiddleware() + middlewares_updates.append(loggings_mdw) + instances['logging'] = loggings_mdw + + # 3. ErrorHandling - обработка ошибок (последний!) + errors_mdw = ErrorHandlingMiddleware(admin_ids=admin_ids) + middlewares_updates.append(errors_mdw) + instances['error'] = errors_mdw + + # === MESSAGE LEVEL MIDDLEWARE (только для сообщений) === + middlewares_msg = [] + + # 1. AntiSpam - защита от флуда (опционально) + if enable_spam_check: + spams_mdw = AntiSpamMiddleware() + middlewares_msg.append(spams_mdw) + instances['spam'] = spams_mdw + + # 2. Subscription - проверка подписки на каналы (опционально) + if enable_subscription_check and channel_ids: + subs_mdw = SubscriptionMiddleware(bot=bot, channels=channel_ids) + middlewares_msg.append(subs_mdw) + instances['subscription'] = subs_mdw + + dp.message.middleware(BanWordsMiddleware()) + + # 3. Referral - обработка реферальных ссылок + referral_mdw = ReferralMiddleware() + middlewares_msg.append(referral_mdw) + instances['referral'] = referral_mdw + + # === РЕГИСТРАЦИЯ MIDDLEWARE === + + # Регистрируем update-level middleware + for middleware in middlewares_updates: + dp.update.middleware(middleware) + + # Регистрируем message-level middleware + for middleware in middlewares_msg: + dp.message.middleware(middleware) + + # Логируем успешную регистрацию + enabled_features = [] + if enable_spam_check: + enabled_features.append("AntiSpam") + if enable_subscription_check: + enabled_features.append("Subscription") + + dp.channel_post.middleware(LoggingMiddleware()) + dp.edited_channel_post.middleware(LoggingMiddleware()) + + logger.info( + text=( + f"Middleware зарегистрированы: " + f"Update={len(middlewares_updates)}, " + f"Message={len(middlewares_msg)}, " + f"Функции=[{', '.join(enabled_features) if enabled_features else 'базовые'}]" + ), + log_type="MIDDLEWARE_SETUP" + ) + + return instances + + diff --git a/bot/special/__init__.py b/bot/special/__init__.py new file mode 100644 index 0000000..054aaf3 --- /dev/null +++ b/bot/special/__init__.py @@ -0,0 +1 @@ +from .text_processing import * diff --git a/bot/states/__init__.py b/bot/states/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/bot/tasks/__init__.py b/bot/tasks/__init__.py new file mode 100644 index 0000000..2a37c00 --- /dev/null +++ b/bot/tasks/__init__.py @@ -0,0 +1,4 @@ +""" +Модуль фоновых задач для бота +""" +from .cleanup import * diff --git a/bot/templates/__init__.py b/bot/templates/__init__.py new file mode 100644 index 0000000..b969334 --- /dev/null +++ b/bot/templates/__init__.py @@ -0,0 +1 @@ +from .message_callback import * diff --git a/bot/utils/__init__.py b/bot/utils/__init__.py new file mode 100644 index 0000000..0f2beba --- /dev/null +++ b/bot/utils/__init__.py @@ -0,0 +1,39 @@ +""" +Утилиты бота PrimoGuardBot + +Модули: +- usernames: Работа с пользователями (username, mentions, display names) +- type_message: Типы контента и чатов +- hidden_username: Упоминания администраторов +- format_time: Форматирование времени и дат +- argument: Парсинг команд и аргументов +- state_utils: Работа с FSM состояниями +- auto_delete: Автоматическое удаление сообщений +- decorators: Декораторы для хендлеров +""" + +# ================= USER INFO ================= +from .usernames import * + +# ================= CONTENT TYPES ================= +from .type_message import * + +# ================= MENTIONS ================= +from .hidden_username import * + +# ================= TIME FORMATTING ================= +from .format_time import * + +# ================= COMMANDS ================= +from .argument import * + +# ================= STATE UTILS ================= +from .state_utils import * + +# ================= AUTO DELETE ================= +from .auto_delete import * + +# ================= DECORATORS ================= +from .decorators import * + +from .telegram_emoji import * diff --git a/configs/__init__.py b/configs/__init__.py new file mode 100644 index 0000000..5952572 --- /dev/null +++ b/configs/__init__.py @@ -0,0 +1,3 @@ +from .cmd_alias_list import * +from .config import * +from .mapping import * diff --git a/database/__init__.py b/database/__init__.py new file mode 100644 index 0000000..3ef18cf --- /dev/null +++ b/database/__init__.py @@ -0,0 +1,39 @@ +""" +Database модуль для работы с банвордами в SQLite. + +Использует SQLAlchemy ORM для async работы с БД. + +Структура: +- models.py: Модели таблиц (BanWord, TempBanWord, WhitelistWord, Admin, Setting, SpamStat) +- database.py: Подключение к БД через SQLAlchemy +- repository.py: CRUD операции через ORM +- manager.py: Высокоуровневый API для handlers/middleware + +Usage: + from database import get_manager, BanWordType + + # Инициализация + manager = get_manager() + await manager.init() + + # Добавление банворда + await manager.add_banword("спам", BanWordType.SUBSTRING, added_by=123) + + # Проверка (из кэша - быстро) + words = manager.get_banwords_cached(BanWordType.SUBSTRING) + if "спам" in text and "спам" in words: + await manager.log_spam(...) + + # Режим тишины + await manager.set_silence_mode(minutes=30) + if await manager.is_silence_active(): + # Удаляем всё +""" + +from .models import * + +from .database import * + +from .repository import * + +from .manager import * diff --git a/middleware/__init__.py b/middleware/__init__.py new file mode 100644 index 0000000..e719cd0 --- /dev/null +++ b/middleware/__init__.py @@ -0,0 +1,2 @@ +from .loggers import * +from .validators import * diff --git a/middleware/loggers/__init__.py b/middleware/loggers/__init__.py new file mode 100644 index 0000000..d668488 --- /dev/null +++ b/middleware/loggers/__init__.py @@ -0,0 +1 @@ +from .logs import * diff --git a/middleware/validators/__init__.py b/middleware/validators/__init__.py new file mode 100644 index 0000000..98878dc --- /dev/null +++ b/middleware/validators/__init__.py @@ -0,0 +1,2 @@ +from .email_vld import * +from .url_vld import *