رد فعل في ندوة

لقد فتحت طلبًا جديدًا Support multiple-reactions per post (Retort style) بخصوص ردود فعل متعددة لكل منشور، نظرًا لأن الرابط الآخر مخصص فقط لتقديم المزيد من خيارات ردود الفعل لرد الفعل الوحيد الذي تسمح به ردود فعل Discourse.

3 إعجابات

ملحق Retort ليس ملحقًا # رسميًا لذلك ليس لدينا أي رأي في متى يتوقف عن التطوير والصيانة النشطة من قبل المجتمع. :man_shrugging: أفضل ما يمكننا فعله هو محاولة إبقاء الناس على اطلاع حيثما أمكن حتى يكون لديهم بعض الوقت للعثور على بديل (أو على الأقل إعطاء أعضائهم تنبيهًا لمحاولة تخفيف خيبة الأمل).

نأمل أن يتم اعتماد هذين الطلبين Feature في الملحق reactions في مرحلة ما، ولكنهما لا يزالان في مرحلة “الأفكار الجيدة”. لكنني متفائل. :crossed_fingers:

3 إعجابات

أتفهم وجهة نظرك. الحقيقة هي أنني أنا وجيمس لم يكن لدينا الوقت الكافي لدعم Retort بشكل صحيح منذ فترة. ستلاحظ أن آخر تثبيت في المستودع يعود إلى أكثر من عام (بواسطتي في 21 يوليو 2021). من الرائع أن المكون الإضافي استمر في العمل بهذه المدة وهو شهادة على جودة العمل الذي قام به جيمس في بنائه.

عندما أقول إنني لا أملك الوقت، صدقني، أتمنى لو كان لدي! أشعر بالحزن في كل مرة أضطر فيها لاتخاذ أحد هذه القرارات (مثل مكون الصفحات المقصودة). لم أبني Retort، لكنني استثمرت فيه وقتًا. عندما تقرر إيقاف شيء ما، فهذا يشبه قبول أن شيئًا قمت بإنشائه أو أحببته، وقضيت ساعات وأيام وأسابيع من حياتك معه، يجب أن يموت. أعرف أنه كان قرارًا صعبًا على جيمس عندما شعر أنه يجب عليه الانتقال إلى أشياء أخرى.

على النقيض من ذلك، يتم صيانة مكون التفاعلات بواسطة Discourse.org، وهي منظمة تضم أكثر من 60 شخصًا، بشكل نشط. يتم استخدامه على عدد من الخوادم التي يستخدمها عملاء Discourse.org. نعم، لا يمتلك نفس ميزات Retort حتى الآن، لكنني أحثك على متابعة تطوير هذه الميزة كمسار. ربما يمكنك إقناع شخص مثلي، أو عضو آخر في Pavilion، بتقديم طلب سحب لميزة مفقودة في المكون الإضافي. سيكون هذا مسارًا ذكيًا لتحقيق أهدافك طويلة المدى هنا.

7 إعجابات

هناك دائمًا Marketplace إذا كنت ترغب في دفع مطور لإعادته إلى الحياة في هذه الأثناء. ولكن قد ينتهي بك الأمر إلى القيام بذلك عدة مرات أو الاتفاق على عقد صيانة.

إعجابَين (2)

أعتقد أن الإجابة هي لا؟ أود الانتقال إلى ردود الفعل ومحاولة العثور على الرموز الشائعة…

إعجاب واحد (1)

أتخيل أنه سيكون ممكنًا حيث سيتم تخزينها في قاعدة البيانات في مكان ما. للأسف، ليس لدي هذه الإضافة مثبتة على موقع الاختبار الخاص بي للتحقق من التفاصيل. هل هناك جدول discourse-retort-retorts أو ما شابه؟

إعجابَين (2)

إليك كيفية الحصول على سلسلة مفصولة بـ | للردود التي تستخدمها حاليًا:

# ./launcher enter app
# rails c
retorts = {}
PostDetail.where(extra: 'retort').each do |p|
  retort = p.key.split('|').first
  (retorts[retort] ||= []) << p
end
retorts.length
retorts.keys.join('|')

هذا يعطيك:

  • أولاً عدد الرموز التعبيرية الفريدة للردود المستخدمة
  • ثم الردود في شكل يمكنك لصقه في تكوين ردود الفعل، ربما بعد تقصيره إذا كان طويلاً جدًا بالنسبة لواجهة ردود الفعل.

بالنسبة لي، أحصل على هذه السلسلة:

