Первый коммит
This commit is contained in:
109
bot/filters/admin.py
Normal file
109
bot/filters/admin.py
Normal 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
|
||||
Reference in New Issue
Block a user