مشكلة في إشعارات الدردشة لا تظهر

لقد بدأت ألقي نظرة على هذا الكود، ولكني أشعر أن هناك مشكلة كبيرة تتعلق بـ “التوقعات”

  • هل يتعلق هذا بإشعارات الدفع (Push Notifications)؟ (إذا كان كذلك، فهل تستخدم PWA أم تطبيق Discourse Hub؟)
  • عندما يقول الناس “لم يتم إعلامي”، فهل يقصدون “لم يتم إعلامي بالإشارات (@mention) في إشعار دفع”؟
  • هل التوقع هو أن يتم إعلامك بالإشارة (@mention) عبر إشعار دفع عندما تكون متصلاً بالإنترنت بالفعل؟

هناك عائلة كبيرة مما أعتبره مشاكل معروفة يمكننا تحسينها.

  1. في PWA، إذا حاولنا الإرسال 3 مرات خلال 24 ساعة وفشلنا (بسبب الاتصال بموزع الرسائل أو أي شيء آخر)، فسنقوم بإنهاء الاشتراكات ولن ننبه المستخدم بأي شيء.
  2. في Hub، إشعارات الدفع متاحة فقط للعملاء المستضافين على Discourse.
  3. هناك بعض مشاكل التسلسل حيث يمكن أن تضيع إشعار عند تعديل رسالة الدردشة لأننا نطلق إشعار دفع من داخل معاملة (transaction).
  4. لدينا “تخفيف” (Debounce) لمدة دقيقة واحدة يمكن تكوينه، ولكنه مربك. لقد تم ذكري للتو ولم أتلق إشعار دفع. نافذة وقت إشعار الدفع. هذا تسبب في: @mention، ثم زرت التطبيق في غضون 60 ثانية. لا يوجد @mention.
  5. إذا قمت بالإشارة (@mention) إلى مستخدم في قناة لا يتابعها، فلن يتلقى الإشارة. (حسب التصميم)

لأكون صادقًا @lindsey / @j.jaffeux / @pmusaraj، أشعر أن “الجهر بالرأي” قد يؤدي إلى إزالة الغالبية العظمى من المشاكل التي يواجهها الناس والشكاوى التي رأيناها على مر السنين بخصوص إشعارات الدردشة.

  • أرسل دائمًا إشعارات @mention فورًا (الإعداد الافتراضي للموقع)؛ يمكن للمواقع التي تريد تأخيرًا تكوينه.

  • أرسل دائمًا إشعارات @mention من جميع القنوات، واستبعد فقط القنوات التي يكتمها المستخدمون صراحةً (أو ليس لديهم إذن برؤيتها)، وهذا يتماشى مع السلوك الموجود في المنتدى.

  • هناك شيء غريب في update_message.rb يقوم بنشر رسالة داخل معاملة. (في البيئات متعددة الخيوط يمكن أن تضيع هذه الرسالة)

  • إذا قمنا بإنهاء اشتراك في PWA، اعرض لافتة (banner) في PWA تقول - إشعارات الدفع غير مهيأة، هل تريد تهيئتها؟ ربما لا تقم بإنهاء الاشتراك إلا بعد أسبوع / أسبوعين بدلاً من يوم واحد.

  • يتم إزالة تكرار علامات الدفع (Push tags) لكل قناة، hostname-chat-mention-general … هذا ليس مثاليًا للإشارات لأننا ندمج لكل قناة وقد يكون مربكًا إذا أشار 4 أشخاص مختلفون إليك في أوقات مختلفة في القناة.

  • أرسل دائمًا الإشعارات حتى لو كان المستخدم متصلاً بالإنترنت (افتراضيًا) - اسمح للمستخدمين بتجاوز هذا السلوك إذا رغبوا في ذلك.

  • إضافة رائعة لكل هذا هي دعم إشعارات الدفع من الدرجة الأولى على جميع المواقع للأشخاص الذين لديهم معرف Discourse (عبر معرف Discourse) - سيمنح هذا Hub شعورًا متسقًا عبر كل شيء.

  • بشكل أساسي، تخلص من الكثير من منطق “عفوًا، لم يكن ينبغي أن نرسل لك إشعارًا” بشكل افتراضي.


تم إيقاف التشغيل بالكامل عند ترقية Discourse، بالنسبة للمستضافين ذاتيًا، يمكن أن يكون بالتأكيد بسبب مشاكل الاتصال ببوابة الدفع. ربما تستغرق الترقيات على بعض الخوادم أيامًا، وربما تكون شبكة داخلية لمدة 24 ساعة لسبب ما.


الكود ذو الصلة (عبر Gemini 3 pro)

إنهاء اشتراكات PWA

يوجد المنطق الذي ينهي الاشتراكات بعد 3 إخفاقات في 24 ساعة في الطريقة handle_generic_error.

تخفيف إشعار الدفع / التحقق من الاتصال

المنطق الذي يتحقق مما إذا كان المستخدم متصلاً بالإنترنت (“تخفيف”) ويتخطى إشعار الدفع موجود مركزيًا هنا. يعتمد هذا على SiteSetting.push_notification_time_window_mins.

الدردشة: مشاكل تسلسل المعاملات

تغلف خدمة UpdateMessage خطوة publish داخل معاملة قاعدة بيانات. يمكن أن يسبب هذا شروط سباق حيث تحاول وظيفة الإشعار قراءة الرسالة قبل التزام المعاملة.

الدردشة: الإشارات في القنوات غير المتابعة

يقوم الكود صراحةً بتصفية following: true عند معالجة الإشارات للقنوات العامة، مما يمنع الإشعارات للمستخدمين الذين لا يتابعون القناة.

الدردشة: علامات إشعار الدفع

يتم تعريف منطق إنشاء العلامات الذي يزيل التكرار في الإشعارات لكل قناة (ويقوم بدمجها) هنا:

4 إعجابات