fixes, chat handlers
Some checks reported errors
continuous-integration/drone/push Build encountered an error

This commit is contained in:
2025-11-16 14:53:23 +09:00
parent a0e6a385b6
commit 4e06e6296c
6 changed files with 292 additions and 71 deletions

202
src/core/permissions.py Normal file
View 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