fix: action button layout and event handler registrations

This commit is contained in:
mamad
2026-08-28 23:07:16 +03:30
parent f03d932978
commit ffa451ce02
2 changed files with 39 additions and 25 deletions
+36 -22
View File
@@ -42,12 +42,14 @@ def clamp_for_telegram(text: str, has_media: bool) -> str:
def get_persian_main_menu(is_paused: bool = False):
pause_btn = "▶️ راه‌اندازی و ادامه سیستم" if is_paused else "🛑 توقف اضطراری سیستم"
pause_btn = "▶️ راه‌اندازی سیستم" if is_paused else "🛑 توقف سیستم"
return [
[Button.text("🏠 منوی اصلی", resize=True), Button.text("📊 آمار و وضعیت ناوگان", resize=True), Button.text("🔑 کد لاگین", resize=True)],
[Button.text("📡 کانال‌های مبدا", resize=True), Button.text("🎯 کانال‌های مقصد", resize=True), Button.text("🌐 وبسایت‌های مبدا", resize=True)],
[Button.text("📂 دسته‌بندی‌ها", resize=True), Button.text("🧠 تنظیمات و لاگ‌های AI", resize=True), Button.text("⚠️ خطاهای سیستم", resize=True)],
[Button.text("➕ افزودن مبدا / مقصد", resize=True), Button.text("📨 پست‌های بررسی‌نشده", resize=True), Button.text(pause_btn, resize=True)],
[Button.text("🏠 منوی اصلی", resize=True), Button.text("📊 آمار ناوگان", resize=True)],
[Button.text("📡 کانال‌های مبدا", resize=True), Button.text("🎯 کانال‌های مقصد", resize=True)],
[Button.text("🌐 وبسایت‌های مبدا", resize=True), Button.text("📂 دسته‌بندی‌ها", resize=True)],
[Button.text("🧠 تنظیمات AI", resize=True), Button.text("⚠️ خطاهای سیستم", resize=True)],
[Button.text("➕ افزودن مبدا / مقصد", resize=True), Button.text("📨 پست‌های بررسی‌نشده", resize=True)],
[Button.text("🔑 کد لاگین", resize=True), Button.text(pause_btn, resize=True)],
[Button.text("❓ راهنمای سیستم", resize=True)]
]
@@ -1267,7 +1269,7 @@ class AdminBotService:
def _register_handlers(self):
# --- Start / Menu ---
@self.client.on(events.NewMessage(pattern=r"(?i)^(/start|/menu|منو)$"))
@self.client.on(events.NewMessage(pattern=r"(?i)^(/start|/menu|منو|منوی اصلی|🏠 منوی اصلی)$"))
async def cmd_start(event: events.NewMessage.Event):
if not self.is_admin(event.sender_id):
await event.reply(f"⛔ دسترسی غیرمجاز. شناسه عددی شما: <code>{event.sender_id}</code>", parse_mode="html")
@@ -1290,7 +1292,7 @@ class AdminBotService:
await event.reply(welcome_text, parse_mode="html", buttons=menu)
# --- Statistics & Grafana Metrics Report ---
@self.client.on(events.NewMessage(pattern=r"(?i)^(/stats|/report|📊 آمار و وضعیت ناوگان|📊 گزارش و آمار سیستم)$"))
@self.client.on(events.NewMessage(pattern=r"(?i)^(/stats|/report|📊 آمار ناوگان|📊 آمار و وضعیت ناوگان|📊 گزارش و آمار سیستم)$"))
async def cmd_stats(event: events.NewMessage.Event):
if not self.is_admin(event.sender_id):
return
@@ -1309,16 +1311,24 @@ class AdminBotService:
# --- AI Settings & Logs ---
@self.client.on(events.NewMessage(pattern=r"(?i)^(/ai|🧠 تنظیمات و لاگ‌های AI)$"))
@self.client.on(events.NewMessage(pattern=r"(?i)^(/ai|🧠 تنظیمات AI|🧠 تنظیمات و لاگ‌های AI)$"))
async def cmd_ai(event: events.NewMessage.Event):
if not self.is_admin(event.sender_id):
return
text, buttons = await self._render_ai_menu()
await event.reply(text, parse_mode="html", buttons=buttons)
# --- System Errors ---
@self.client.on(events.NewMessage(pattern=r"(?i)^(/errors|/err|⚠️ خطاهای سیستم)$"))
async def cmd_errors(event: events.NewMessage.Event):
if not self.is_admin(event.sender_id):
return
text, buttons = await self._render_error_report()
await event.reply(text, parse_mode="html", buttons=buttons or None)
# --- Userbot Authentication ---
@self.client.on(events.NewMessage(pattern=r"(?i)^(/request_code|🔑 درخواست کد لاگین)$"))
@self.client.on(events.NewMessage(pattern=r"(?i)^(/request_code|🔑 کد لاگین|🔑 درخواست کد لاگین)$"))
async def cmd_request_code(event: events.NewMessage.Event):
if not self.is_admin(event.sender_id):
return
@@ -1377,7 +1387,7 @@ class AdminBotService:
await event.reply(text, parse_mode="html", buttons=buttons or None)
# --- Categories Management ---
@self.client.on(events.NewMessage(pattern=r"(?i)^(/categories|/cats|📂 دسته‌بندی کانال‌ها)$"))
@self.client.on(events.NewMessage(pattern=r"(?i)^(/categories|/cats|📂 دسته‌بندی‌ها|📂 دسته‌بندی کانال‌ها)$"))
async def cmd_categories(event: events.NewMessage.Event):
if not self.is_admin(event.sender_id):
return
@@ -1411,7 +1421,7 @@ class AdminBotService:
await event.reply(guide, parse_mode="html", buttons=get_cancel_button())
# --- Re-send unreviewed posts ---
@self.client.on(events.NewMessage(pattern=r"(?i)^(/pending|📨 ارسال پست‌های بررسی‌نشده)$"))
@self.client.on(events.NewMessage(pattern=r"(?i)^(/pending|📨 پست‌های بررسی‌نشده|📨 ارسال پست‌های بررسی‌نشده)$"))
async def cmd_pending(event: events.NewMessage.Event):
if not self.is_admin(event.sender_id):
return
@@ -1433,7 +1443,7 @@ class AdminBotService:
)
# --- System Pause / Emergency Stop & Resume ---
@self.client.on(events.NewMessage(pattern=r"(?i)^(/pause|/stop|🛑 توقف اضطراری سیستم)$"))
@self.client.on(events.NewMessage(pattern=r"(?i)^(/pause|/stop|🛑 توقف سیستم|🛑 توقف اضطراری سیستم)$"))
async def cmd_pause(event: events.NewMessage.Event):
if not self.is_admin(event.sender_id):
return
@@ -1443,12 +1453,12 @@ class AdminBotService:
"• ⏸ دریافت خودکار پست‌های جدید از کانال‌های مبدا متوقف شد.\n"
"• ⏸ ارسال زمان‌بندی‌شده پست‌ها به کانال‌های مقصد متوقف شد.\n"
"• 🟢 پنل مدیریت، دستورات و پیام‌های ادمین همچنان کاملاً فعال هستند.\n\n"
"<i>برای از سرگیری فعالیت سیستم، روی دکمه «▶️ راه‌اندازی و ادامه سیستم» بزنید.</i>"
"<i>برای از سرگیری فعالیت سیستم، روی دکمه «▶️ راه‌اندازی سیستم» بزنید.</i>"
)
menu = await self.get_menu()
await event.reply(text, parse_mode="html", buttons=menu)
@self.client.on(events.NewMessage(pattern=r"(?i)^(/resume|/start_fleet|▶️ راه‌اندازی و ادامه سیستم)$"))
@self.client.on(events.NewMessage(pattern=r"(?i)^(/resume|/start_fleet|▶️ راه‌اندازی سیستم|▶️ راه‌اندازی و ادامه سیستم)$"))
async def cmd_resume(event: events.NewMessage.Event):
if not self.is_admin(event.sender_id):
return
@@ -1572,15 +1582,19 @@ class AdminBotService:
text = (event.raw_text or "").strip()
# Ignore main menu commands
if text in ["/start", "/menu", "منو", "/stats", "📊 آمار و وضعیت ناوگان",
if text in ["/start", "/menu", "منو", "منوی اصلی", "🏠 منوی اصلی",
"/stats", "/report", "📊 آمار ناوگان", "📊 آمار و وضعیت ناوگان", "📊 گزارش و آمار سیستم",
"/sources", "📡 کانال‌های مبدا", "/targets", "🎯 کانال‌های مقصد",
"/request_code", "🔑 درخواست کد لاگین",
"/pending", "📨 ارسال پست‌های بررسی‌نشده",
"/errors", "⚠️ خطاهای سیستم",
"/ai", "🧠 تنظیمات و لاگ‌های AI",
"/categories", "/cats", "📂 دسته‌بندی کانال‌ها",
"/pause", "/stop", "🛑 توقف اضطراری سیستم",
"/resume", "/start_fleet", "▶️ راه‌اندازی و ادامه سیستم"]:
"/websites", "/sites", "🌐 وبسایت‌های مبدا",
"/request_code", "🔑 کد لاگین", "🔑 درخواست کد لاگین",
"/pending", "📨 پست‌های بررسی‌نشده", "📨 ارسال پست‌های بررسی‌نشده",
"/errors", "/err", "⚠️ خطاهای سیستم",
"/ai", "🧠 تنظیمات AI", "🧠 تنظیمات و لاگ‌های AI",
"/categories", "/cats", "📂 دسته‌بندی‌ها", "📂 دسته‌بندی کانال‌ها",
"/add", "➕ افزودن مبدا / مقصد", " افزودن کانال مبدا", " افزودن کانال مقصد",
"/pause", "/stop", "🛑 توقف سیستم", "🛑 توقف اضطراری سیستم",
"/resume", "/start_fleet", "▶️ راه‌اندازی سیستم", "▶️ راه‌اندازی و ادامه سیستم",
"/help", "❓ راهنمای سیستم"]:
return
# Cancel command
@@ -112,11 +112,11 @@ async def test_website_custom_needs_and_prompt_injection():
async def test_menu_layout():
menu = get_persian_main_menu(is_paused=False)
assert len(menu) == 5
assert len(menu) == 7
first_row_texts = [getattr(getattr(b, "button", None), "text", str(b)) for b in menu[0]]
assert any("🏠 منوی اصلی" in t for t in first_row_texts)
fourth_row_texts = [getattr(getattr(b, "button", None), "text", str(b)) for b in menu[3]]
assert any("➕ افزودن مبدا / مقصد" in t for t in fourth_row_texts)
fifth_row_texts = [getattr(getattr(b, "button", None), "text", str(b)) for b in menu[4]]
assert any("➕ افزودن مبدا / مقصد" in t for t in fifth_row_texts)
async def main():