🎭 دليل دمج نظام الرجل الغامض (Flutter Mobile API)

هذا التوثيق مخصص حصرياً لمطوري **تطبيق Flutter**. يحتوي الدليل على المواصفات الكاملة للـ APIs الخاصة بالموبايل، ونماذج JSON للطلب والاستجابة، وأكواد Dart جاهزة للاستخدام التلقائي (Service + Models + UI Widget).

1. الفكرة العامة ومميزات النظام

نظام **الرجل الغامض** يمنح المستخدم إمكانية التخفي الكامل داخل التطبيق، حيث يتم استبدال اسمه وصورته وديكوراته بهوية غامضة وديكورات مخصصة، مع الحفاظ الكامل على بياناته وديكوراته الأصلية وإعادتها فور إلغاء التفعيل.

🎭 إخفاء الهوية الكامل

توليد اسم رمزي فريد بصيغة mysterious{user_id}{suffix} مع صورة بروفايل وبانر غامضين.

🛡️ حفظ الديكورات الأصلية

تشفير وحفظ الديكورات والحزمة الأرستقراطية الحالية للمستخدم قبل التفعيل، وإعادتها بلمسة واحدة.

💎 شراء وسحب آلي

خصم الديموند الموحد وسريان الاشتراكات بالأيام المحددة مع تنبيهات لحظية عبر السيرفر.

🖼️ 5 خيارت ديكور مخصصة

إطار صورة، دخولية غرفة، إطار دردشة، بانر، وخلفية بروفايل مخصصة حصرياً للرجل الغامض.

2. دورة حياة هوية المستخدم (Lifecycle)

1

الشراء (Purchase)

خصم الديموند، توليد الاسم الغامض، وإنشاء اشتراك بحالة غير نشطة (Inactive).

2

التفعيل (Activate)

حفظ الديكورات الأصلية، إيقاف الأرستقراطية، ارتداء ديكورات الغموض، ورفع `is_mysterious = true`.

3

إلغاء التفعيل (Deactivate)

إزالة ديكورات الغموض، استعادة الديكورات والأرستقراطية الأصلية، وإعادة `is_mysterious = false`.

4

الانتهاء (Expiration)

إلغاء التفعيل التلقائي وتحديث حالة الاشتراك إلى `expired` عبر السيرفر فور انتهاء المدة.

3. المصادقة والـ Base URL

الرابط الأساسي (Base URL):

https://api.megchat.cc/api/v1/mysterious-man

الـ Headers المطلوبة لجميع الطلبات المحمية:

Header Value الوصف
Accept application/json تحديد صيغة الاستجابة
Content-Type application/json تحديد صيغة الجسم المرفق
Authorization Bearer {USER_TOKEN} توكن مصادقة المستخدم (Sanctum/Passport)

4.1. جلب معلومات الباقة الحالية

GET /package Public (بدون مصادقة)

يُرجع تفاصيل الباقة النشطة للشراء (السعر، الأيام، الصور، والديكورات المخصصة لكل خانة).

{
  "success": true,
  "data": {
    "id": 1,
    "name": "الرجل الغامض",
    "description": "باقة إخفاء الهوية الكاملة والحصول على الديكورات الغامضة",
    "cover_image_url": "https://meg.nbg1.your-objectstorage.com/mysterious-man/cover.jpg",
    "profile_image_url": "https://meg.nbg1.your-objectstorage.com/mysterious-man/profile.jpg",
    "banner_image_url": "https://meg.nbg1.your-objectstorage.com/mysterious-man/banner.jpg",
    "currency_count": 3000000,
    "currency_type": "diamond",
    "valid_days": 30,
    "decorations": {
      "frame": { "id": 119, "name": "إطار الكنج", "image_path": "https://meg.nbg1.your-objectstorage.com/decorations/frame1.png", "type": "frame" },
      "entry_effect": { "id": 204, "name": "دخولية الأشباح", "image_path": "https://meg.nbg1.your-objectstorage.com/decorations/entry1.png", "type": "entering_effect" },
      "chat_frame": { "id": 305, "name": "فقاعة الغموض", "image_path": "https://meg.nbg1.your-objectstorage.com/decorations/bubble1.png", "type": "chat_box" },
      "banner": { "id": 401, "name": "بانر الظلال", "image_path": "https://meg.nbg1.your-objectstorage.com/decorations/banner1.png", "type": "effect" },
      "profile_page": { "id": 502, "name": "خلفية البروفايل الغامضة", "image_path": "https://meg.nbg1.your-objectstorage.com/decorations/bg1.png", "type": "room_background" }
    }
  }
}

4.2. الاستعلام عن حالة اشتراك المستخدم

GET /status Auth Required

معرفة هل يملك المستخدم اشتراكاً حالياً، وهل الهوية مفعّلة (`active`) أم متوقفة (`inactive`) مع الأيام المتبقية.

{
  "success": true,
  "data": {
    "has_subscription": true,
    "status": "active",
    "mysterious_name": "mysterious153589",
    "purchased_at": "2026-07-30 14:00:00",
    "expires_at": "2026-08-29 14:00:00",
    "activated_at": "2026-07-30 14:05:00",
    "deactivated_at": null,
    "days_remaining": 30,
    "package": {
      "id": 1,
      "name": "الرجل الغامض",
      "currency_count": 3000000,
      "valid_days": 30
    }
  }
}