tada|rage|money_with_wings|face_vomiting|crossed_fingers|grin|vulcan_salute|worried|slightly_smiling_face|dart|+1|relaxed|star_struck|upside_down_face|sweat_drops|astonished|frowning_face|champagne|heavy_plus_sign|bulb|joy|fireworks|zap|smile|fast_forward|grinning|clap|sandwich|heart_eyes|rofl|smiley|wave|ice_cream|sob|mortar_board|open_mouth|pray|grimacing|roll_eyes|arrow_right_hook|brain|wink|cry|nerd_face|slight_smile|confused|ok|thinking|it|heart|smirk|sleepy|eyes|disappointed|question|laughing|man_shrugging|drum|shushing_face|herb|man_facepalming|ear|scream|ok_hand|mantelpiece_clock|smiling_face_with_three_hearts|confetti_ball|sunglasses|nose|pirate_flag|neutral_face|sweat_smile|gift|pensive|dark_sunglasses|exclamation|call_me_hand|green_heart|face_with_monocle|blush|boom|hugs|stuck_out_tongue|zipper_mouth_face|slightly_frowning_face|face_with_raised_eyebrow|exploding_head|information_source|sailboat|fire|gun|carousel_horse|sparkles|hearts|pizza|frowning|drooling_face|-1|100|metal|partying_face|four_leaf_clover|grinning_face_with_smiling_eyes|scream_cat|person_shrugging|deciduous_tree|sunflower|see_no_evil|hear_no_evil|speak_no_evil|微笑|top|face_with_peeking_eye|face_with_hand_over_mouth|stethoscope|money_mouth_face

إذا كنت ترغب في نسخ قائمة بالردود الحالية إلى منشور في discourse لمناقشة ما يجب الاحتفاظ به عند الترحيل إلى ردود الفعل، فقد تستخدم هذا بدلاً من ذلك:

":" + retorts.keys.join(': :') + ':'

بالنسبة لي، هذه هي المجموعة الحالية:

:tada: :rage: :money_with_wings: :face_vomiting: :crossed_fingers: :grin: :vulcan_salute: :worried: :slightly_smiling_face: :dart: :+1: :relaxed: :star_struck: :upside_down_face: :sweat_drops: :astonished: :frowning_face: :champagne: :heavy_plus_sign: :bulb: :joy: :fireworks: :zap: :smile: :fast_forward: :grinning: :clap: :sandwich: :heart_eyes: :rofl: :smiley: :wave: :ice_cream: :sob: :mortar_board: :open_mouth: :pray: :grimacing: :roll_eyes: :arrow_right_hook: :brain: :wink: :cry: :nerd_face: :slight_smile: :confused: :ok: :thinking: :it: :heart: :smirk: :sleepy: :eyes: :disappointed: :question: :laughing: :man_shrugging: :drum: :shushing_face: :herb: :man_facepalming: :ear: :scream: :ok_hand: :mantelpiece_clock: :smiling_face_with_three_hearts: :confetti_ball: :sunglasses: :nose: :pirate_flag: :neutral_face: :sweat_smile: :gift: :pensive: :dark_sunglasses: :exclamation: :call_me_hand: :green_heart: :face_with_monocle: :blush: :boom: :hugs: :stuck_out_tongue: :zipper_mouth_face: :slightly_frowning_face: :face_with_raised_eyebrow: :exploding_head: :information_source: :sailboat: :fire: :gun: :carousel_horse: :sparkles: :hearts: :pizza: :frowning: :drooling_face: :-1: :100: :metal: :partying_face: :four_leaf_clover: :grinning_face_with_smiling_eyes: :scream_cat: :person_shrugging: :deciduous_tree: :sunflower: :see_no_evil: :hear_no_evil: :speak_no_evil: :微笑: :top: :face_with_peeking_eye: :face_with_hand_over_mouth: :stethoscope: :money_mouth_face:

للحصول على قائمة نقطية بالرموز التعبيرية مع عدد مرات ظهور كل منها:

retorts.keys.sort.each do |k|
  puts "* :#{k}: #{retorts[k].length}"
end

لن أقوم بلصق القائمة النقطية الكاملة للرموز التعبيرية، لكنها تبدأ هكذا:

  • :+1: 161
  • :-1: 1
  • :100: 1
  • :arrow_right_hook: 1
  • :astonished: 9
  • :blush: 2
  • :boom: 2
  • :brain: 23
  • :bulb: 3

إذا كنت تريد رؤية كل منشور موجود لكل رمز تعبيري:

retorts.keys.sort.each do |k|
  puts "* :#{k}: #{retorts[k].length}"
  retorts[k].each do |r|
    p = Post.find_by(id: r.post_id)
    next if p.nil?
    puts "   * #{p.full_url}"
  end
