المرحلة الثانية: إدارة المستخدمين المتصلين باستخدام Presence Channel
مقدمة
بعد الانتهاء من إنشاء الاتصال مع خادم الوقت الحقيقي وتجهيز طبقة الاتصال داخل التطبيق، أصبحت المنصة قادرة على استقبال الأحداث وإرسالها بشكل لحظي. لكن ما زال ينقصنا عنصر أساسي في أي تطبيق دردشة حديث: معرفة المستخدمين المتصلين حالياً.
توفر HosteDay هذا النوع من الوظائف من خلال Presence Channels، وهي قنوات متخصصة تسمح بمعرفة أعضاء الغرفة المتصلين لحظياً، بالإضافة إلى تتبع عمليات الدخول والخروج بشكل مباشر.
في هذه المرحلة سنبني طبقة إدارة الحضور التي ستكون لاحقاً الأساس الذي نعتمد عليه لربط المستخدمين بالقنوات الخاصة وتبادل الرسائل بينهم.
ما هي Presence Channel؟
تعتبر Presence Channel امتداداً للقنوات الخاصة، حيث توفر جميع خصائص الحماية والمصادقة بالإضافة إلى إمكانية معرفة المستخدمين الموجودين داخل القناة.
عند اشتراك المستخدم في قناة حضور ناجحة يحصل التطبيق على:
- قائمة جميع المستخدمين الموجودين حالياً.
- إشعار عند دخول مستخدم جديد.
- إشعار عند مغادرة مستخدم.
- بيانات تعريفية لكل مستخدم داخل الغرفة.
وهذا ما يجعلها الخيار المثالي لبناء غرف الدردشة وقوائم المستخدمين المتصلين.
دور قناة الحضور في تطبيق الدردشة
في مشروعنا لن يتم استخدام Presence Channel لإرسال الرسائل.
وظيفتها الأساسية ستكون:
- معرفة من هو متصل حالياً.
- عرض قائمة الأعضاء النشطين.
- متابعة حالة الاتصال بشكل مباشر.
- تحديث الواجهة فور تغير عدد المستخدمين.
أما الرسائل نفسها فسيتم إرسالها لاحقاً عبر القنوات الخاصة.
بهذا الفصل بين المسؤوليات نحصل على نظام أكثر تنظيماً وأسهل في التوسع مستقبلاً.
تدفق عملية الحضور
عند دخول المستخدم إلى شاشة المحادثة تحدث الخطوات التالية:
User Opens Chat
│
▼
Connect To Realtime Server
│
▼
Authenticate User
│
▼
Join Presence Channel
│
▼
Receive Members List
│
▼
Listen For Join Events
│
▼
Listen For Leave Events
بمجرد اكتمال هذه الدورة يصبح التطبيق قادراً على متابعة جميع التغييرات داخل الغرفة بشكل فوري.
الاشتراك بقناة الحضور
داخل ChatController يتم طلب الاشتراك بقناة الحضور بعد نجاح الاتصال بالخادم.
يقوم RealtimeService بإنشاء الاشتراك والاحتفاظ بمرجع للقناة حتى يتمكن التطبيق من الاستماع للأحداث المختلفة المرتبطة بالحضور.
بعد نجاح الاشتراك يعيد الخادم معلومات المستخدمين الموجودين حالياً داخل القناة.
استلام قائمة المستخدمين
أول حدث مهم يتم استلامه هو قائمة الأعضاء الحالية.
تتضمن هذه البيانات عادة:
- معرف المستخدم.
- الاسم.
- البريد الإلكتروني أو البيانات التعريفية الأخرى.
- حالة الاتصال الحالية.
يقوم ChatController بحفظ هذه البيانات داخل متغيرات قابلة للمراقبة (Reactive State) ليتم تحديث واجهة المستخدم مباشرة.
التعامل مع المستخدمين الجدد
عندما ينضم مستخدم جديد إلى القناة يتم إرسال حدث انضمام لجميع المشتركين.
يقوم التطبيق عندها بالخطوات التالية:
- استقبال بيانات المستخدم.
- إضافته إلى القائمة المحلية.
- تحديث عدد الأعضاء.
- إعادة بناء واجهة المستخدم.
وبذلك يظهر العضو الجديد فوراً لدى جميع المستخدمين المتصلين.
التعامل مع مغادرة المستخدمين
عند خروج مستخدم من التطبيق أو انقطاع اتصاله بالخادم يتم إرسال حدث مغادرة.
يقوم التطبيق عندها:
- بتحديد المستخدم المغادر.
- حذف بياناته من القائمة.
- تحديث عدد الأعضاء النشطين.
- إعادة تحديث الواجهة.
هذه العملية تحدث تلقائياً دون الحاجة إلى أي تحديث يدوي للصفحة.
إدارة حالة المستخدمين داخل التطبيق
داخل ChatController يتم الاحتفاظ بقائمة المستخدمين المتصلين حالياً.
مثال منطقي للبيانات المخزنة:
[
{
"id": 1,
"name": "Ahmed"
},
{
"id": 2,
"name": "Ali"
},
{
"id": 3,
"name": "Mustafa"
}
]
تُستخدم هذه القائمة لعرض:
- عدد الأعضاء المتصلين.
- أسماء المستخدمين النشطين.
- حالة كل مستخدم داخل الغرفة.
تصميم واجهة المستخدم
تعتمد شاشة المحادثة في هذه المرحلة على عرض معلومات الحضور فقط.
يمكن أن تتضمن:
- عدد المستخدمين المتصلين.
- قائمة الأعضاء النشطين.
- مؤشر يوضح حالة الاتصال.
- تحديث فوري عند حدوث أي تغيير.
الهدف من هذه المرحلة هو توفير رؤية واضحة لحالة الغرفة قبل البدء بإرسال الرسائل.
لماذا فصل الحضور عن الرسائل؟
قد يبدو من الممكن استخدام Presence Channel لكل شيء، لكن هذا يؤدي إلى تعقيد غير ضروري مع توسع النظام.
لذلك تم اعتماد مبدأ فصل المسؤوليات:
| الوظيفة | نوع القناة |
|---|---|
| معرفة المستخدمين المتصلين | Presence Channel |
| تبادل الرسائل | Private Channel |
| تتبع الدخول والخروج | Presence Channel |
| استقبال الرسائل الجديدة | Private Channel |
هذا التصميم يجعل النظام أكثر مرونة وقابلية للتوسع مستقبلاً.
النتيجة النهائية للمرحلة الثانية
بعد إكمال هذه المرحلة أصبح التطبيق قادراً على:
- معرفة جميع المستخدمين الموجودين داخل الغرفة.
- استقبال إشعارات الانضمام.
- استقبال إشعارات المغادرة.
- تحديث الواجهة بشكل لحظي.
- إدارة حالة الحضور دون الحاجة إلى تحديث الصفحة.
أصبح لدينا الآن نظام حضور متكامل يعمل فوق البنية الأساسية التي أنشأناها في المرحلة الأولى.
ماذا سنبني في المرحلة القادمة؟
في المرحلة الثالثة سنقوم بدمج Presence Channel مع Private Channel لإنشاء نظام دردشة متكامل.
سنتعلم كيفية:
- إنشاء القنوات الخاصة للمحادثات.
- إرسال الرسائل بشكل آمن.
- استقبال الرسائل لحظياً.
- ربط الرسائل بالمستخدمين المتصلين.
- بناء تجربة دردشة كاملة تعتمد على الوقت الحقيقي.
وبذلك ننتقل من مجرد معرفة المستخدمين المتصلين إلى إنشاء نظام مراسلة فوري متكامل داخل HosteDay.