4.3. شراء باقة الرجل الغامض

POST /purchase Auth Required

خصم رصيد الديموند الخاص بالمستخدم وتوليد اسم غامض فريد مع إنشاء اشتراك غير مفعّل.

{
  "success": true,
  "data": {
    "message": "تم الاشتراك في الرجل الغامض بنجاح! 🎭",
    "mysterious_name": "mysterious153589",
    "expires_at": "2026-08-29 14:00:00",
    "days_remaining": 30,
    "status": "inactive"
  }
}

4.4. تفعيل هوية الرجل الغامض

POST /activate Auth Required

بدء وضع التخفي: حفظ الديكورات الأصلية، ارتداء ديكورات الغموض، ورفع `is_mysterious = true`.

{
  "success": true,
  "data": {
    "message": "تم تفعيل هوية الرجل الغامض 🎭",
    "mysterious_name": "mysterious153589",
    "status": "active"
  }
}

4.5. إلغاء تفعيل هوية الرجل الغامض

POST /deactivate Auth Required

العودة للهوية الأصلية واستعادة كافة الديكورات الأرستقراطية المحفوظة فوراً.

{
  "success": true,
  "data": {
    "message": "تم إلغاء تفعيل هوية الرجل الغامض. عادت هويتك الأصلية ✅",
    "status": "inactive",
    "days_remaining": 29
  }
}

5. قواعد العرض داخل الغرف والمحادثات (Room UI Logic)

عند استقبال بيانات أي مستخدم في الصوتيات أو الميكروفونات أو رسائل الدردشة، يجب تطبيق التغييرات التالية في واجهة الموبايل بناءً على قيمة is_mysterious:

العنصر في التطبيق العرض العادي (is_mysterious = false) عرض الرجل الغامض (is_mysterious = true)
الاسم الظاهر اسم المستخدم الأصلي (e.g. أحمد) الاسم الرمزي mysterious_name (e.g. mysterious153589)
صورة البروفايل الصورة الشخصية الأصلية صورة الرجل الغامض المرفقة بالباقة profile_image_url
إطار الصورة (Frame) الإطار الأصلي إطار الرجل الغامض الخاضع للباقة
فقاعة الشات (Bubble) فقاعة الشات الأصلية فقاعة شات الرجل الغامض
دخولية الغرفة (Entry) تأثير الدخولية الأصلي دخولية الرجل الغامض الخاضعة للباقة

6. أكواد دمج Flutter المتكاملة (Dart Ready Code)

import 'package:dio/dio.dart';
import 'mysterious_man_models.dart';

class MysteriousManService {
  final Dio _dio = Dio(BaseOptions(
    baseUrl: 'https://api.megchat.cc/api/v1/mysterious-man',
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json',
    },
    connectTimeout: const Duration(seconds: 10),
    receiveTimeout: const Duration(seconds: 10),
  ));

  // 1. جلب تفاصيل الباقة (Public)
  Future getPackage() async {
    try {
      final response = await _dio.get('/package');
      if (response.data['success'] == true) {
        return MysteriousPackageModel.fromJson(response.data['data']);
      }
    } on DioException catch (e) {
      print('getPackage Error: ${e.response?.data}');
    }
    return null;
  }

  // 2. فحص حالة الاشتراك
  Future getStatus(String userToken) async {
    try {
      final response = await _dio.get(
        '/status',
        options: Options(headers: {'Authorization': 'Bearer $userToken'}),
      );
      if (response.data['success'] == true) {
        return MysteriousStatusModel.fromJson(response.data['data']);
      }
    } on DioException catch (e) {
      print('getStatus Error: ${e.response?.data}');
    }
    return null;
  }

  // 3. شراء الباقة
  Future> purchase(String userToken) async {
    try {
      final response = await _dio.post(
        '/purchase',
        options: Options(headers: {'Authorization': 'Bearer $userToken'}),
      );
      return {'success': true, 'message': response.data['data']['message']};
    } on DioException catch (e) {
      final msg = e.response?.data['message'] ?? 'فشلت عملية الشراء';
      return {'success': false, 'message': msg};
    }
  }

  // 4. تفعيل هوية الرجل الغامض
  Future> activate(String userToken) async {
    try {
      final response = await _dio.post(
        '/activate',
        options: Options(headers: {'Authorization': 'Bearer $userToken'}),
      );
      return {'success': true, 'message': response.data['data']['message']};
    } on DioException catch (e) {
      final msg = e.response?.data['message'] ?? 'فشل تفعيل الهوية';
      return {'success': false, 'message': msg};
    }
  }

  // 5. إلغاء تفعيل الهوية
  Future> deactivate(String userToken) async {
    try {
      final response = await _dio.post(
        '/deactivate',
        options: Options(headers: {'Authorization': 'Bearer $userToken'}),
      );
      return {'success': true, 'message': response.data['data']['message']};
    } on DioException catch (e) {
      final msg = e.response?.data['message'] ?? 'فشل إلغاء تفعيل الهوية';
      return {'success': false, 'message': msg};
    }
  }
}

7. محاكي الاستجابة (Interactive Response Sandbox)

اختر الـ Endpoint لتجربة الاستجابة المتوقعة مباشرة:

...