Первый коммит

This commit is contained in:
2026-02-17 11:24:55 +07:00
commit a06448ca4b
109 changed files with 21165 additions and 0 deletions

109
bot/filters/admin.py Normal file
View File

@@ -0,0 +1,109 @@
"""
Фильтры для проверки прав администратора
"""
from typing import Union
from aiogram.filters import BaseFilter
from aiogram.types import Message, CallbackQuery
from configs import settings
from database import get_manager
from middleware.loggers import logger
__all__ = ('IsSuperAdmin', 'IsAdmin', 'IsOwner')
class IsSuperAdmin(BaseFilter):
"""
Проверяет, является ли пользователь суперадминистратором (из .env).
Суперадмины имеют полный доступ ко всем командам бота.
Example:
```python
@router.message(Command("addadmin"), IsSuperAdmin())
async def add_admin_command(message: Message):
await message.answer("Добавление админа...")
```
"""
async def __call__(self, event: Union[Message, CallbackQuery]) -> bool:
user_id = event.from_user.id
is_super_admin = user_id in settings.OWNER_ID
if not is_super_admin:
logger.warning(
f"Попытка доступа к команде суперадмина от user_id={user_id}",
log_type='SECURITY',
message=event if isinstance(event, Message) else None
)
return is_super_admin
class IsAdmin(BaseFilter):
"""
Проверяет, является ли пользователь администратором (суперадмин или доп. админ).
Администраторы могут управлять банвордами, но не могут добавлять других админов.
Список дополнительных админов загружается из БД через BanWordsManager.
Example:
```python
@router.message(Command("addword"), IsAdmin())
async def add_word_command(message: Message):
await message.answer("Добавление банворда...")
```
"""
async def __call__(self, event: Union[Message, CallbackQuery]) -> bool:
user_id = event.from_user.id
# Проверка суперадмина
if user_id in settings.OWNER_ID:
return True
# Проверка доп. админа из БД (через кэш)
manager = get_manager()
is_db_admin = manager.is_admin_cached(user_id)
if not is_db_admin:
logger.warning(
f"Попытка доступа к админ-команде от user_id={user_id}",
log_type='SECURITY',
message=event if isinstance(event, Message) else None
)
return is_db_admin
class IsOwner(BaseFilter):
"""
Проверяет, является ли пользователь первым владельцем бота (OWNER_ID[0]).
Используется для критических операций (например, полная очистка данных).
Example:
```python
@router.message(Command("reset_all"), IsOwner())
async def reset_command(message: Message):
await message.answer("⚠️ Сброс всех данных...")
```
"""
async def __call__(self, event: Union[Message, CallbackQuery]) -> bool:
user_id = event.from_user.id
# Берём первого суперадмина как владельца
owner_id = settings.OWNER_ID[0] if settings.OWNER_ID else None
is_owner = user_id == owner_id
if not is_owner:
logger.warning(
f"Попытка доступа к команде владельца от user_id={user_id}",
log_type='SECURITY',
message=event if isinstance(event, Message) else None
)
return is_owner