# 📘 Games In Arabic Bot — توثيق المشروع ## نظرة عامة بوت تيليجرام متكامل باللغة العربية يخدم عالم الألعاب: - 🔍 مكتبة تعريبات قابلة للبحث - 🎮 مواصفات فنية من IGDB - 🖥 متطلبات تشغيل PC من Steam - 🖼 خلفيات عالية الجودة من Wallhaven - 🔔 نظام إشعارات للمشتركين - 📡 فهرسة تلقائية لمنشورات القناة --- ## هيكل المشروع ``` bot_v4/ │ ├── main.py # نقطة الدخول — إعداد وتشغيل البوت ├── config.py # كل الإعدادات من .env ├── requirements.txt ├── .env.example # قالب متغيرات البيئة │ ├── database/ │ ├── __init__.py # تصدير الواجهة العامة │ ├── connection.py # اتصال SQLite مع PRAGMA │ ├── migrations.py # إنشاء الجداول والفهارس والـ Triggers │ ├── messages.py # CRUD الرسائل المفهرسة │ ├── users.py # CRUD المستخدمين، الاشتراكات، الإذاعات │ └── settings.py # get/set إعدادات ديناميكية │ ├── handlers/ │ ├── __init__.py │ ├── start.py # /start، /myid، الواجهة الرئيسية │ ├── search.py # البحث والتصنيفات │ ├── specs.py # مواصفات فنية (IGDB) + تشغيل (Steam) │ ├── wallpapers.py # خلفيات Wallhaven │ ├── notifications.py # زر التنبيهات الديناميكي │ ├── inline.py # Inline Mode (@bot اسم_اللعبة) │ ├── admin.py # لوحة الإدارة، فهرسة القناة، إشعار عضو جديد │ └── callbacks.py # Router المركزي لكل Callbacks والرسائل │ ├── services/ │ ├── __init__.py │ ├── igdb.py # IGDB API (OAuth2 + بحث + تفاصيل كاملة) │ ├── steam.py # Steam API (PC Specs) │ ├── wallhaven.py # Wallhaven API (خلفيات) │ ├── indexer.py # محرك الفهرسة │ ├── searcher.py # محرك البحث متعدد المراحل │ └── broadcaster.py # نظام الإذاعة والإشعارات │ ├── utils/ │ ├── __init__.py │ ├── html.py # تنسيق HTML لتيليجرام (esc, b, blockquote...) │ ├── arabic.py # توحيد النص العربي وتحليله │ ├── genres.py # قاموس 60+ نوع لعبة (EN→AR) │ ├── buttons.py # بناء أزرار النتائج والتنقل │ ├── links.py # بناء روابط تيليجرام │ └── guards.py # is_admin، @admin_only، @register_user │ └── logs/ ├── bot.log # كل الأحداث (5MB × 3 نسخ) └── errors.log # الأخطاء فقط (2MB × 5 نسخ) ``` --- ## قواعد البيانات (SQLite) ### جدول messages — الرسائل المفهرسة | العمود | النوع | الوصف | |--------|-------|-------| | id | INTEGER PK | معرف تلقائي | | message_id | INTEGER | معرف المنشور في القناة | | channel_id | INTEGER | معرف القناة | | channel_name | TEXT | اسم القناة | | channel_username | TEXT | يوزرنيم القناة | | message_text | TEXT | نص المنشور الكامل | | text_normalized | TEXT | النص موحد (للبحث) | | message_date | TEXT | تاريخ المنشور | | hashtags | TEXT | الهاشتاقات مفصولة بفاصلة | | platform | TEXT | pc / ps / general | | has_media | INTEGER | 0 أو 1 | | media_type | TEXT | photo/video/document | | indexed_at | TEXT | وقت الفهرسة | ### جدول messages_fts — فهرس البحث الكامل FTS5 Virtual table متزامنة تلقائياً مع messages عبر Triggers. ### جدول users — المستخدمون | العمود | النوع | الوصف | |--------|-------|-------| | user_id | INTEGER PK | معرف تيليجرام | | username | TEXT | يوزرنيم | | first_name | TEXT | الاسم | | joined_at | TEXT | تاريخ أول /start | | is_banned | INTEGER | 0=نشط، 1=محظور | ### جدول notification_subscribers — المشتركون في التنبيهات | العمود | النوع | الوصف | |--------|-------|-------| | user_id | INTEGER PK FK | معرف المستخدم | | platform | TEXT | all/pc/ps | | subscribed_at | TEXT | تاريخ الاشتراك | ### جدول broadcasts — سجل الإذاعات | العمود | النوع | الوصف | |--------|-------|-------| | id | INTEGER PK | معرف تلقائي | | admin_id | INTEGER | معرف المشرف | | message_text | TEXT | نص الإذاعة (500 حرف) | | broadcast_type | TEXT | new_post/update/manual | | game_title | TEXT | اسم اللعبة | | game_link | TEXT | رابط التعريب | | sent_count | INTEGER | أُرسلت | | failed_count | INTEGER | فشلت | | blocked_count | INTEGER | حظروا البوت | | sent_at | TEXT | وقت الإرسال | ### جدول settings — الإعدادات الديناميكية | المفتاح | القيمة الافتراضية | الوصف | |---------|------------------|-------| | channel_text | نص افتراضي | نص صفحة القناة | | auto_notify | "1" | إشعار تلقائي عند الفهرسة | | auto_channel_index | "notify_only" | وضع مراقبة القناة | --- ## واجهات API الخارجية ### IGDB (Twitch) - **التوثيق:** OAuth2 Client Credentials - **الرابط:** `https://api.igdb.com/v4/games` - **لغة الاستعلام:** Apicalypse - **البيانات:** اسم، غلاف، تاريخ، مطور، ناشر، منصات، تقييمات، تصنيف عمري، لغات، أنواع، ثيمات، فيديوهات، موقع Steam - **Cache Token:** في الذاكرة مع asyncio.Lock لتجنب race conditions ### Steam - **AppDetails:** `https://store.steampowered.com/api/appdetails` - **Search:** `https://store.steampowered.com/api/storesearch` - **البيانات:** متطلبات PC (minimum/recommended) كـ HTML يُحلَّل بـ regex - **تحذير:** pc_requirements قد يكون list فارغة، dict، أو None ### Wallhaven - **البحث:** `https://wallhaven.cc/api/v1/search` - **التفاصيل:** `https://wallhaven.cc/api/v1/w/{id}` - **API Key:** اختياري (بدونه SFW فقط) - **الفلتر:** `atleast=1920x1080` لضمان جودة 1080p+ --- ## نظام البحث (4 مراحل) ``` المرحلة 1: FTS5 مباشر (مطابقة تامة للعبارة) ↓ إذا < min_results المرحلة 2: FTS5 بالنص الموحد (بدون تشكيل/همزات) ↓ إذا < min_results المرحلة 3: FTS5 بالبادئة ("كلم"* يطابق "كلمة") ↓ إذا < min_results المرحلة 4: ضبابي Levenshtein (SequenceMatcher ≥ 0.5) ``` --- ## نظام الإذاعة **الحد:** 25 رسالة/دفعة، انتظار 1 ثانية بين الدفعات. **معالجة الأخطاء:** - `RetryAfter (429)`: انتظار `retry_after` ثم إعادة المحاولة (حتى 3 مرات) - `Forbidden/BadRequest`: المستخدم حظر البوت → يُحذف من قائمة المشتركين - `TimedOut/NetworkError`: Exponential backoff (2ث، 4ث، 8ث) --- ## متغيرات البيئة (.env) | المتغير | إجباري | الوصف | |---------|--------|-------| | BOT_TOKEN | ✅ | توكن البوت من @BotFather | | IGDB_CLIENT_ID | ✅ | من dev.twitch.tv | | IGDB_CLIENT_SECRET | ✅ | من dev.twitch.tv | | CHANNEL_ID | ✅ | معرف القناة (مثال: -1001234567890) | | CHANNEL_USERNAME | ❌ | يوزرنيم القناة بدون @ | | WALLHAVEN_API_KEY | ❌ | من wallhaven.cc/settings | --- ## التشغيل ```bash # 1. تثبيت المكتبات pip install -r requirements.txt # 2. إنشاء .env من القالب cp .env.example .env # عدّل .env بالقيم الحقيقية # 3. تشغيل البوت python main.py ``` --- ## أوامر البوت ### عامة (للجميع) | الأمر | الوظيفة | |-------|---------| | /start | القائمة الرئيسية | | /myid | معلومات الحساب | ### الإدارة (للمشرفين فقط) | الأمر | الوظيفة | |-------|---------| | /pc | فهرسة ألعاب PC | | /ps | فهرسة ألعاب PS | | /general | فهرسة عامة | | /stop | إنهاء جلسة الفهرسة | | /undo | حذف آخر منشور | | /status | حالة الجلسة والإحصائيات | | /admin | لوحة التحكم | | /setch نص | تعديل نص صفحة القناة | --- ## إضافة مشرف جديد في `config.py`: ```python ADMIN_IDS: list[int] = [7299579109, ID_الجديد] ``` --- ## السجلات (Logs) ``` logs/bot.log — كل الأحداث INFO+ (5MB × 3 نسخ احتياطية) logs/errors.log — الأخطاء ERROR+ (2MB × 5 نسخ احتياطية) ``` كل خطأ يُسجل: الوقت، user_id، الأمر أو callback، traceback كامل.