Files
PrimoGuardBot/bot/filters/admin.py

110 lines
3.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Фильтры для проверки прав администратора
"""
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