From a554af27c89ac27043462366d569f67b00fe3dd5 Mon Sep 17 00:00:00 2001 From: mamad Date: Fri, 28 Aug 2026 23:33:55 +0330 Subject: [PATCH] chore: remove RELEASE_NOTES.md and generate change notes dynamically --- RELEASE_NOTES.md | 21 --------------------- main.py | 4 ---- services/admin_bot.py | 42 +++++++++++++----------------------------- 3 files changed, 13 insertions(+), 54 deletions(-) delete mode 100644 RELEASE_NOTES.md diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md deleted file mode 100644 index 73c8b9a..0000000 --- a/RELEASE_NOTES.md +++ /dev/null @@ -1,21 +0,0 @@ -📢 گزارش تغییرات و قابلیت‌های جدید سیستم (Release Notes): - -👤 ویرایش‌کننده: mamad - -🔹 سازمان‌دهی منوی مدیریت در ۵ هاب تخصصی (Copy, AI, Bots, System, Monitor): -• تجمیع و ساختاردهی کامل امکانات ربات در ۵ دسته‌بندی استاندارد: - - 📋 کپی و محتوا (Copy Hub): ارسال پست‌های بررسی‌نشده، هاب افزودن منبع/مقصد و دسته‌بندی موضوعی کانال‌ها. - - 🧠 هوش مصنوعی (AI Hub): مدیریت ارائه‌دهنده‌ها و مدل‌ها، زنجیره پشتیبان خودکار (Fallback)، پردازش تصویر (Vision) و تست آنلاین. - - 🤖 کانال‌ها و ربات‌ها (Bots Hub): مدیریت کانال‌های مبدا، کانال‌های مقصد، وبسایت‌های مبدا و لاگین یوزربات. - - ⚙️ کنترل سیستم (System Hub): توقف اضطراری ناوگان، راه‌اندازی مجدد، گزارش تغییرات و راهنمای جامع. - - 📊 مانیتورینگ و آمار (Monitor Hub): گزارش لحظه‌ای صف‌ها و کانال‌ها، بررسی و رفع خطاهای ثبت‌شده سیستم و نمودارهای آماری. -📁 فایل‌های تغییریافته: services/admin_bot.py, tests/test_target_context_and_website_custom_needs.py, tests/test_fallback_and_stop.py - -🔹 اصلاح و ثبت کامل رویدادها و بهینه‌سازی چینش کیبورد: -• ثبت هندلر اختصاصی ⚠️ خطاهای سیستم و اصلاح الگوهای Regex جهت پاسخگویی آنی به تمام دکمه‌ها و دستورات. -• بهینه‌سازی چینش کیبورد در دو ستون متقارن و کوتاه کردن برچسب‌ها جهت نمایش بی‌نقص و بدون شکستگی در موبایل و دسکتاپ. -📁 فایل‌های تغییریافته: services/admin_bot.py - -🔹 رفع خطای 500 در پردازش تصویر ارائه‌دهنده داخلی هوش مصنوعی (AGY Bridge): -• رفع خطای ناسازگاری ساختار ورودی‌های چندوجهی (Multimodal Image Payloads) و اطمینان از دریافت پاسخ موفق در بازنویسی پست‌های دارای تصویر. -📁 فایل‌های تغییریافته: agy_bridge.py, core/llm.py diff --git a/main.py b/main.py index fb396ff..571c9da 100644 --- a/main.py +++ b/main.py @@ -84,10 +84,6 @@ async def main(): await publisher.start() logger.info("All Copykar services are active and running.") - try: - await admin_bot.broadcast_change_notes() - except Exception as e: - logger.debug(f"Could not broadcast change notes on startup: {e}") # Graceful shutdown event stop_event = asyncio.Event() diff --git a/services/admin_bot.py b/services/admin_bot.py index 773222e..52f9789 100644 --- a/services/admin_bot.py +++ b/services/admin_bot.py @@ -1601,38 +1601,22 @@ class AdminBotService: await event.reply(help_text, parse_mode="html", buttons=menu) def get_latest_change_notes(self) -> str: - """Return the formatted change notes in Persian from RELEASE_NOTES.md.""" - notes_file = os.path.join(os.path.dirname(os.path.dirname(__file__)), "RELEASE_NOTES.md") - if os.path.exists(notes_file): - try: - with open(notes_file, "r", encoding="utf-8") as f: - content = f.read().strip() - if content: - return content - except Exception as e: - logger.debug(f"Error reading RELEASE_NOTES.md: {e}") + """Return the formatted change notes dynamically from the latest git commit.""" + try: + res = subprocess.run( + ["git", "log", "-1", "--pretty=format:🔹 %s%n%b"], + cwd=os.path.dirname(os.path.dirname(__file__)), + capture_output=True, + text=True, + timeout=5 + ) + if res.returncode == 0 and res.stdout.strip(): + return f"📢 آخرین تغییرات سیستم (Release Notes):\n\n{res.stdout.strip()}" + except Exception as e: + logger.debug(f"Error reading git log for change notes: {e}") return "📢 گزارش تغییرات سیستم (Release Notes):\nسیستم با آخرین به‌روزرسانی‌ها در حال اجرا است." - async def broadcast_change_notes(self): - """Send latest change notes to admins and review channel if they are new.""" - import hashlib - notes = self.get_latest_change_notes() - current_hash = hashlib.sha256(notes.encode("utf-8")).hexdigest() - last_hash = await self.repo.get_setting("last_broadcast_release_hash") - - if last_hash == current_hash: - logger.info("Release notes have not changed since last broadcast. Skipping automatic broadcast.") - return - - logger.info(f"Broadcasting new release notes directly to admin DMs (hash: {current_hash[:8]})...") - await self.notify_admins(notes, include_review_channel=False) - await self.repo.set_setting( - "last_broadcast_release_hash", - current_hash, - description="Hash of last broadcast release notes" - ) - # --- Step-by-Step Parameter & Text Input Message Handler --- @self.client.on(events.NewMessage)