📊 النظرة العامة والإحصاءات الحية
سيرفر Bunny نشط
بنك الأسئلة الإجمالي
0
الغرف النشطة حالياً
0
اتصالات الـ Sockets الحية
0
إجمالي اللاعبين المسجلين
0
توزيع الأسئلة حسب التصنيفات
إدارة أسئلة اللعبة
# السؤال التصنيف الصعوبة الخيارات نسب الجمهور إجراءات
جاري تحميل الأسئلة...
🤖 توليد دفعة أسئلة جديدة بالذكاء الاصطناعي

يتصل هذا المولد بـ OpenRouter ويقوم بإنشاء أسئلة عربية جاهزة مع 4 خيارات وتحديد الإجابة الصحيحة وحساب نسب استطلاع الجمهور وحفظها فورياً في بنك الأسئلة.

🎲 مراقبة الغرف الحية المفتوحة الآن
كود الغرفة النمط الحالة اللاعبين النتيجة الدور الحالي إجراءات
لا توجد غرف نشطة حالياً
⚙️ تخصيص إعدادات وقواعد اللعبة

📖 الدليل الشامل لتوثيق الـ APIs ومحرك الألعاب و Flutter

عنوان السيرفر الأساسي المعتمد: https://game-api.samehzidan.com

🌐 واجهات REST API Endpoints
JSON Response
GET /health فحص جاهزية الخادم وقاعدة البيانات
Response (200 OK): { "status": "healthy", "uptime": 624.12, "timestamp": "2026-10-25T22:15:00.000Z" }
GET /api/questions/random?count=5&category=general&difficulty=easy جلب أسئلة عشوائية للعبة
Response (200 OK): { "success": true, "count": 5, "data": [ { "id": 1, "category": "sports", "difficulty": "medium", "question": "ما هي الدولة الفائزة بكأس العالم 2022؟", "options": ["فرنسا", "الأرجنتين", "البرازيل", "كرواتيا"], "audienceStats": [12, 75, 8, 5] } ] }
GET /api/leaderboard?limit=10 قائمة المتصدرين وأعلى النقاط
Response (200 OK): { "success": true, "leaderboard": [ { "rank": 1, "playerName": "البطل", "score": 240, "wins": 18 }, { "rank": 2, "playerName": "المحارب", "score": 190, "wins": 14 } ] }
POST /admin/api/auth/login تسجيل دخول لوحة الإدارة واستخراج التوكن
Request Body (JSON): { "username": "admin", "password": "your_secure_password" } Response (200 OK): { "success": true, "token": "eyJhbGciOi...", "user": { "username": "admin", "role": "admin" } }
POST /api/questions/admin/create إضافة سؤال جديد (يتطلب Authorization Header)
Headers: Authorization: Bearer <ADMIN_TOKEN> Request Body (JSON): { "question": "ما هي عاصمة أستراليا؟", "options": ["سيدني", "ملبورن", "كانبيرا", "بيرث"], "correctOption": 2, "category": "geography", "difficulty": "medium", "audienceStats": [15, 10, 70, 5] }
POST /api/questions/admin/generate-ai توليد أسئلة تلقائية بنماذج الذكاء الاصطناعي
Headers: Authorization: Bearer <ADMIN_TOKEN> Request Body (JSON): { "topic": "تاريخ إسلامي", "count": 5, "difficulty": "medium" }
📱 كود ربط تطبيق Flutter عبر Socket.IO و WebRTC
import 'package:socket_io_client/socket_io_client.dart' as IO; class QuizArenaClient { late IO.Socket socket; final String serverUrl = 'https://game-api.samehzidan.com'; void connect({required String playerId, required String playerName}) { socket = IO.io(serverUrl, IO.OptionBuilder() .setTransports(['websocket']) // استخدام WebSocket المباشر .enableAutoConnect() .enableReconnection() .build()); socket.onConnect((_) { print('✅ متصل بسيرفر اللعبة بنجاح'); }); // 1. الاستماع لنتيجة إنشاء الغرفة socket.on('room_created', (data) { print('تم إنشاء الغرفة! الكود هو: ${data['roomCode']}'); }); // 2. الاستماع لدخول لاعب جديد socket.on('player_joined', (data) { print('انضم اللاعب: ${data['player']['name']} في فريق: ${data['player']['team']}'); }); // 3. رمي النرد لتحديد من يبدأ socket.on('dice_roll_start', (data) { print('🎲 رمي النرد: فريق A حصل على ${data['diceA']}، فريق B حصل على ${data['diceB']}'); print('الفريق البادئ: ${data['startingTeam']}'); }); // 4. استلام السؤال والمؤقت socket.on('new_question', (q) { print('سؤال جديد: ${q['question']} | الخيارات: ${q['options']}'); }); socket.on('timer_tick', (t) { print('الوقت المتبقي: ${t['timeLeft']} ثانية'); }); // 5. استلام نتيجة الإجابة وتبادل الدور socket.on('answer_result', (res) { print('النتيجة: ${res['isCorrect'] ? 'صح 🎉' : 'خطأ ❌'} | النقاط: ${res['scores']}'); }); socket.on('turn_change', (turn) { print('الدور الحالي للفريق: ${turn['currentTeam']}'); }); // 6. وسائل المساعدة socket.on('audience_stats_result', (stats) { print('نسب اختيارات الجمهور: ${stats['percentages']}'); }); socket.on('ai_hint_result', (hint) { print('🤖 تلميح الذكاء الاصطناعي: ${hint['hint']}'); }); // 7. انتهاء اللعبة socket.on('game_over', (summary) { print('انتهت المباراة! الفائز: ${summary['winnerTeam']}'); }); } // دوال الإرسال (Client -> Server) void createRoom({required String name, required String id, String mode = '1v1'}) { socket.emit('create_room', { 'playerName': name, 'playerId': id, 'mode': mode, // '1v1' أو '2v2' 'durationSeconds': 120 }); } void joinRoom({required String roomCode, required String name, required String id, String? team}) { socket.emit('join_room', { 'roomCode': roomCode.toUpperCase(), 'playerName': name, 'playerId': id, 'team': team // 'team_a' أو 'team_b' (اختياري، يوزع تلقائياً) }); } void submitAnswer({required String roomCode, required int selectedIndex}) { socket.emit('submit_answer', { 'roomCode': roomCode, 'selectedOptionIndex': selectedIndex }); } void useTimeBoost(String roomCode) => socket.emit('use_time_boost', {'roomCode': roomCode}); void useAudiencePoll(String roomCode) => socket.emit('use_audience_stats', {'roomCode': roomCode}); void useAiHint(String roomCode) => socket.emit('use_ai_hint', {'roomCode': roomCode}); }
🗂️ هيكل الملفات المعماري وتقسيم الأدوار البرمجية (Clean Architecture)

تم بناء المشروع وفق معايير Modular Architecture بحيث تكون كل وحدة مستقلة بذاتها وتسهل الصيانة والتوسع:

src/app.js

نواة السيرفر الرئيسية؛ تدمج Express مع خادم HTTP و Socket.IO، وتطبق طبقات الحماية (Helmet, CORS, Rate Limiters) وتمرر المسارات وتهيئة قاعدة البيانات.

src/modules/game/game.socket.js

محرك اللعبة اللحظي بالكامل: يدير رمي النرد العادل، مؤقت الـ 10 ثوانٍ اللحظي، تدفق الأسئلة، تبادل الأدوار عند الخطأ أو انتهاء الوقت، وسائل المساعدة الثلاث، وإشارات WebRTC الصوتية P2P.

src/modules/rooms/room.service.js

إدارة الغرف وأنماطها (1 ضد 1 أو 2 ضد 2)، توليد كود الغرفة الفريد، التحقق من عدد اللاعبين في كل فريق، وإعادة تعيين المضيف (Host) في حال خروج المنشئ.

src/modules/questions/

تحتوي على Repository للاستعلامات السريعة، و Controller لإدارة الأسئلة، و ai-generator.service.js للتواصل مع OpenRouter وتوليد حزم الأسئلة آلياً.

src/config/database.js

إعداد محرك SQLite فائق السرعة بوضع WAL Mode وفهارس مفعلة (Indexes) على الأعمدة الأكثر استعلاماً لحماية وتوفير أعلى أداء للـ Concurrency على Bunny Containers.

src/modules/admin/

واجهات لوحة التحكم ومسارات المصادقة الآمنة auth.controller.js بتشفير PBKDF2 والتوكن، مع تحكم كامل بالإعدادات ومراقبة الغرف الحية.

🔒 تحديث بيانات حساب المدير