end

هذا طويل جدًا للصق هنا!

ما لا أعرفه هو كيفية ترحيل كل هذه الردود - أو بعضها - إلى ردود الفعل. لا يوجد ذكر للردود في إضافة ردود الفعل، لذا فهي لا تفعل ذلك تلقائيًا. لدي 927 رد فعل مع 116 رمزًا تعبيريًا فريدًا أرغب في ترحيلها إلى ردود الفعل.

أتوقع أن أواجه التعامل مع هذا في مرحلة ما، ويفضل قبل أن يتوقف Retort عن العمل؛ إذا قمت بتنفيذ الترحيل، فسأخطط لتوثيقه هنا. ولكن على الأقل معرفة ما لديك قد يساعدك.

6 إعجابات

في أثناء كتابة بعض التعليمات البرمجية التجريبية لترحيل Retort إلى Reactions، اكتشفت أن Retorts لا يتم تحديثها عند تغيير أسماء المستخدمين.

أعتقد أن هذا لن يكون صحيحًا مع Reactions لأن PostActions يرتبط بسجلات المستخدم الفعلية، بدلاً من تسجيل أسماء المستخدمين في كتلة JSON في PostDetail.

بشكل عام، إذا قرر شخص ما تبني Retort وصيانته، فيجب عليه التفكير في الترحيل من PostDetail إلى PostActions باتباع الطريقة التي تم بها عمل Reactions.

وبالمثل، فإنه لا يتعرف على وقت حذف المشاركات.

لقد نما لدي البرنامج النصي الخاص بي Script framework to rearrange topics and categories بوظيفة جديدة تتجاوز قليلاً إعادة ترتيب المواضيع والفئات!

عادةً ما أتذكر أن أحذر الأشخاص من أنني لا أعرف لغة Ruby أو Ruby on Rails، لذا فإن الكود الخاص بي غريب الأطوار بدلاً من أن يكون اصطلاحيًا. لكن يبدو أنه يعمل حتى الآن في اختباري!

  def migrateRetortToReactions(allowed:, likes: nil, emojimap: nil)
    # ترحيل حيثما أمكن دون تجاوز أي إعجابات موجودة
    # هذا تحويل خاسر بالضرورة، وهو متسق فقط بترتيب PostDetail
    # لا يتم بذل أي محاولة لتفضيل سجل PostDetail على آخر
    emojimap = {} if emojimap.nil?
    allowed.each do |a|
      emojimap[a] = a
    end
    retort = "retort".freeze
    emojiType = "emoji".freeze
    usermap = Hash.new { |hash, username| hash[username] = User.find_by_username(username) }
    postmap = Hash.new { |hash, post_id| hash[post_id] = Post.find(post_id) }
    likeType = PostActionType.where(name_key: "like").pluck(:id).first

    PostDetail.where(extra: retort).each do |pd|
      begin
        p = postmap[pd.post_id]
      rescue
        # PostDetail غير متسق فيما يتعلق بالحذف
        $stderr.puts sprintf("Could not find post for %d: %s / %s", pd.post_id, pd.key, pd.value)
        next
      end
      emoji = pd.key.split('|').first
      users = JSON.parse(pd.value)
      users.each do |user|
        u = usermap[user]
        next if u.nil? # تغيير اسم المستخدم أو حذف المستخدم يترك ردود فعل معلقة
        if likes.include?(emoji)
          pa = PostAction.where(post_id: p.id, user_id: u.id, post_action_type_id: likeType).first
          next unless pa.nil?
          $stderr.puts sprintf("Adding like for Retort %s for user %s in %s", emoji, user, p.url)
          PostActionCreator.create(u, p, :like, created_at: pd.created_at, silent: true)
        elsif emojimap.has_key?(emoji)
          e = emojimap[emoji]
          r = DiscourseReactions::Reaction.where(post_id: p.id, reaction_type: emojiType, reaction_value: e).first_or_create
          ru = DiscourseReactions::ReactionUser.where(user_id: u.id, post_id: p.id).first
          next unless ru.nil?
          $stderr.puts sprintf("Converting Retort %s to Reaction %s for user %s in %s", emoji, e, user, p.url)
          DiscourseReactions::ReactionUser.create(reaction_id: r.id, user_id: u.id, post_id: p.id, created_at: pd.created_at)
        else
          $stderr.puts sprintf("Ignoring unmapped Retort %s for user %s in %s", emoji, user, p.url)
        end
      end
    end
  end

أستخدم الإطار الذي بنيته لتوفير تكوين YAML يبدو كالتالي:

