# -*- coding: utf-8 -*- import time import os import uuid import asyncio import pyromod from pyromod.helpers import ikb from datetime import datetime as dt from pyrogram import * from pyrogram import Client as ren, filters from pyrogram.types import * from akn.utils.database import db as db_client from akn.manage.settings_control import verify_bot_ownershipdl from akn.utils.logger import LOGS from config import PRIVATE_LOGS @Client.on_callback_query(filters.regex("^my_userbotub$")) async def userbotdashboardub(client: Client, callback: CallbackQuery): user_id = callback.from_user.id user_data = await db_client.session.find_one({"user_id": user_id}) if not user_data or "user_client" not in user_data: return await callback.answer("āŒ No userbot found!", show_alert=True) bot_data = user_data["user_client"][0] status = bot_data.get("status", "pending") status_icons = { "approved": "āœ…", "rejected": "āŒ", "pending": "ā³", "stopped": "šŸ›‘", "error": "āš ļø" } start = time.time() await client.get_me() end = time.time() latency = (end - start) * 1000 text = f""" šŸ”§ **Your Userbot Dashboard** šŸ†” **User ID:** `{user_id}` šŸ“› **Status:** {status_icons.get(status, "ļæ½")} {status.capitalize()} ā° **Last Active:** {bot_data.get("timestamp", "Never")} āœ” **Pong:** `{latency:.2f} ms` šŸ”— **Session:** {'Set' if bot_data.get("session_string") else 'Not Set'} """ buttons = [] if not bot_data.get("session_string"): buttons.append( [InlineKeyboardButton("āž• Set Session String", callback_data="set_sessionub")] ) else: buttons.append( [InlineKeyboardButton("šŸ”„ Update Session", callback_data="update_sessionub")] ) if status == "approved": buttons.extend([ [InlineKeyboardButton("ā” Check Status", callback_data=f"statusub_{user_id}")] ]) buttons.append( [InlineKeyboardButton("šŸ”„ Refresh", callback_data="my_userbotub"), InlineKeyboardButton("āš™ļø Settings", callback_data="ubsetting")] ) buttons.append( [InlineKeyboardButton("šŸ”™ Back", callback_data="confirm_userbot")] ) await callback.message.edit_text( text, reply_markup=InlineKeyboardMarkup(buttons) ) await callback.answer() @Client.on_callback_query(filters.regex("^session_exportuball$")) async def export_all_sessionsub(client, callback): user_data = await db_client.session.find_one({"user_id": callback.from_user.id}) if not user_data or not user_data.get("user_client"): return await callback.answer("āš ļø No sessions to export!", show_alert=True) sessions = user_data["user_client"] export_text = "" for index, session in enumerate(sessions, 1): status = session.get("status", "unknown") is_active = session.get("is_active", False) session_str = session.get("session_string", "None") export_text += ( f"Userbot #{index}\n" f"Status: {status}\n" f"Active: {is_active}\n" f"Session: {session_str}\n\n" ) filename = f"sessions_{callback.from_user.id}.txt" with open(filename, "w") as f: f.write(export_text) try: await callback.message.edit_text("Downloading export all session.....", reply_markup=None) await asyncio.sleep(2) await callback.message.edit_text("Uploading.....", reply_markup=None) await callback.message.edit_media( media=InputMediaDocument( media=filename, caption="šŸ“ Your session details.\n\n" "Never share your session string with anyone" ), reply_markup=InlineKeyboardMarkup([ [InlineKeyboardButton("āŒ Close", callback_data="close")] ]) ) os.remove(filename) await callback.answer() except Exception as e: LOGS.error(f"Error in export_all_sessionsub handler: {str(e)}") await callback.answer(f"āŒ Error: Please try again later.", True) try: os.remove(filename) except: pass @Client.on_callback_query(filters.regex("^ubsetting$")) async def userbotsettingsub(client: Client, callback: CallbackQuery): user_id = callback.from_user.id buttons = [ [InlineKeyboardButton("šŸ“ Session Info", callback_data="session_infoub"), InlineKeyboardButton("šŸ—‘ Delete Userbot", callback_data="delete_userbotub") ], [InlineKeyboardButton("šŸ“„ Export All Sessions", callback_data="session_exportuball")], [InlineKeyboardButton("šŸ”™ Back", callback_data="my_userbotub")] ] await callback.message.edit_text( "āš™ļø **Userbot Settings**\n\n" "Manage your userbot configuration:", reply_markup=InlineKeyboardMarkup(buttons) ) await callback.answer() @Client.on_callback_query(filters.regex("^delete_userbotub$")) async def sessionconfirmdeleteub(client, callback): await callback.message.edit_text( "āš ļø This will permanently delete your userbot!", reply_markup=InlineKeyboardMarkup([ [InlineKeyboardButton("āœ… Confirm", "confirm_rmdeleteub")], [InlineKeyboardButton("āŒ Cancel", "my_userbotub")] ]) ) @Client.on_callback_query(filters.regex("^confirm_rmdeleteub$")) async def sessionrmdeleteubnow(client, callback): user_mention = callback.from_user.mention user_data = await db_client.session.find_one({"user_id": callback.from_user.id}) if not user_data or not user_data.get("user_client"): return await callback.answer( "āŒ You don't have any Userbot deployed yet!", show_alert=True ) try: result = await db_client.session.update_one( { "_id": user_data["_id"], "user_id": callback.from_user.id, "user_client.user_id": callback.from_user.id }, {"$pull": {"user_client": {"user_id": callback.from_user.id}}} ) if result.modified_count == 1: await callback.message.edit_text( f"āœ… User `{callback.from_user.id}` has been permanently removed", reply_markup=InlineKeyboardMarkup([ [InlineKeyboardButton("⭐ My Userbot", callback_data="my_userbotub")] ]) ) await notify_admins_user( client=client, message=f"šŸ›‘ Deleted Userbot\n\n" f"šŸ‘¤ User: {user_mention} ({callback.from_user.id})\n", user_id=callback.from_user.id, is_button=False ) else: raise Exception("Database update failed") except Exception as e: LOGS.error(f"Error in sessionrmdeleteubnow handler: {str(e)}") await callback.answer(f"āŒ Error: Please try again later.", True) await notify_admins_user( client=client, message=f"🚨 Error in sessionrmdeleteubnow handler\n\n" f"šŸ‘¤ User: {user_mention} ({callback.from_user.id})\n" f"🧠 Error: {str(e)}", user_id=callback.from_user.id, is_button=False ) @Client.on_callback_query(filters.regex("^session_infoub$")) async def infosessionstringub(client: Client, callback: CallbackQuery): user_data = await db_client.session.find_one({"user_id": callback.from_user.id}) if not user_data or not user_data.get("user_client"): return await callback.answer( "āŒ You don't have any Userbot deployed yet!", show_alert=True ) user = user_data["user_client"][0] await callback.message.edit_text( "šŸ”’ Session String Secure\n\n" f"Copy: `{user.get('session_string', 'Nothing')}`\n\n" "Important: Never share your session string with anyone", reply_markup=ikb([ [("Ā« Back", "ubsetting")] ]) ) await callback.answer() @Client.on_callback_query(filters.regex("^(set_sessionub|update_sessionub)$")) async def asksessionstringub(client: Client, callback: CallbackQuery): user_data = await db_client.session.find_one({"user_id": callback.from_user.id}) if not user_data or not user_data.get("user_client"): return await callback.answer( "āŒ You don't have any Userbot deployed yet!", show_alert=True ) _user_string = user_data.get("user_client")[0] user_mention = callback.from_user.mention await callback.message.edit_text( "šŸ”‘ **Session String Setup: @sessiondevbot**\n\n" "Please send your session string in this format:\n\n" "`ABCDEF1234ghIklzyx57W2v1u123ew11*********`\n\n" "āš ļø This will replace your current session!\n\n" "Cancelled use /cancel", reply_markup=None ) try: string_msg = await client.listen(callback.message.chat.id, timeout=60) if string_msg.text.lower() == "/cancel": await string_msg.reply( "āŒ Cancelled.", reply_markup=ikb([ [("Ā« Back", "my_userbotub")] ]) ) return string_update = string_msg.text.strip() if string_update == _user_string.get("session_string"): return await string_msg.reply( "āŒ Error Session string same use different!", reply_markup=ikb([ [("Ā« Back", "my_userbotub")] ]) ) await db_client.session.update_one( { "user_id": callback.from_user.id, "user_client.user_id": callback.from_user.id }, { "$set": { "user_client.$.session_string": string_update } } ) await string_msg.reply( "āœ… Session string updated successfully!", reply_markup=ikb([ [("Ā« Back", "my_userbotub")] ]) ) await notify_admins_user( client=client, message=f"šŸ’¬ Update Session\n\n" f"šŸ‘¤ User: {user_mention} ({callback.from_user.id})", user_id=user_id, is_button=True ) return except TimeoutError: await callback.message.reply_text("āŒ› Session setup timed out") except Exception as e: await callback.message.reply_text(f"āŒ Error: Please try again later.") await notify_admins_user( client=client, message=f"🚨 Error in asksessionstringub handler\n\n" f"šŸ‘¤ User: {user_mention} ({callback.from_user.id})\n" f"🧠 Error: {str(e)}", user_id=callback.from_user.id, is_button=False ) @ren.on_callback_query(filters.regex("^my_bots$")) async def show_user_bots(client: Client, callback: CallbackQuery): user_id = callback.from_user.id user_mention = callback.from_user.mention try: user_data = await db_client.alldl_bot.find_one({"user_id": user_id}) if not user_data or not user_data.get("bots"): return await callback.answer( "āŒ You don't have any bots deployed yet!", show_alert=True ) bots_by_status = { "approved": [], "pending": [], "rejected": [], "error": [] } for bot in user_data["bots"]: status = bot.get("status", "pending") bots_by_status.setdefault(status, []).append(bot) start = time.time() await client.get_me() end = time.time() latency = (end - start) * 1000 message_text = f"šŸ¤– Your Bot Dashboard šŸ‘‹ {user_mention}\n\n" message_text += f"šŸ· Tier: {'šŸ’Ž Premium' if user_data.get('is_premium') else 'šŸ†“ Free'}\n" message_text += f"šŸš€ Active Bots: {sum(1 for b in bots_by_status['approved'] if b.get('is_active'))}\n" message_text += f"ā³ Pending: {len(bots_by_status['pending'])}\n" message_text += f"āŒ Rejected: {len(bots_by_status['rejected'])}\n" message_text += f"āœ” Pong: `{latency:.2f} ms`\n\n" buttons = [] if bots_by_status["approved"]: message_text += "āœ… Approved Bots:\n" for bot in bots_by_status["approved"]: bot_name = bot.get("bot_username", "Unknown") status = "🟢 Online" if bot.get("is_active") else "šŸ”“ Offline" message_text += f"┣ {bot_name} - {status} - `{latency:.2f}`\n" buttons.append([ InlineKeyboardButton( f"āš™ļø Manage {bot_name}", callback_data=f"botmgmt_{bot.get('uuid', 'unknown')}" ) ]) if bots_by_status["pending"]: message_text += "\nšŸ•’ Pending Approval:\n" for bot in bots_by_status["pending"]: token_preview = bot.get("bot_token", "")[:10] + "..." submitted_time = bot.get("timestamp", "Unknown") message_text += f"┣ {token_preview} - {submitted_time}\n" buttons.append([ InlineKeyboardButton( f"āŒ Cancel {token_preview}", callback_data=f"cancelbotdl_{bot.get('uuid', 'unknown')}" ) ]) if bots_by_status["rejected"]: message_text += "\nāŒ Rejected Bots:\n" for bot in bots_by_status["rejected"]: token_preview = bot.get("bot_token", "")[:10] + "..." reason = bot.get("admin_action", {}).get("reason", "No reason given") message_text += f"┣ {token_preview} - {reason}\n" buttons.append([ InlineKeyboardButton( f"šŸ” Resubmit {token_preview}", callback_data=f"resubmitdl_{bot.get('uuid', 'unknown')}" ) ]) buttons.append([ InlineKeyboardButton("šŸ†• Deploy New Bot", callback_data="tutorial_alldlbot"), InlineKeyboardButton("šŸ’Ž Upgrade Plan", callback_data="premium_upgrades") ]) buttons.append([ InlineKeyboardButton("šŸ”„ Refresh", callback_data="my_bots"), InlineKeyboardButton("āŒ Close", callback_data="close") ]) buttons.append([ InlineKeyboardButton("Ā« Back", callback_data="customzie_bot"), ]) try: await callback.message.edit_text( message_text, reply_markup=InlineKeyboardMarkup(buttons) ) except Exception as e: LOGS.error(f"Edit message failed: {e}") await callback.answer("āš ļø Failed to update message, try again.", show_alert=True) await callback.answer() except Exception as e: LOGS.error(f"Error in my_bots handler: {str(e)}") await callback.answer("āš ļø Error fetching your bots!", show_alert=True) await client.send_message( PRIVATE_LOGS, f"🚨 Error in my_bots handler\n\n" f"šŸ‘¤ User: {user_mention} ({user_id})\n" f"🧠 Error: {str(e)}" ) @ren.on_callback_query(filters.regex(r"^botmgmt_(\w+)$")) async def manage_single_bot(client: Client, callback: CallbackQuery): bot_uuid = callback.matches[0].group(1) user_id = callback.from_user.id user_mention = callback.from_user.mention try: user_data = await db_client.alldl_bot.find_one( { "user_id": user_id, "bots.uuid": bot_uuid }, {"bots.$": 1} ) if not user_data or not user_data.get("bots"): return await callback.answer("āŒ Bot not found!", show_alert=True) bot = user_data["bots"][0] bot_username = bot.get("bot_username", "Unknown") bot_uuid = bot.get("uuid", "???") status = "🟢 Online" if bot.get("is_active") else "šŸ”“ Offline" last_active = bot.get("last_active", "Never") buttons = [ [ InlineKeyboardButton("šŸ”„ Restart Bot", callback_data=f"restartdl_{bot_uuid}"), InlineKeyboardButton("šŸ›‘ Stop Bot", callback_data=f"stopbotdl_{bot_uuid}") ], [ InlineKeyboardButton("šŸ“Š Stats", callback_data=f"botstatsdl_{bot_uuid}"), InlineKeyboardButton("āš™ļø Settings", callback_data=f"botsettingsdl_{bot_uuid}") ], [InlineKeyboardButton("Ā« Back", callback_data="my_bots")] ] await callback.message.edit_text( f"āš™ļø Managing {bot_username}\n\n" f"Status: {status}\n" f"Last Active: {last_active}\n" f"UUID: {bot_uuid}\n\n" "Choose an action below:", reply_markup=InlineKeyboardMarkup(buttons) ) await callback.answer() except Exception as e: LOGS.error(f"Bot management error: {str(e)}") await callback.answer("āŒ Error managing bot!", show_alert=True) await client.send_message( PRIVATE_LOGS, f"🚨 Error in single manage handler\n\n" f"šŸ‘¤ User: {user_mention} ({user_id})\n" f"🧠 Error: {str(e)}" ) @ren.on_callback_query(filters.regex(r"^botsettingsdl_(\w+)$")) async def handle_bot_settingsdl(client: Client, callback: CallbackQuery): try: bots_uuid = callback.matches[0].group(1) user_id = callback.from_user.id user_mention = callback.from_user.mention if not await verify_bot_ownershipdl(user_id, bots_uuid): await callback.answer("āŒ Unauthorized access!", show_alert=True) return bot_data = await db_client.alldl_bot.find_one( {"user_id": user_id, "bots.uuid": bots_uuid}, {"bots.$": 1} ) if not bot_data: return await callback.answer("āŒ Bot not found!", show_alert=True) buttons = InlineKeyboardMarkup([ [InlineKeyboardButton("šŸ” Reset Token", callback_data=f"start_reset_tokendl")], [InlineKeyboardButton("šŸ—‘ Delete Bot", callback_data=f"deletebotdl_{bots_uuid}")], [InlineKeyboardButton("Ā« Back to bot", callback_data="my_bots")] ]) await callback.message.edit_text( f"āš™ļø Bot Settings\n\n" f"šŸ†” UUID: `{bots_uuid}`\n" f"šŸ”— Username: {bot_data['bots'][0].get('bot_username', 'N/A')}\n" f"šŸ“… Created: {bot_data['bots'][0].get('created_at', 'Unknown')}", reply_markup=buttons ) await callback.answer() except Exception as e: LOGS.error(f"Settings error: {str(e)}") await callback.answer("āš ļø Error loading settings!", show_alert=True) await client.send_message( PRIVATE_LOGS, f"🚨 Error in settingdl handler\n\n" f"šŸ‘¤ User: {user_mention} ({user_id})\n" f"🧠 Error: {str(e)}" ) @ren.on_callback_query(filters.regex("start_reset_tokendl")) async def reset_tokendl_callbackx(client, callback_query): user_id = callback_query.from_user.id bot_data = await db_client.alldl_bot.find_one({"user_id": user_id}) if not bot_data: await callback_query.answer("āŒ Bot not found!", show_alert=True) return old_uuid = bot_data["bots"][0].get("uuid") await callback_query.message.edit_text( "āœļø Please send the UUID of the bot you want to reset.\n\nYou can cancel by typing `/cancel`\n\nYou can't this button is disabled.", reply_markup=ikb([ [("šŸ”’ Locked Cancel", "noop")] ]) ) try: uuid_msg = await client.listen(callback_query.message.chat.id, timeout=60) if uuid_msg.text.lower() == "/cancel": await uuid_msg.reply( "āŒ Cancelled.", reply_markup=ikb([ [("Ā« Back", "customzie_bot")] ]) ) return bots_uuid = uuid_msg.text.strip() if bots_uuid != old_uuid: await uuid_msg.reply( "āŒ Token reset cancelled.", reply_markup=ikb([ [("Ā« Back", "customzie_bot")] ]) ) return keyboard = InlineKeyboardMarkup([ [ InlineKeyboardButton("āœ… Yes", callback_data=f"resettokendl_{bots_uuid}"), InlineKeyboardButton("āŒ Cancel", callback_data=f"cancel_resetdl_{bots_uuid}") ] ]) await uuid_msg.reply( f"Are you sure you want to reset the token for:\n`{bots_uuid}`", reply_markup=keyboard ) except asyncio.TimeoutError: await callback_query.message.reply("ā° Timeout. Please try again.") @ren.on_callback_query(filters.regex(r"^(resettokendl|cancel_resetdl)_(\w+)$")) async def tokenx_reset_flowdl(client: Client, callback: CallbackQuery): action, bot_uuid = callback.matches[0].groups() user_id = callback.from_user.id user_mention = callback.from_user.mention bot_data = await db_client.alldl_bot.find_one( { "user_id": user_id, "bots.uuid": bot_uuid }, {"bots.$": 1} ) if not bot_data: await callback.answer("āŒ Bot not found!", show_alert=True) return if action == "cancel_resetdl": await callback.answer("Token reset cancelled āŒ", show_alert=False) await callback.message.edit_text( "āŒ Token reset cancelled.", reply_markup=ikb([ [("Ā« Back", "customzie_bot")] ]) ) return try: current_token = bot_data["bots"][0]["uuid"] new_token = str(uuid.uuid4())[:8] await db_client.alldl_bot.update_one( { "user_id": user_id, "bots.uuid": bot_uuid }, { "$set": { "bots.$.uuid": new_token, "bots.$.updated_at": dt.now().strftime("%Y-%m-%d %H:%M:%S"), }, "$push": { "bots.$.old_tokens": { "token": current_token, "reset_at": dt.now().strftime("%Y-%m-%d %H:%M:%S") } } } ) await callback.message.edit_text( f"āœ… Token has been reset successfully!\n\n`{new_token}`", reply_markup=None ) await callback.answer("New token generated āœ…", show_alert=False) except Exception as e: LOGS.error(f"Token reset error: {str(e)}") await callback.answer("āŒ Failed to reset token. Please try again later.", True) await client.send_message( PRIVATE_LOGS, f"🚨 Error in tokenx reset handler\n\n" f"šŸ‘¤ User: {user_mention} ({user_id})\n" f"🧠 Error: {str(e)}" ) @ren.on_callback_query(filters.regex("^noop$")) async def noopx_callback(client, callback_query): await callback_query.answer("šŸ”’ This button is disabled.", show_alert=False) @ren.on_callback_query(filters.regex(r"^deletebotdl_(\w+)$")) async def handle_delete_botdl(client: Client, callback: CallbackQuery): try: bots_uuid = callback.matches[0].group(1) user_id = callback.from_user.id user_mention = callback.from_user.mention if not await verify_bot_ownershipdl(user_id, bots_uuid): await callback.answer("āŒ Unauthorized access!", show_alert=True) return bot_data = await db_client.alldl_bot.find_one( { "user_id": user_id, "bots.uuid": bots_uuid, }, {"bots.$": 1} ) if not bot_data: await callback.answer("āŒ Bot not found!", show_alert=True) return await callback.message.edit_text( f"āš ļø **Permanent Deletion**\n\n" f"šŸ†” UUID: `{bots_uuid}`\n" f"šŸ”— Username: {bot_data['bots'][0].get('bot_username', 'N/A')}\n\n" "This will immediately:\n" "1. Stop the bot instance\n" "2. Remove all download history\n" "3. Delete configuration data", reply_markup=InlineKeyboardMarkup([ [InlineKeyboardButton("ā˜ ļø Confirm Delete", callback_data=f"confirmdeletedl_{bots_uuid}")], [InlineKeyboardButton("šŸ”’ Cancel", callback_data=f"nodeletedl_{bots_uuid}")], [InlineKeyboardButton("Ā« Back", callback_data="my_bots")] ]) ) await callback.answer() except Exception as e: LOGS.error(f"Delete init error: {str(e)}") await callback.answer("āš ļø Error processing request", show_alert=True) await client.send_message( PRIVATE_LOGS, f"🚨 Error in delete_botdl handler\n\n" f"šŸ‘¤ User: {user_mention} ({user_id})\n" f"🧠 Error: {str(e)}" ) @ren.on_callback_query(filters.regex(r"^(confirmdeletedl|nodeletedl)_(\w+)$")) async def delete_confirmationdl(client: Client, callback: CallbackQuery): action, bots_uuid = callback.matches[0].groups() if action == "nodeletedl": await callback.message.edit_text( "āœ… Deletion cancelled", reply_markup=InlineKeyboardMarkup([ [InlineKeyboardButton("Ā« Back", callback_data="my_bots")] ]) ) await callback.answer() return try: user_id = callback.from_user.id user_mention = callback.from_user.mention result = await db_client.alldl_bot.update_one( {"user_id": user_id}, {"$pull": {"bots": {"uuid": bots_uuid}}} ) if result.modified_count == 1: await callback.message.edit_text( "šŸ—‘ļø **Bot Deleted**\n\n" f"All data for `{bots_uuid}` has been removed\n" f"Average review time: 24-48 hours", reply_markup=InlineKeyboardMarkup([ [InlineKeyboardButton("Ā« Back", callback_data="customzie_bot")], ]) ) await notify_admins( client=client, message=f"šŸ—‘ļø Bot Deleted\n\n" f"User: {user_mention}\n" f"UUID: {bots_uuid}\n", user_id=user_id, bots_uuid=bots_uuid ) else: raise Exception("Database update failed") except Exception as e: LOGS.error(f"Deletion error: {str(e)}") await callback.message.edit_text("āŒ Deletion failed. Please contact support.") await client.send_message( PRIVATE_LOGS, f"🚨 Error indelete_confirmationdl handler\n\n" f"šŸ‘¤ User: {user_mention} ({user_id})\n" f"🧠 Error: {str(e)}" ) @ren.on_callback_query(filters.regex(r"^resubmitdl_(\w+)$")) async def xresubmission(client: Client, callback: CallbackQuery): try: bots_uuid = callback.matches[0].group(1) user_id = callback.from_user.id user_mention = callback.from_user.mention if not await verify_bot_ownershipdl(user_id, bots_uuid): await callback.answer("āŒ Unauthorized access!", show_alert=True) return bot_data = await db_client.alldl_bot.find_one( { "user_id": user_id, "bots.uuid": bots_uuid, "bots.status": "rejected" }, {"bots.$": 1} ) if not bot_data: await callback.answer("āŒ Bot not found or not eligible for resubmission", show_alert=True) return bot = bot_data["bots"][0] rejection_reason = bot.get("admin_action", {}).get("reason", "No reason provided") await callback.message.edit_text( f"šŸ”„ **Resubmit Bot Request**\n\n" f"šŸ†” UUID: `{bots_uuid}`\n" f"āŒ Previous Rejection Reason: {rejection_reason}\n\n" "Please confirm you want to resubmit this bot for approval:", reply_markup=InlineKeyboardMarkup([ [InlineKeyboardButton("āœ… Confirm Resubmit", callback_data=f"confirm_resubmitdl_{bots_uuid}")], [InlineKeyboardButton("āŒ Cancel", callback_data=f"cancel_resubmitdl_")], [InlineKeyboardButton("Ā« Back", callback_data="my_bots")] ]) ) await callback.answer() except Exception as e: LOGS.error(f"Resubmission init error: {str(e)}") await callback.answer("āš ļø Error processing request", show_alert=True) await client.send_message( PRIVATE_LOGS, f"🚨 Error in xresubmission handler\n\n" f"šŸ‘¤ User: {user_mention} ({user_id})\n" f"🧠 Error: {str(e)}" ) @ren.on_callback_query(filters.regex(r"^cancelbotdl_(\w+)$")) async def handle_cancel_bot(client: Client, callback: CallbackQuery): try: bots_uuid = callback.matches[0].group(1) user_id = callback.from_user.id user_mention = callback.from_user.mention if not await verify_bot_ownershipdl(user_id, bots_uuid): await callback.answer("āŒ Unauthorized access!", show_alert=True) return bot_data = await db_client.alldl_bot.find_one( { "user_id": user_id, "bots.uuid": bots_uuid, "bots.status": "pending" }, {"bots.$": 1} ) if not bot_data: await callback.answer("āŒ No pending bot found with this ID", show_alert=True) return await callback.message.edit_text( f"āš ļø **Confirm Cancellation**\n\n" f"UUID: `{bots_uuid}`\n" f"Submitted: {bot_data['bots'][0].get('timestamp', 'Unknown')}\n\n" "This will permanently remove the bot request:", reply_markup=InlineKeyboardMarkup([ [InlineKeyboardButton("šŸ—‘ Confirm Delete", callback_data=f"confirmcanceldl_{bots_uuid}")], [InlineKeyboardButton("šŸ”™ Keep Request", callback_data=f"keepbotdl_{user_id}")], [InlineKeyboardButton("Ā« Back", callback_data="my_bots")] ]) ) await callback.answer() except Exception as e: LOGS.error(f"Cancel init error: {str(e)}") await callback.answer("āš ļø Error processing request", show_alert=True) await client.send_message( PRIVATE_LOGS, f"🚨 Error in cancel_bot handler\n\n" f"šŸ‘¤ User: {user_mention} ({user_id})\n" f"🧠 Error: {str(e)}" ) @ren.on_callback_query(filters.regex(r"^confirmcanceldl_(\w+)$")) async def confirm_cancel_bot(client: Client, callback: CallbackQuery): try: bots_uuid = callback.matches[0].group(1) user_id = callback.from_user.id user_mention = callback.from_user.mention if not await verify_bot_ownershipdl(user_id, bots_uuid): await callback.answer("āŒ Unauthorized access!", show_alert=True) return result = await db_client.alldl_bot.update_one( {"user_id": user_id}, {"$pull": {"bots": {"uuid": bots_uuid}}} ) if result.modified_count == 1: await callback.message.edit_text( "āœ… **Request Cancelled**\n\n" f"Bot `{bots_uuid}` has been permanently removed", reply_markup=InlineKeyboardMarkup([ [InlineKeyboardButton("šŸ“‹ My Bots", callback_data="my_bots")] ]) ) else: raise Exception("Database update failed") except Exception as e: LOGS.error(f"Cancel error: {str(e)}") await callback.message.edit_text("āŒ Failed to cancel request. Please contact support.") await client.send_message( PRIVATE_LOGS, f"🚨 Error in confirm cancel handler\n\n" f"šŸ‘¤ User: {user_mention} ({user_id})\n" f"🧠 Error: {str(e)}" ) @ren.on_callback_query(filters.regex(r"^confirm_resubmitdl_(\w+)$")) async def confirm_resubmission(client: Client, callback: CallbackQuery): try: bots_uuid = callback.matches[0].group(1) user_id = callback.from_user.id user_mention = callback.from_user.mention if not await verify_bot_ownershipdl(user_id, bots_uuid): await callback.answer("āŒ Unauthorized access!", show_alert=True) return result = await db_client.alldl_bot.update_one( { "user_id": user_id, "bots.uuid": bots_uuid }, { "$set": { "bots.$.status": "pending", "bots.$.resubmitted_at": dt.now().strftime("%Y-%m-%d %H:%M:%S"), "bots.$.admin_action.reviewed": False } } ) if result.modified_count == 1: await callback.message.edit_text( f"āœ… **Resubmission Successful**\n\n" f"Bot `{bots_uuid}` has been queued for admin review.\n" f"Average review time: 24-48 hours", reply_markup=InlineKeyboardMarkup([ [InlineKeyboardButton("šŸ“Š View Status", callback_data=f"statusdl_{user_id}")] ]) ) await notify_admins( client=client, message=f"Bot resubmitted: {bots_uuid} by {callback.from_user.mention}", user_id=user_id, bots_uuid=bots_uuid ) else: raise Exception("Database update failed") except Exception as e: LOGS.error(f"Resubmission error: {str(e)}") await callback.message.edit_text("āŒ Failed to resubmit. Please try again later.") await client.send_message( PRIVATE_LOGS, f"🚨 Error in confirm_resubmission handler\n\n" f"šŸ‘¤ User: {user_mention} ({user_id})\n" f"🧠 Error: {str(e)}" ) async def notify_admins_user(client, message, user_id, is_button=False): admin_buttons = InlineKeyboardMarkup([ [InlineKeyboardButton("āœ… Approve", callback_data=f"approved_ub_{user_id}"), InlineKeyboardButton("āŒ Reject", callback_data=f"rejected_ub_{user_id}")], [InlineKeyboardButton("šŸ‘¤ View User", url=f"tg://user?id={user_id}")] ]) return await client.send_message( PRIVATE_LOGS, text=message, reply_markup=admin_buttons if is_button else None ) async def notify_admins(client, message, user_id, bots_uuid): admin_buttons = InlineKeyboardMarkup([ [InlineKeyboardButton("āœ… Approve", callback_data=f"approved_alldl_{user_id}_{bots_uuid}"), InlineKeyboardButton("āŒ Reject", callback_data=f"rejected_alldl_{user_id}_{bots_uuid}")], [InlineKeyboardButton("šŸ‘¤ View User", url=f"tg://user?id={user_id}")] ]) return await client.send_message( PRIVATE_LOGS, text=message, reply_markup=admin_buttons ) @ren.on_callback_query(filters.regex(r"^cancel_resubmitdl_")) async def cancel_resubmit(client: Client, callback: CallbackQuery): await callback.message.edit_text( "🚫 Resubmission cancelled", reply_markup=InlineKeyboardMarkup([ [InlineKeyboardButton("Ā« Back", callback_data="my_bots")] ]) ) await callback.answer()