🎡 توثيق نظام لعبة الروليت (Roulette Game)

يوفر هذا المستند دليلاً شاملاً لنظام لعبة الروليت، ويغطي نقاط نهاية API، وأحداث WebSocket، ومنطق الربط الداخلي.

محرك API:

PHP-FPM (Standard Laravel)

محرك WebSocket:

Swoole (Laravel Swoole)

جسر التواصل:

HTTP Bridge on 127.0.0.1:1215

المصادقة (Authentication):

تتطلب جميع طلبات الـ API إرسال Bearer Token في العناوين:

Authorization: Bearer {token}
Accept: application/json

1. تكامل الغرف (Room Integration)

يتم حقن بيانات لعبة الروليت النشطة داخل مورد الغرفة (Room Resource) القياسي.

GET /v1/rooms/{uid}
GET /v1/rooms/{uid}/join

الحقل المضاف:

active_roulette_game: يحتوي على كائن اللعبة أو null في حال عدم وجود لعبة نشطة.

2. التحكم في اللعبة (API Endpoints)

المسار الأساسي: /v1/rooms/{room_uid}/games/roulette

الإجراء الطريقة النقطة (Endpoint) الوصف
جلب اللعبة النشطة GET / إرجاع اللعبة الحالية في الغرفة.
إنشاء لعبة POST /create إنشاء لعبة جديدة (دعم join_admin=1 للانضمام التلقائي).
الانضمام للعبة POST /join/{id} انضمام لاعب للعبة موجودة.
مغادرة اللعبة POST /leave/{id} مغادرة اللاعب (استرداد الكوينز إذا كان ذلك ممكناً).
إنهاء اللعبة POST /finish/{id} تشغيل عجلة الحظ واختيار الفائز.
إلغاء اللعبة DELETE /{id} إلغاء اللعبة من قبل المنشئ.

💡 ملاحظة: جميع النقاط تدعم استخدام معرف الـ ID (الرقمي) أو الـ UID (النصي) بشكل تبادلي في البارامترات.

3. أحداث الويب سوكيت (One-To-Room)

يتم بث جميع الأحداث إلى قناة الغرفة: one-to-room:{room_uid}.

أ. إنشاء اللعبة (roulette-wheel-created)

{
  "id": 15,
  "game_price": 100,
  "prize": 200,
  "max_players": 2,
  "from": { "id": 58, "name": "...", "avatar": "...", "uid": "58" },
  "created_at": "2026-04-22 18:30:00"
}

ب. الانضمام (roulette-wheel-joined)

{
  "game_id": 15,
  "user": { "id": 123, "name": "...", "avatar": "..." }
}

ج. إنهاء اللعبة (roulette-wheel-finished)

يتم إرساله عند اختيار الفائز وتوزيع الجوائز.

{
  "game_id": 15,
  "winner": { "id": 58, "name": "...", "avatar": "..." },
  "prize": 200,
  "losers": [ { "id": 123, "name": "...", "avatar": "..." } ]
}

د. إلغاء اللعبة (roulette-wheel-destroyed)

{ "game_id": 15 }

4. أكواد الخطأ والرسائل (Error Codes)

  • Only game creator can destroy game: خطأ في الصلاحية عند محاولة الإلغاء.
  • Game is finished: محاولة الانضمام أو المغادرة من لعبة مكتملة.
  • You already joined this game: تكرار محاولة الانضمام.
  • Game is full: تم الوصول للحد الأقصى من اللاعبين.

5. أوامر الصيانة (Maintenance Commands)

لمسح الألعاب العالقة (التي لم تنتهِ) من خلال التيرمينال:

php artisan tinker --execute="App\Models\GameRouletteWheel::whereNull('finished_at')->delete()"