|
|
|
import time |
|
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 |
|
|
|
@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"π€ <b>Your Bot Dashboard</b> π {user_mention}\n\n" |
|
message_text += f"π· <b>Tier:</b> {'π Premium' if user_data.get('is_premium') else 'π Free'}\n" |
|
message_text += f"π <b>Active Bots:</b> {sum(1 for b in bots_by_status['approved'] if b.get('is_active'))}\n" |
|
message_text += f"β³ <b>Pending:</b> {len(bots_by_status['pending'])}\n" |
|
message_text += f"β <b>Rejected:</b> {len(bots_by_status['rejected'])}\n" |
|
message_text += f"π <b>Pong!:</b> {latency:.2f}.\n\n" |
|
|
|
buttons = [] |
|
|
|
if bots_by_status["approved"]: |
|
message_text += "β
<b>Approved Bots:</b>\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π <b>Pending Approval:</b>\n" |
|
for bot in bots_by_status["pending"]: |
|
token_preview = bot.get("bot_token", "")[:10] + f":{bot.get('uuid', '')}" |
|
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β <b>Rejected Bots:</b>\n" |
|
for bot in bots_by_status["rejected"]: |
|
token_preview = bot.get("bot_token", "")[:10] + f":{bot.get('uuid', '')}" |
|
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"π¨ <b>Error in my_bots handler</b>\n\n" |
|
f"π€ User: {user_mention} ({user_id})\n" |
|
f"π§ Error: {type(e).__name__}: <code>{str(e)}</code>" |
|
) |
|
|
|
@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"βοΈ <b>Managing {bot_username}</b>\n\n" |
|
f"Status: {status}\n" |
|
f"Last Active: {last_active}\n" |
|
f"UUID: <code>{bot_uuid}</code>\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"π¨ <b>Error in single manage handler</b>\n\n" |
|
f"π€ User: {user_mention} ({user_id})\n" |
|
f"π§ Error: {type(e).__name__}: <code>{str(e)}</code>" |
|
) |
|
|
|
@ren.on_callback_query(filters.regex(r"^botsettingsdl_(\w+)$")) |
|
async def xbot_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"π¨ <b>Error in settingdl handler</b>\n\n" |
|
f"π€ User: {user_mention} ({user_id})\n" |
|
f"π§ Error: {type(e).__name__}: <code>{str(e)}</code>" |
|
) |
|
|
|
@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.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"π¨ <b>Error in tokenx reset handler</b>\n\n" |
|
f"π€ User: {user_mention} ({user_id})\n" |
|
f"π§ Error: {type(e).__name__}: <code>{str(e)}</code>" |
|
) |
|
|
|
@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"^resubmitdl_(\w+)$")) |
|
async def resubmissiondl(client: Client, callback: CallbackQuery): |
|
try: |
|
bots_uuid = callback.matches[0].group(1) |
|
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": 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_")] |
|
]) |
|
) |
|
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"π¨ <b>Error in resubm handler</b>\n\n" |
|
f"π€ User: {user_mention} ({user_id})\n" |
|
f"π§ Error: {type(e).__name__}: <code>{str(e)}</code>" |
|
) |
|
|
|
@ren.on_callback_query(filters.regex(r"^confirm_resubmitdl_(\w+)$")) |
|
async def confresubmissiondl(client: Client, callback: CallbackQuery): |
|
try: |
|
bots_uuid = callback.matches[0].group(1) |
|
user_id = callback.from_user.id |
|
user_mention = callback.from_user.mention |
|
|
|
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(), |
|
"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_adminsdl( |
|
f"Bot resubmitteddl: {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"π¨ <b>Error in config resub handler</b>\n\n" |
|
f"π€ User: {user_mention} ({user_id})\n" |
|
f"π§ Error: {type(e).__name__}: <code>{str(e)}</code>" |
|
) |
|
|
|
async def notify_adminsdl(text_str, 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}")] |
|
]) |
|
await client.send_message( |
|
PRIVATE_LOGS, |
|
text_str, |
|
reply_markup=admin_buttons |
|
) |
|
|
|
@ren.on_callback_query(filters.regex(r"^cancel_resubmitdl_")) |
|
async def cancel_resubmitdl(client: Client, callback: CallbackQuery): |
|
await callback.message.edit_text( |
|
"π« Resubmission cancelled", |
|
reply_markup=ikb([ |
|
[("Β« Back", "customzie_bot")] |
|
]) |
|
) |
|
await callback.answer() |
|
|
|
@ren.on_callback_query(filters.regex(r"^cancelbotdl_(\w+)$")) |
|
async def cancelbotdl(client: Client, callback: CallbackQuery): |
|
try: |
|
bots_uuid = callback.matches[0].group(1) |
|
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": 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}")] |
|
]) |
|
) |
|
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"π¨ <b>Error in cancelbotdl handler</b>\n\n" |
|
f"π€ User: {user_mention} ({user_id})\n" |
|
f"π§ Error: {type(e).__name__}: <code>{str(e)}</code>" |
|
) |
|
|
|
@ren.on_callback_query(filters.regex(r"^confirmcanceldl_(\w+)$")) |
|
async def confirm_cancel_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 |
|
|
|
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")], |
|
[InlineKeyboardButton("Β« Back", callback_data="customzie_bot")] |
|
]) |
|
) |
|
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"π¨ <b>Error in confirm cancelbotdl handler</b>\n\n" |
|
f"π€ User: {user_mention} ({user_id})\n" |
|
f"π§ Error: {type(e).__name__}: <code>{str(e)}</code>" |
|
) |
|
|
|
@ren.on_callback_query(filters.regex(r"^keepbotdl_(\d+)$")) |
|
async def keep_bot_requestdl(client: Client, callback: CallbackQuery): |
|
await callback.message.edit_text( |
|
"π Bot request kept in queue\n\n" |
|
"Your submission remains pending admin review", |
|
reply_markup=InlineKeyboardMarkup([ |
|
[InlineKeyboardButton("π Check Status", callback_data=f"statusdl_{callback.matches[0].group(1)}")], |
|
[InlineKeyboardButton("Β« Back", callback_data="customzie_bot")] |
|
]) |
|
) |
|
await callback.answer() |