fixes, chat handlers
Some checks reported errors
continuous-integration/drone/push Build encountered an error
Some checks reported errors
continuous-integration/drone/push Build encountered an error
This commit is contained in:
202
src/core/permissions.py
Normal file
202
src/core/permissions.py
Normal file
@@ -0,0 +1,202 @@
|
||||
"""
|
||||
Система управления правами доступа к командам бота
|
||||
"""
|
||||
from functools import wraps
|
||||
from aiogram.types import Message
|
||||
from src.core.config import ADMIN_IDS
|
||||
|
||||
|
||||
def is_admin(user_id: int) -> bool:
|
||||
"""Проверка является ли пользователь администратором"""
|
||||
return user_id in ADMIN_IDS
|
||||
|
||||
|
||||
def admin_only(func):
|
||||
"""
|
||||
Декоратор для команд, доступных только администраторам.
|
||||
Если пользователь не админ - отправляется сообщение об отказе в доступе.
|
||||
"""
|
||||
@wraps(func)
|
||||
async def wrapper(message: Message, *args, **kwargs):
|
||||
if not is_admin(message.from_user.id):
|
||||
await message.answer("❌ У вас нет прав для выполнения этой команды")
|
||||
return
|
||||
return await func(message, *args, **kwargs)
|
||||
return wrapper
|
||||
|
||||
|
||||
def user_command(func):
|
||||
"""
|
||||
Декоратор для пользовательских команд.
|
||||
Доступны всем зарегистрированным пользователям.
|
||||
"""
|
||||
@wraps(func)
|
||||
async def wrapper(message: Message, *args, **kwargs):
|
||||
# Здесь можно добавить дополнительные проверки для пользователей
|
||||
# Например, проверку регистрации
|
||||
return await func(message, *args, **kwargs)
|
||||
return wrapper
|
||||
|
||||
|
||||
# Реестр команд с описанием и уровнем доступа
|
||||
COMMAND_REGISTRY = {
|
||||
# Пользовательские команды
|
||||
'start': {
|
||||
'description': 'Начать работу с ботом',
|
||||
'access': 'user',
|
||||
'handler': 'main.py'
|
||||
},
|
||||
'my_code': {
|
||||
'description': 'Показать мой реферальный код',
|
||||
'access': 'user',
|
||||
'handler': 'registration_handlers.py'
|
||||
},
|
||||
'my_accounts': {
|
||||
'description': 'Показать мои счета',
|
||||
'access': 'user',
|
||||
'handler': 'registration_handlers.py'
|
||||
},
|
||||
|
||||
# Административные команды - Управление счетами
|
||||
'add_account': {
|
||||
'description': 'Добавить новый счет в систему',
|
||||
'access': 'admin',
|
||||
'category': 'Управление счетами',
|
||||
'handler': 'admin_account_handlers.py'
|
||||
},
|
||||
'remove_account': {
|
||||
'description': 'Удалить счет из системы',
|
||||
'access': 'admin',
|
||||
'category': 'Управление счетами',
|
||||
'handler': 'admin_account_handlers.py'
|
||||
},
|
||||
'verify_winner': {
|
||||
'description': 'Верифицировать победителя',
|
||||
'access': 'admin',
|
||||
'category': 'Управление счетами',
|
||||
'handler': 'admin_account_handlers.py'
|
||||
},
|
||||
'winner_status': {
|
||||
'description': 'Проверить статус победителя',
|
||||
'access': 'admin',
|
||||
'category': 'Управление счетами',
|
||||
'handler': 'admin_account_handlers.py'
|
||||
},
|
||||
'user_info': {
|
||||
'description': 'Получить информацию о пользователе',
|
||||
'access': 'admin',
|
||||
'category': 'Управление счетами',
|
||||
'handler': 'admin_account_handlers.py'
|
||||
},
|
||||
|
||||
# Административные команды - Розыгрыши
|
||||
'check_unclaimed': {
|
||||
'description': 'Проверить невостребованные выигрыши',
|
||||
'access': 'admin',
|
||||
'category': 'Розыгрыши',
|
||||
'handler': 'redraw_handlers.py'
|
||||
},
|
||||
'redraw': {
|
||||
'description': 'Провести повторный розыгрыш',
|
||||
'access': 'admin',
|
||||
'category': 'Розыгрыши',
|
||||
'handler': 'redraw_handlers.py'
|
||||
},
|
||||
|
||||
# Административные команды - Управление чатом
|
||||
'chat_mode': {
|
||||
'description': 'Управление режимом чата (рассылка/пересылка)',
|
||||
'access': 'admin',
|
||||
'category': 'Управление чатом',
|
||||
'handler': 'admin_chat_handlers.py'
|
||||
},
|
||||
'set_forward': {
|
||||
'description': 'Установить канал для пересылки',
|
||||
'access': 'admin',
|
||||
'category': 'Управление чатом',
|
||||
'handler': 'admin_chat_handlers.py'
|
||||
},
|
||||
'global_ban': {
|
||||
'description': 'Глобальная блокировка пользователя',
|
||||
'access': 'admin',
|
||||
'category': 'Управление чатом',
|
||||
'handler': 'admin_chat_handlers.py'
|
||||
},
|
||||
'ban': {
|
||||
'description': 'Забанить пользователя по ID или ответом',
|
||||
'access': 'admin',
|
||||
'category': 'Управление чатом',
|
||||
'handler': 'admin_chat_handlers.py'
|
||||
},
|
||||
'unban': {
|
||||
'description': 'Разбанить пользователя',
|
||||
'access': 'admin',
|
||||
'category': 'Управление чатом',
|
||||
'handler': 'admin_chat_handlers.py'
|
||||
},
|
||||
'banlist': {
|
||||
'description': 'Показать список забаненных',
|
||||
'access': 'admin',
|
||||
'category': 'Управление чатом',
|
||||
'handler': 'admin_chat_handlers.py'
|
||||
},
|
||||
'delete_msg': {
|
||||
'description': 'Удалить сообщение у всех пользователей',
|
||||
'access': 'admin',
|
||||
'category': 'Управление чатом',
|
||||
'handler': 'admin_chat_handlers.py'
|
||||
},
|
||||
'chat_stats': {
|
||||
'description': 'Статистика чата',
|
||||
'access': 'admin',
|
||||
'category': 'Управление чатом',
|
||||
'handler': 'admin_chat_handlers.py'
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
def get_user_commands():
|
||||
"""Получить список пользовательских команд"""
|
||||
return {cmd: info for cmd, info in COMMAND_REGISTRY.items() if info['access'] == 'user'}
|
||||
|
||||
|
||||
def get_admin_commands():
|
||||
"""Получить список административных команд"""
|
||||
return {cmd: info for cmd, info in COMMAND_REGISTRY.items() if info['access'] == 'admin'}
|
||||
|
||||
|
||||
def get_admin_commands_by_category():
|
||||
"""Получить административные команды, сгруппированные по категориям"""
|
||||
commands_by_category = {}
|
||||
for cmd, info in COMMAND_REGISTRY.items():
|
||||
if info['access'] == 'admin':
|
||||
category = info.get('category', 'Прочее')
|
||||
if category not in commands_by_category:
|
||||
commands_by_category[category] = {}
|
||||
commands_by_category[category][cmd] = info
|
||||
return commands_by_category
|
||||
|
||||
|
||||
def format_commands_help(user_id: int) -> str:
|
||||
"""
|
||||
Форматировать справку по командам в зависимости от прав пользователя
|
||||
"""
|
||||
help_text = "📋 <b>Доступные команды:</b>\n\n"
|
||||
|
||||
# Пользовательские команды
|
||||
help_text += "👤 <b>Пользовательские команды:</b>\n"
|
||||
for cmd, info in get_user_commands().items():
|
||||
help_text += f"/{cmd} - {info['description']}\n"
|
||||
|
||||
# Если админ - показываем административные команды
|
||||
if is_admin(user_id):
|
||||
help_text += "\n" + "=" * 30 + "\n\n"
|
||||
help_text += "🔐 <b>Административные команды:</b>\n\n"
|
||||
|
||||
for category, commands in get_admin_commands_by_category().items():
|
||||
help_text += f"<b>{category}:</b>\n"
|
||||
for cmd, info in commands.items():
|
||||
help_text += f"/{cmd} - {info['description']}\n"
|
||||
help_text += "\n"
|
||||
|
||||
return help_text
|
||||
Reference in New Issue
Block a user