- migrateRetortToReactions:
    allowed:
      - rofl
      - astonished
      - crossed_fingers
      - sob
      - thinking
      - grimacing
      - frowning_face
      - drum
    likes:
      - dart
      - +1
      - joy
      - "100"
      - brain
      - heart
      - heart_eyes
      - hearts
    emojimap:
      rage: sob
      four_leaf_clover: crossed_fingers
      cry: sob
      open_mouth: astonished
      scream: frowning_face

ومع ذلك، يمكنك ببساطة تغليف ذلك في برنامج نصي Ruby يتضمن جعل تلك الوسائط كود Ruby حرفي، وإسقاطه في دليل script/، وتشغيله.

إعجابَين (2)

يا رفاق، كما نوقش في الموضوع أعلاه، لقد كتبت بالفعل ميزة ترحيل من Retort إلى Reactions، بما في ذلك واجهة مستخدم إدارية.

لكي تكون جاهزة للإنتاج، سيحتاج القائمون على صيانة Reactions إلى إجراء تغيير طفيف لتحسين تجريد الكود في إضافة Reactions.

إن دعم ترحيل على مستوى الإنتاج بين إضافتين مثل هذه يتطلب ضمان جودة كبير وإلا فقد تحدث مشكلات مثل هذه بسهولة.

4 إعجابات

أنا آسف! لقد فاتني هذا المنشور ونظرت فقط في الفرع الرئيسي. إنه موضوع طويل…

أتفق. لقد تجاوزت الأمر تمامًا. إنه أكثر من مجرد ReactionsManager.toggle! - إنه يحتاج حقًا إلى تمرير created_at، أليس كذلك؟

إن الانتقال إلى التفاعلات يغير حقًا دلالات “الإعجاب” لأنه لا يمكنك التراجع عنه عندما يقوم شخص ما بتحرير منشوره. لم أكن لأتخذ نفس خيار التنفيذ. :frowning:

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

إعجاب واحد (1)

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

الخلاصة هي أن إضافة التفاعلات (Reactions Plugin) ليست مكتوبة حاليًا بطريقة تسهل عملية ترحيل مستقرة تعمل بشكل موثوق عبر البيئات المختلفة.

إذا رغب أي شخص في الترحيل من Retort إلى Reactions، فإن Pavilion يتولى هذه الأمور يدويًا على أساس تعاقدي (راسل البريد الإلكتروني contact@pavilion.tech أو أرسل لي رسالة خاصة). إذا تم تحديث إضافة التفاعلات (Reactions Plugin) للسماح بالترحيل المعمم، فسنقوم بـ إكمال عمل الترحيل لجعله متاحًا مجانًا.

إعجابَين (2)

أها. هذا يجيب على بعض الأسئلة التي كانت لدي. من الصعب فهم 450 منشورًا على مدار 7 سنوات.

إذًا، هل أفهم أن ما “يجب” فعله (نرحب بأي شخص لتقديم تعريفه الخاص لـ “يجب”) هو توسيع ردود الفعل بطريقة ما بحيث يمكنها التعامل بشكل أفضل مع ترحيل البيانات إليها وتوفير ميزات مفقودة؟

ما حجم هذه المهمة بالساعات أو الدولارات بشكل تخميني؟

هذا لا يزال دقيقًا بشكل عام.


إذا كانت هناك فرصة واقعية لتقديم طلب سحب (PR)، فربما أقوم بذلك مقابل زجاجة نبيذ أحمر جيدة. إنها ليلة الجمعة بعد كل شيء.

ولكن، بجدية أكبر قليلاً، ما نتحدث عنه هنا هو إعادة هيكلة بسيطة لمكون ReactionManager في إضافة ردود الفعل. هذا النوع من العمل لا يتم قبوله عادةً عبر طلبات السحب (PR). سيكون هناك حاجة إلى موافقة من القائمين على صيانة ردود الفعل.

أعتقد أنك سترغب أيضًا في التأكد من أن الإعجابات “صامتة” وأن created_at يتم التعامل معها للإعجابات وردود الفعل؛ وإلا سيتم إزعاج المستخدمين بالإشعارات من الترحيل. (رأيت هذا في موقع الاختبار الخاص بي لتسجيلي الدخول.)

لسبب ما، حتى مع التعامل مع created_by، ما زلت أواجه مشكلة تجاوز الحد الأقصى للإعجابات “out of love”، ولم أتعمق في ذلك، لأنني تخلصت من جميع الإشعارات الأخرى.

@joffreyjaffeux هل هناك أي سبب لعدم كشف الوظائف اللازمة لترحيل نظيف؟

