BUNNY BOT — نظام التحديث التلقائي الموقّع

رابط manifest الافتراضي
======================
https://updates.hasanmdaraty.cc/BUNNY-BOT/manifest.json

الحماية
=======
- يتحقق البرنامج من توقيع Ed25519 قبل قبول manifest.json.
- يتحقق من SHA-256 وحجم ملف ZIP بعد التنزيل.
- يسمح بـ HTTPS فقط، مع localhost HTTP للاختبار المحلي.
- يرفض التحويل إلى رابط غير HTTPS.
- يحمي config.json والترخيص والحسابات والسجلات والاستراتيجيات الشخصية.
- ينشئ نسخة احتياطية ويسترجع الملفات تلقائياً عند فشل التثبيت.
- يحذف الملفات القديمة المُدارة التي لم تعد موجودة في الإصدار الجديد.

إصلاح Cloudflare R2 وHTTP 404
============================
- يضيف طلب manifest قيمة Cache-Busting قصيرة لتجاوز نسخة CDN قديمة بعد استبدال الملف.
- يرسل Cache-Control وPragma لمنع استخدام manifest قديم.
- يعطي رسالة واضحة عند غياب BUNNY-BOT/manifest.json بدلاً من خطأ اتصال عام.
- يجب رفع ملف ZIP أولاً وmanifest.json أخيراً.

فحص الخادم
==========
من جذر المشروع شغّل:

py -3 tools\verify_update_server.py

يفحص:
- وصول HTTP/HTTPS.
- صحة JSON والحقول الأساسية.
- توقيع Ed25519 بالمفتاح العام الموزع مع البرنامج.
- رابط ملف ZIP وحجمه عند دعم HEAD.

إزالة 404 مؤقتاً بأمان
======================
استخدم حزمة BUNNY_BOT_R2_MAINTENANCE_DEPLOY.zip، ثم ارفع إلى Bucket fastdl:

1) BUNNY-BOT/BUNNY_BOT_NO_UPDATE.zip
2) BUNNY-BOT/manifest.json  ← يرفع أخيراً

manifest الصيانة يحمل version=0.0.0، لذلك لا يعرض تحديثاً لأي نسخة حالية.
يستبدل لاحقاً بmanifest الإصدار الحقيقي بعد بناء نسخة المستخدم المجمعة.

أداة المالك
===========
المفتاح الموجود في assets/update_public_key.bin عام وآمن للتوزيع.
المفتاح الخاص يجب أن يبقى فقط داخل BUNNY_BOT_UPDATE_PUBLISHER_OWNER، ولا يوضع داخل المشروع أو نسخة المستخدم أو ملفات السجل.

رقعة BUNNY_BOT_UPDATE_PUBLISHER_R2_UPLOAD_FIX.zip تضيف أداة رفع إلى R2:
- تتحقق محلياً من التوقيع والحجم والبصمة.
- ترفع ZIP أولاً ثم manifest أخيراً.
- تتحقق من الرابط العام بعد الرفع.
- لا تحفظ بيانات R2 داخل الملفات أو السجل.
