# -*- 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()