File size: 9,743 Bytes
036b534
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
# 📘 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 كامل.