لقد انتقلت للتو إلى التفاعلات (لأنني أفترض أنها رسمية وكل شيء…) ولكني أكره أن أفقد كل بيانات الردود السابقة.

أعتذر، ولكن لا يمكن توفير ترحيل مستقر في الوقت الحالي للأسباب المذكورة أعلاه.

حسنًا، لقد حدث ذلك الآن، لم أتمكن من تحديث discourse بسبب إضافة retort.

هذا هو خطأ ترحيل قاعدة البيانات الذي حصلت عليه:

لا يمكن إنشاء فهرس فريد "index_post_details_on_post_id_and_key_ccnew_ccnew"
التفاصيل: المفتاح (post_id, key)=(30297, +1|retort) مكرر.

لقد استخدمت هذا البرنامج النصي كأساس لرمز الترحيل الخاص بي. إليك ما فعلته.

  • لإعادة تشغيل discourse، اضطررت إلى تجاوز “version” في ملف قالب .yml إلى التزام منذ حوالي أسبوعين في مستودع discourse
  • إعادة البناء مع إضافة إضافة التفاعلات لإعادة الموقع إلى العمل
  • قمت بتكوين إضافة التفاعلات بنفس مجموعة التفاعلات مثل retort. لا أستخدم أي تفاعل يمكن تفسيره على أنه إعجاب
  • استخدمت البرنامج النصي لـ @mcdanlj مع تعديلات طفيفة مع الخطوات التالية (حيث أردت ترحيل جميع الـ retorts وكان لدي تعيين 1-إلى-1 بين الـ retorts والتفاعلات بالفعل):
  • قم بتشغيل ./launcher enter app
  • قم بتشغيل rails c
  • الصق ما يلي (يبدو أن وحدة تحكم rails ستعيد عرض الرمز بتغييرات أسطر غير صحيحة، لقد أضفت تغييرات أسطر مزدوجة ولكن هذا لم يغير الإخراج حقًا، ولكن إذا واجه شخص ما خطأ في بناء الجملة مع الرمز التالي، فأضف سطرًا إضافيًا بعد كل سطر):
def migrateRetortToReactions()
  retort = "retort".freeze
  emojiType = "emoji".freeze
  usermap = Hash.new { |hash, username| hash[username] = User.find_by_username(username) }
  postmap = Hash.new { |hash, post_id| hash[post_id] = Post.find(post_id) }
  likeType = PostActionType.where(name_key: "like").pluck(:id).first
  PostDetail.where(extra: retort).each do |pd|
    begin
      p = postmap[pd.post_id]
    rescue
      # PostDetail ليس متسقًا فيما يتعلق بالحذف
      $stderr.puts sprintf("لم يتم العثور على المنشور لـ %d: %s / %s", pd.post_id, pd.key, pd.value)
      next
    end

    emoji = pd.key.split('|').first
    users = JSON.parse(pd.value)
    users.each do |user|
      u = usermap[user]
      next if u.nil? # تغيير اسم المستخدم أو حذف المستخدم يترك ردود فعل يتيمة
      e = emoji
      r = DiscourseReactions::Reaction.where(post_id: p.id, reaction_type: emojiType, reaction_value: e).first_or_create
      ru = DiscourseReactions::ReactionUser.where(user_id: u.id, post_id: p.id).first
      next unless ru.nil?
      $stderr.puts sprintf("تحويل رد فعل %s إلى تفاعل %s للمستخدم %s في %s", emoji, e, user, p.url)
      DiscourseReactions::ReactionUser.create(reaction_id: r.id, user_id: u.id, post_id: p.id, created_at: pd.created_at)
    end
  end
end
  • في هذه المرحلة قمت بعمل نسخة احتياطية للموقع فقط في حالة
  • ثم قم بتشغيل migrateRetortToReactions والذي يجب أن يستغرق بعض الوقت. بالنسبة لي لم أر أو أواجه أي مشاكل. بعد تشغيل وحدة التحكم يبدو أنها تعرض جميع الكائنات المتغيرة لذا اضغط على q للخروج
  • الآن على الموقع يجب أن يكون الأمر كذلك أن البيانات تم ترحيلها بشكل صحيح
  • كخطوة أخيرة تحتاج إلى تشغيل: PostDetail.where(extra: "retort").destroy_all والذي سيحذف بيانات retort
  • الآن تمكنت من إعادة بناء موقعي بأحدث إصدار discourse وبدون إضافة retort

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

6 إعجابات

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

إعجاب واحد (1)

مع التغييرات الجديدة في Ember 5، أصبح Retort الآن غير فعال. استكشاف خيارات للحفاظ على وظائفه.

إعجاب واحد (1)