Add source
This commit is contained in:
223
bot/modules/message_handler/callbacks.py
Normal file
223
bot/modules/message_handler/callbacks.py
Normal file
@@ -0,0 +1,223 @@
|
||||
"""
|
||||
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")
|
||||
|
||||
Reference in New Issue
Block a user