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)