Refactor bot navigation menus and enhance button layouts

This commit is contained in:
Antigravity Bot
2026-08-30 01:37:32 +03:30
parent 112f2bed1a
commit b03bd8f488
+62 -23
View File
@@ -45,17 +45,17 @@ def clamp_for_telegram(text: str, has_media: bool) -> str:
def get_persian_main_menu(is_paused: bool = False): def get_persian_main_menu(is_paused: bool = False):
return [ return [
[Button.text("📋 Copy (محتوا)", resize=True), Button.text("🧠 AI (هوش مصنوعی)", resize=True)], [Button.text("📋 مدیریت محتوا (Copy)", resize=True), Button.text("🧠 هوش مصنوعی (AI)", resize=True)],
[Button.text("🤖 Bots (کانال‌ها و ربات‌ها)", resize=True), Button.text("📊 Monitor (مانیتورینگ)", resize=True)], [Button.text("🤖 کانال‌ها و وب (Bots)", resize=True), Button.text("📊 مانیتورینگ (Monitor)", resize=True)],
[Button.text("⚙️ System (سیستم)", resize=True), Button.text("🏠 منوی اصلی", resize=True)] [Button.text("⚙️ مدیریت سیستم (System)", resize=True)]
] ]
def get_persian_inline_hub_menu(): def get_persian_inline_hub_menu():
return [ return [
[Button.inline("📋 Copy (محتوا)", data="hub_copy"), Button.inline("🧠 AI (هوش مصنوعی)", data="ai_menu")], [Button.inline("📋 مدیریت محتوا (Copy)", data="hub_copy"), Button.inline("🧠 هوش مصنوعی (AI)", data="ai_menu")],
[Button.inline("🤖 Bots (کانال‌ها و وب)", data="hub_bots"), Button.inline("📊 Monitor (مانیتورینگ)", data="hub_monitor")], [Button.inline("🤖 کانال‌ها و وب (Bots)", data="hub_bots"), Button.inline("📊 مانیتورینگ (Monitor)", data="hub_monitor")],
[Button.inline("⚙️ System (سیستم)", data="hub_system")] [Button.inline("⚙️ مدیریت سیستم (System)", data="hub_system")]
] ]
@@ -1071,17 +1071,47 @@ class AdminBotService:
return text, buttons return text, buttons
async def _render_queues_status(self) -> Tuple[str, List[List[Button]]]:
targets = await self.repo.get_active_targets()
total_queued = await self.queue.get_total_queued_posts() if self.queue else 0
lines = [
"📬 <b>وضعیت صف‌های انتشار کانال‌های مقصد:</b>\n",
f"• 📦 <b>مجموع کل پست‌ها در تمام صف‌ها:</b> <b>{total_queued}</b> پست\n"
]
buttons = []
if targets:
for t in targets:
qsize = await self.queue.get_target_queue_size(t.id) if self.queue else 0
order_m = "ترتیبی" if getattr(t, "dispatch_order", "order") == "order" else "تصادفی"
lines.append(f"• 🎯 <b>{t.title}</b>: <b>{qsize} پست</b> در صف ({order_m})")
buttons.append([Button.inline(f"🎯 {t.title} ({qsize} پست)", data=f"trg_view:{t.id}")])
else:
lines.append("<i>هیچ کانال مقصدی ثبت نشده است.</i>")
buttons.append([
Button.inline("🔄 بروزرسانی وضعیت صف‌ها", data="hub_queues"),
Button.inline("🔙 بازگشت به منوی محتوا", data="hub_copy")
])
return "\n".join(lines), buttons
async def _render_copy_hub(self) -> Tuple[str, List[List[Button]]]: async def _render_copy_hub(self) -> Tuple[str, List[List[Button]]]:
unreviewed = await self.repo.get_unreviewed_posts(limit=50) unreviewed = await self.repo.get_unreviewed_posts(limit=50)
total_queued = await self.queue.get_total_queued_posts() if self.queue else 0
text = ( text = (
"📋 <b>بخش کپی و محتوا (Copy Hub):</b>\n\n" "📋 <b>بخش مدیریت محتوا و صف‌ها (Copy Hub):</b>\n\n"
f"• 📨 <b>پست‌های منتظر بررسی:</b> {len(unreviewed)} پست\n\n" f"• 📨 <b>پست‌های منتظر بررسی:</b> {len(unreviewed)} پست\n"
f"• 📬 <b>پست‌های در صف انتشار:</b> {total_queued} پست\n\n"
"از گزینه‌های زیر برای مدیریت جریان محتوا و انتشار استفاده کنید:" "از گزینه‌های زیر برای مدیریت جریان محتوا و انتشار استفاده کنید:"
) )
buttons = [ buttons = [
[Button.inline(f"📨 ارسال پست‌های بررسی‌نشده ({len(unreviewed)})", data="hub_pending")], [
[Button.inline(" افزودن مبدا / مقصد جدید", data="hub_add")], Button.inline(f"📨 ارسال پست‌های بررسی‌نشده ({len(unreviewed)})", data="hub_pending"),
[Button.inline("📂 دسته‌بندی موضوعی کانال‌ها", data="hub_cats")], Button.inline(f"📬 وضعیت صف‌های انتشار ({total_queued})", data="hub_queues")
],
[
Button.inline("➕ افزودن مبدا / مقصد جدید", data="hub_add"),
Button.inline("📂 دسته‌بندی موضوعی کانال‌ها", data="hub_cats")
],
[Button.inline("🔙 بازگشت به منوی اصلی", data="back_to_main")] [Button.inline("🔙 بازگشت به منوی اصلی", data="back_to_main")]
] ]
return text, buttons return text, buttons
@@ -1091,7 +1121,7 @@ class AdminBotService:
targets = await self.repo.get_active_targets() targets = await self.repo.get_active_targets()
websites = await self.repo.get_active_source_websites() websites = await self.repo.get_active_source_websites()
text = ( text = (
f"🤖 <b>بخش کانال‌ها و ربات‌ها (Bots Hub):</b>\n\n" f"🤖 <b>بخش کانال‌ها، وبسایت‌ها و ربات‌ها (Bots Hub):</b>\n\n"
f"• 📡 <b>کانال‌های مبدا:</b> {len(sources)} کانال\n" f"• 📡 <b>کانال‌های مبدا:</b> {len(sources)} کانال\n"
f"• 🎯 <b>کانال‌های مقصد:</b> {len(targets)} کانال\n" f"• 🎯 <b>کانال‌های مقصد:</b> {len(targets)} کانال\n"
f"• 🌐 <b>وبسایت‌های مبدا:</b> {len(websites)} وبسایت\n\n" f"• 🌐 <b>وبسایت‌های مبدا:</b> {len(websites)} وبسایت\n\n"
@@ -1104,7 +1134,11 @@ class AdminBotService:
], ],
[ [
Button.inline(f"🌐 وبسایت‌های مبدا ({len(websites)})", data="list_web"), Button.inline(f"🌐 وبسایت‌های مبدا ({len(websites)})", data="list_web"),
Button.inline("🔑 کد لاگین یوزربات", data="hub_req_code") Button.inline("🔑 احراز هویت یوزربات", data="hub_req_code")
],
[
Button.inline("➕ افزودن منبع / کانال جدید", data="hub_add"),
Button.inline("📂 مدیریت دسته‌بندی‌ها", data="list_cat")
], ],
[Button.inline("🔙 بازگشت به منوی اصلی", data="back_to_main")] [Button.inline("🔙 بازگشت به منوی اصلی", data="back_to_main")]
] ]
@@ -1398,35 +1432,35 @@ class AdminBotService:
await event.reply(welcome_text, parse_mode="html", buttons=menu) await event.reply(welcome_text, parse_mode="html", buttons=menu)
# --- 5 Primary Category Hubs: Copy, AI, Bots, System, Monitor --- # --- 5 Primary Category Hubs: Copy, AI, Bots, System, Monitor ---
@self.client.on(events.NewMessage(pattern=r"(?i)^(/copy|📋 copy \(محتوا\)|📋 copy|copy)$")) @self.client.on(events.NewMessage(pattern=r"(?i)^(/copy|📋 مدیریت محتوا \(copy\)|📋 copy \(محتوا\)|📋 مدیریت محتوا|📋 copy|copy)$"))
async def cmd_copy_hub(event: events.NewMessage.Event): async def cmd_copy_hub(event: events.NewMessage.Event):
if not self.is_admin(event.sender_id): if not self.is_admin(event.sender_id):
return return
text, buttons = await self._render_copy_hub() text, buttons = await self._render_copy_hub()
await event.reply(text, parse_mode="html", buttons=buttons) await event.reply(text, parse_mode="html", buttons=buttons)
@self.client.on(events.NewMessage(pattern=r"(?i)^(/ai|🧠 ai \(هوش مصنوعی\)|🧠 ai|ai)$")) @self.client.on(events.NewMessage(pattern=r"(?i)^(/ai|🧠 هوش مصنوعی \(ai\)|🧠 ai \(هوش مصنوعی\)|🧠 هوش مصنوعی|🧠 ai|ai)$"))
async def cmd_ai_hub(event: events.NewMessage.Event): async def cmd_ai_hub(event: events.NewMessage.Event):
if not self.is_admin(event.sender_id): if not self.is_admin(event.sender_id):
return return
text, buttons = await self._render_ai_menu() text, buttons = await self._render_ai_menu()
await event.reply(text, parse_mode="html", buttons=buttons) await event.reply(text, parse_mode="html", buttons=buttons)
@self.client.on(events.NewMessage(pattern=r"(?i)^(/bots|🤖 bots \(کانال‌ها و ربات‌ها\)|🤖 bots|bots)$")) @self.client.on(events.NewMessage(pattern=r"(?i)^(/bots|🤖 کانال‌ها و وب \(bots\)|🤖 bots \(کانال‌ها و ربات‌ها\)|🤖 کانال‌ها و وب|🤖 bots|bots)$"))
async def cmd_bots_hub(event: events.NewMessage.Event): async def cmd_bots_hub(event: events.NewMessage.Event):
if not self.is_admin(event.sender_id): if not self.is_admin(event.sender_id):
return return
text, buttons = await self._render_bots_hub() text, buttons = await self._render_bots_hub()
await event.reply(text, parse_mode="html", buttons=buttons) await event.reply(text, parse_mode="html", buttons=buttons)
@self.client.on(events.NewMessage(pattern=r"(?i)^(/system|⚙️ system \(سیستم\)|⚙️ system|system)$")) @self.client.on(events.NewMessage(pattern=r"(?i)^(/system|⚙️ مدیریت سیستم \(system\)|⚙️ system \(سیستم\)|⚙️ مدیریت سیستم|⚙️ system|system)$"))
async def cmd_system_hub(event: events.NewMessage.Event): async def cmd_system_hub(event: events.NewMessage.Event):
if not self.is_admin(event.sender_id): if not self.is_admin(event.sender_id):
return return
text, buttons = await self._render_system_hub() text, buttons = await self._render_system_hub()
await event.reply(text, parse_mode="html", buttons=buttons) await event.reply(text, parse_mode="html", buttons=buttons)
@self.client.on(events.NewMessage(pattern=r"(?i)^(/monitor|📊 monitor \(مانیتورینگ\)|📊 monitor|monitor)$")) @self.client.on(events.NewMessage(pattern=r"(?i)^(/monitor|📊 مانیتورینگ \(monitor\)|📊 monitor \(مانیتورینگ\)|📊 مانیتورینگ|📊 monitor|monitor)$"))
async def cmd_monitor_hub(event: events.NewMessage.Event): async def cmd_monitor_hub(event: events.NewMessage.Event):
if not self.is_admin(event.sender_id): if not self.is_admin(event.sender_id):
return return
@@ -1684,11 +1718,11 @@ class AdminBotService:
# Ignore main menu commands # Ignore main menu commands
if text in ["/start", "/menu", "منو", "منوی اصلی", "🏠 منوی اصلی", if text in ["/start", "/menu", "منو", "منوی اصلی", "🏠 منوی اصلی",
"/copy", "📋 copy (محتوا)", "📋 Copy (محتوا)", "📋 کپی", "Copy", "/copy", "📋 مدیریت محتوا (Copy)", "📋 مدیریت محتوا", "📋 copy (محتوا)", "📋 Copy (محتوا)", "📋 کپی", "Copy",
"/ai", "🧠 ai (هوش مصنوعی)", "🧠 AI (هوش مصنوعی)", "🧠 تنظیمات AI", "🧠 تنظیمات و لاگ‌های AI", "AI", "/ai", "🧠 هوش مصنوعی (AI)", "🧠 هوش مصنوعی", "🧠 ai (هوش مصنوعی)", "🧠 AI (هوش مصنوعی)", "🧠 تنظیمات AI", "🧠 تنظیمات و لاگ‌های AI", "AI",
"/bots", "🤖 bots (کانال‌ها و ربات‌ها)", "🤖 Bots (کانال‌ها و ربات‌ها)", "🤖 کانال‌ها و ربات‌ها", "Bots", "/bots", "🤖 کانال‌ها و وب (Bots)", "🤖 کانال‌ها و وب", "🤖 bots (کانال‌ها و ربات‌ها)", "🤖 Bots (کانال‌ها و ربات‌ها)", "🤖 کانال‌ها و ربات‌ها", "Bots",
"/system", "⚙️ system (سیستم)", "⚙️ System (سیستم)", "⚙️ مدیریت سیستم", "System", "/system", "⚙️ مدیریت سیستم (System)", "⚙️ مدیریت سیستم", "⚙️ system (سیستم)", "⚙️ System (سیستم)", "System",
"/monitor", "📊 monitor (مانیتورینگ)", "📊 Monitor (مانیتورینگ)", "📊 مانیتورینگ", "Monitor", "/monitor", "📊 مانیتورینگ (Monitor)", "📊 مانیتورینگ", "📊 monitor (مانیتورینگ)", "📊 Monitor (مانیتورینگ)", "Monitor",
"/stats", "/report", "📊 آمار ناوگان", "📊 آمار و وضعیت ناوگان", "📊 گزارش و آمار سیستم", "/stats", "/report", "📊 آمار ناوگان", "📊 آمار و وضعیت ناوگان", "📊 گزارش و آمار سیستم",
"/sources", "📡 کانال‌های مبدا", "/targets", "🎯 کانال‌های مقصد", "/sources", "📡 کانال‌های مبدا", "/targets", "🎯 کانال‌های مقصد",
"/websites", "/sites", "🌐 وبسایت‌های مبدا", "/websites", "/sites", "🌐 وبسایت‌های مبدا",
@@ -2833,6 +2867,11 @@ class AdminBotService:
except Exception: except Exception:
pass pass
elif data == "hub_queues":
text, buttons = await self._render_queues_status()
await event.edit(text, parse_mode="html", buttons=buttons)
await event.answer()
elif data == "hub_cats": elif data == "hub_cats":
text, buttons = await self._render_categories_menu() text, buttons = await self._render_categories_menu()
await event.edit(text, parse_mode="html", buttons=buttons or None) await event.edit(text, parse_mode="html", buttons=buttons or None)