Files
tg_loader/bot/modules/message_handler/callbacks.py
2025-12-04 00:12:56 +03:00

224 lines
11 KiB
Python
Raw 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.

"""
Callback button handling
"""
from pyrogram import Client
from pyrogram.types import CallbackQuery, InlineKeyboardMarkup, InlineKeyboardButton
from pyrogram.handlers import CallbackQueryHandler
from pyrogram.errors import MessageNotModified
from bot.modules.access_control.auth import is_authorized, is_admin, is_owner
from bot.modules.message_handler.commands import get_start_keyboard
import logging
logger = logging.getLogger(__name__)
async def callback_handler(client: Client, callback_query: CallbackQuery):
"""Handle callback queries"""
user_id = callback_query.from_user.id
data = callback_query.data
# Check authorization
if not await is_authorized(user_id):
await callback_query.answer("У вас нет доступа к этому боту", show_alert=True)
return
# Handle different callback data
if data == "back":
# Return to main menu
welcome_text = (
"👋 **Привет! Я бот для загрузки медиа-файлов.**\n\n"
"📥 **Что я умею:**\n"
"• Загружать видео с YouTube, Instagram и других платформ\n"
"• Загружать файлы по прямым ссылкам\n"
"• Отправлять файлы вам в Telegram\n\n"
"**Как использовать:**\n"
"Просто отправьте мне ссылку на видео или файл, и я загружу его для вас!\n\n"
"Используйте кнопки ниже для управления:"
)
keyboard = await get_start_keyboard(user_id)
await callback_query.edit_message_text(welcome_text, reply_markup=keyboard)
await callback_query.answer()
elif data == "help":
# Show help
help_text = (
"👋 **Привет! Рад помочь!**\n\n"
"🎯 **Как начать работу:**\n"
"Это очень просто! Просто отправьте мне ссылку на видео или файл, и я сразу начну загрузку.\n\n"
"📥 **Что я умею загружать:**\n"
"• 🎬 Видео с YouTube, Instagram, TikTok и других платформ\n"
"• 📁 Файлы по прямым ссылкам\n"
"• 🎵 Аудио и музыку\n"
"• 📸 Изображения и фото\n\n"
"⌨️ **Основные команды:**\n"
"• `/start` - Открыть главное меню с кнопками\n"
"• `/help` - Показать эту справку\n"
"• `/status` - Посмотреть статус ваших загрузок\n\n"
"💡 **Совет:** Используйте кнопки в главном меню для быстрого доступа к функциям!"
)
if await is_admin(user_id):
help_text += (
"\n\n"
"👑 **Команды для администраторов:**\n"
"• `/adduser <user_id или @username>` - Добавить нового пользователя\n"
"• `/removeuser <user_id или @username>` - Удалить пользователя\n"
"• `/blockuser <user_id или @username>` - Заблокировать пользователя\n"
"• `/listusers` - Посмотреть список всех пользователей\n\n"
"💼 **Управление администраторами:**\n"
"• `/addadmin <user_id или @username>` - Назначить администратора\n"
"• `/removeadmin <user_id или @username>` - Снять права администратора\n"
"• `/listadmins` - Список всех администраторов"
)
keyboard = InlineKeyboardMarkup([[
InlineKeyboardButton("🔙 Назад", callback_data="back")
]])
await callback_query.edit_message_text(help_text, reply_markup=keyboard)
await callback_query.answer()
elif data == "status":
# Show task status
from bot.modules.task_scheduler.monitor import get_user_tasks_status
from bot.modules.task_scheduler.queue import TaskStatus
tasks = await get_user_tasks_status(user_id)
active_tasks = [t for t in tasks if t.get('status') in ['pending', 'processing']]
completed = [t for t in tasks if t.get('status') == 'completed']
failed = [t for t in tasks if t.get('status') == 'failed']
status_text = (
"📊 **Статус задач:**\n\n"
f"⏳ Активных задач: {len(active_tasks)}\n"
f"✅ Завершено: {len(completed)}\n"
f"❌ Ошибок: {len(failed)}\n\n"
)
if active_tasks:
status_text += "**Активные задачи:**\n"
for task in active_tasks[:5]: # Show first 5
task_id = task.get('id')
progress = task.get('progress', 0)
status_text += f"• #{task_id} - {progress}%\n"
if len(active_tasks) > 5:
status_text += f"... и еще {len(active_tasks) - 5}\n"
status_text += "\n💡 Используйте `/cancel <task_id>` для отмены"
keyboard = InlineKeyboardMarkup([[
InlineKeyboardButton("🔄 Обновить", callback_data="status"),
InlineKeyboardButton("🔙 Назад", callback_data="back")
]])
try:
await callback_query.edit_message_text(status_text, reply_markup=keyboard)
await callback_query.answer("✅ Статус обновлен")
except MessageNotModified:
# If text didn't change, just answer callback
await callback_query.answer("✅ Статус актуален")
elif data == "download":
# Download information
download_text = (
"📥 **Загрузка файлов:**\n\n"
"**Поддерживаемые источники:**\n"
"• YouTube (видео, плейлисты)\n"
"• Instagram (посты, истории)\n"
"• Прямые ссылки на файлы\n"
"• Другие платформы через yt-dlp\n\n"
"**Как использовать:**\n"
"Просто отправьте мне ссылку на видео или файл, и я начну загрузку!\n\n"
"Примеры:\n"
"• https://www.youtube.com/watch?v=...\n"
"• https://www.instagram.com/p/...\n"
"• https://example.com/file.mp4"
)
keyboard = InlineKeyboardMarkup([[
InlineKeyboardButton("🔙 Назад", callback_data="back")
]])
await callback_query.edit_message_text(download_text, reply_markup=keyboard)
await callback_query.answer()
elif data == "admin_users":
# User management (admin only)
if not await is_admin(user_id):
await callback_query.answer("❌ Только для администраторов", show_alert=True)
return
# Determine user status
is_owner_user = await is_owner(user_id)
# Form text and buttons depending on status
if is_owner_user:
# Main admin - full functionality
users_text = (
"👥 **Управление пользователями:**\n\n"
"**Управление пользователями:**\n"
"• /adduser <user_id или @username> - Добавить пользователя\n"
"• /removeuser <user_id или @username> - Удалить пользователя\n"
"• /blockuser <user_id или @username> - Заблокировать пользователя\n"
"• /listusers - Список всех пользователей\n\n"
"**Управление администраторами:**\n"
"• /addadmin <user_id или @username> - Назначить администратора\n"
"• /removeadmin <user_id или @username> - Снять права администратора\n"
"• /listadmins - Список всех администраторов\n\n"
"⚠️ **Внимание:** Вы не можете снять права администратора у самого себя."
)
else:
# Regular administrator - only user management
users_text = (
"👥 **Управление пользователями:**\n\n"
"**Доступные команды:**\n"
"• /adduser <user_id или @username> - Добавить пользователя\n"
"• /removeuser <user_id или @username> - Удалить пользователя\n"
"• /blockuser <user_id или @username> - Заблокировать пользователя\n"
"• /listusers - Список всех пользователей\n\n"
"_Управление через веб-интерфейс будет доступно позже_"
)
keyboard = InlineKeyboardMarkup([[
InlineKeyboardButton("🔙 Назад", callback_data="back")
]])
await callback_query.edit_message_text(users_text, reply_markup=keyboard)
await callback_query.answer()
elif data == "admin_stats":
# Statistics (admin only)
if not await is_admin(user_id):
await callback_query.answer("❌ Только для администраторов", show_alert=True)
return
stats_text = (
"📈 **Статистика:**\n\n"
"👥 Всего пользователей: 0\n"
"👑 Администраторов: 0\n"
"📥 Всего загрузок: 0\n"
"✅ Успешных: 0\n"
"❌ Ошибок: 0\n\n"
"_Статистика будет реализована в следующем этапе_"
)
keyboard = InlineKeyboardMarkup([[
InlineKeyboardButton("🔙 Назад", callback_data="back")
]])
await callback_query.edit_message_text(stats_text, reply_markup=keyboard)
await callback_query.answer()
else:
await callback_query.answer("❓ Неизвестная команда")
def register_callbacks(app: Client):
"""Register all callback handlers"""
app.add_handler(CallbackQueryHandler(callback_handler))
logger.info("Callback handlers registered")