Mudlet: لا يؤدي تسجيل حدث sysIrcMessage أحيانًا إلى استدعاء الوظيفة المرتبطة

تم إنشاؤها على ١ مايو ٢٠٢٠  ·  7تعليقات  ·  مصدر: Mudlet/Mudlet

ملخص موجز للمشكلة:

أحيانًا لا يستدعي registerAnonymousEventHandler ("sysIrcMessage"، onIrcMessage) الوظيفة عند تلقي رسالة IRC.

فيديو repro هنا: https://youtu.be/seLTuTSOtsk (انظر وصف الطوابع الزمنية)

خطوات إعادة إظهار المشكلة:

  1. قم بتثبيت خادم oragono IRC لنظام التشغيل Windows (https://github.com/oragono/oragono/blob/stable/docs/MANUAL.md#windows)
  2. اتبع تعليمات oragono لإعداد الخادم وبدء تشغيله
  3. قم بإنشاء برنامج نصي في Mudlet بالرمز التالي:
function connectToIRC()
  setIrcServer("127.0.0.1", 6667)
  setIrcNick("Ditto")
  setIrcChannels({"#botchannel"})
  registerAnonymousEventHandler("sysIrcMessage", onIRCMessage)
  sendIrc("#botchannel", "Hello from Mudlet!")  
end

function onIRCMessage(_, sender, target, message)
  local myString = sender .. " says " .. message .. ".\n"
  feedTriggers(myString)
end
  1. قم بتشغيل connectToIRC () عندما يتصل العميل بـ MUD ، أو قم بتشغيله يدويًا
  2. لاحظ أن Mudlet في بعض الأحيان لا يردد رسالة IRC المستلمة عند الاتصال
  3. استخدم عميل IRC خارجي مثل HexChat لإرسال رسالة إلى القناة
  4. لاحظ أن Mudlet في بعض الأحيان لا يكرر رسالة IRC المستلمة من المستخدم والتي يمكن رؤيتها في عميل Mudlet IRC

إخراج الخطأ:

الاتصال بخادم IRC مع تسجيل sysIrcMessage ، ووظيفة echo ، يجب أن يردد صدى جميع رسائل IRC

معلومات إضافية ، مثل إصدار Mudlet ونظام التشغيل والأفكار حول كيفية حل المشكلة:

Mudlet 4.6.2
الإصدار 1909 من Windows 10 الإصدار 18363.815
إعادة تشغيل Mudlet يؤدي في النهاية إلى إطلاق النار بشكل صحيح.

التعليق الأكثر فائدة

توجد مشكلة سابقة حول هذا الموضوع على https://github.com/Mudlet/Mudlet/issues/1469 ولكن تم إغلاقه بعد توقف الملصق الأصلي عن المشاركة وتم إجراء بعض التعديلات ذات الصلة.

ملخص الفيديو:

  • لديك برنامج نصي يتم تشغيله بواسطة سلسلة نصية على شاشة تسجيل الدخول للعبة ، بحيث عندما تتصل باللعبة ، يكون من المفترض أن يتصل العميل بـ IRC والانضمام إلى قناة وإرسال رسالة صادرة ، والرسائل الواردة من IRC تكون من المفترض أن يتردد صدى شاشة اللعبة. عناصر "مرحبًا بك في IRC" والرسائل من قناة تمر جميعها بنفس الوظيفة.
  • عندما تتصل باللعبة ، تنبثق نافذة IRC ، لتظهر لك في القناة. لديك عميل IRC منتظم على الجانب الذي يلاحظ انضمامك.
  • قد تحتوي نافذة اللعبة على الأشياء أو لا تحتوي على صدى لها. يمكنك الدردشة من عميل IRC الآخر ويمكن رؤيتها في نافذة IRC الخاصة بـ mudlet ولكن لا تقوم بتشغيل كود lua لترديده في نافذة اللعبة. يستمر هذا للجلسة ، وقد تساعد أو لا تساعد إعادة تشغيل mudlet.

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

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

في الفيديو ، بين 1:00 و 1:02 ، لا تظهر نافذة لعبتك أي رسائل "ترحيب في IRC" من الاتصال بـ IRC على الرغم من أن نافذة IRC الخاصة بك مفتوحة وانضمت بالفعل إلى القناة. ولكن بعد ذلك تفتح نافذة المشغلات ، وتعرض فجأة جميع رسائل الترحيب وما كنت قد تلقيته سابقًا. لذلك أعتقد أن هذه الرسائل الواردة قد تم إنشاؤها بشكل صحيح في حدث وإضافتها إلى قائمة انتظار الحدث ثم تم إيقاف قائمة انتظار الحدث ، وفتح نافذة المشغلات ، ثم أعاد تشغيلها.

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

في /src/Host.cpp#L1397 دالة Host :: postIrcMessage (a، b، c) ، يتم إنشاء الحدث sysIrcMessage ومن ثم يتم استدعاء liftEvent.
يبدو الأمر منطقيًا بما يكفي بالنسبة لي ... أنشئ حدثًا ، ضع 4 سلاسل مع أحدها يقول "sysIrcMessage" والآخرون بالبيانات الأخرى ، قم بتسميتها على أنها 4 سلاسل ، وقم بتغذيتها لرفع الحدث ().

يتم استدعاء وظيفة Host :: postIrcMessage بواسطة مربع حوار IRC الذي يقوم بتنسيق نص ونسخة html للرسالة وإرسال نص إلى lua و html إلى نافذة دردشة IRC.
هذا موجود في /src/dlgIRC.cpp#L613
لذا بما أن نافذة دردشة IRC يتم تحديثها بشكل صحيح وتعرض الدردشة الواردة ، فهذا يعني أن الأمر lua يحدث في نفس الوقت ، لأن تحديث نافذة دردشة IRC يأتي في السطر 618 ، بعد جزء lua في السطر 606. إنه يتجاوز هذا الرمز عندما يصل إليه ، ولكن بعد ذلك يتم تعليقه في مكان ما لاحقًا. نظرًا لإمكانية إعادة تشغيله والتعامل معه بشكل صحيح ، أعتقد أن الحدث يتم بناؤه بشكل صحيح ، فقط لا يتم استدعاؤه في الوقت المناسب. في بعض الأحيان يمكنك ذلك ، ولكن قد لا تتمكن من إعادة تشغيله.

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

في كل حالة ، تظهر نافذة دردشة IRC بشكل صحيح وتلقيت كل محادثة أرسلتها من عميل IRC الآخر الخاص بي بقدر ما أستطيع أن أخبرك.

ال 7 كومينتر

توجد مشكلة سابقة حول هذا الموضوع على https://github.com/Mudlet/Mudlet/issues/1469 ولكن تم إغلاقه بعد توقف الملصق الأصلي عن المشاركة وتم إجراء بعض التعديلات ذات الصلة.

ملخص الفيديو:

  • لديك برنامج نصي يتم تشغيله بواسطة سلسلة نصية على شاشة تسجيل الدخول للعبة ، بحيث عندما تتصل باللعبة ، يكون من المفترض أن يتصل العميل بـ IRC والانضمام إلى قناة وإرسال رسالة صادرة ، والرسائل الواردة من IRC تكون من المفترض أن يتردد صدى شاشة اللعبة. عناصر "مرحبًا بك في IRC" والرسائل من قناة تمر جميعها بنفس الوظيفة.
  • عندما تتصل باللعبة ، تنبثق نافذة IRC ، لتظهر لك في القناة. لديك عميل IRC منتظم على الجانب الذي يلاحظ انضمامك.
  • قد تحتوي نافذة اللعبة على الأشياء أو لا تحتوي على صدى لها. يمكنك الدردشة من عميل IRC الآخر ويمكن رؤيتها في نافذة IRC الخاصة بـ mudlet ولكن لا تقوم بتشغيل كود lua لترديده في نافذة اللعبة. يستمر هذا للجلسة ، وقد تساعد أو لا تساعد إعادة تشغيل mudlet.

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

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

في الفيديو ، بين 1:00 و 1:02 ، لا تظهر نافذة لعبتك أي رسائل "ترحيب في IRC" من الاتصال بـ IRC على الرغم من أن نافذة IRC الخاصة بك مفتوحة وانضمت بالفعل إلى القناة. ولكن بعد ذلك تفتح نافذة المشغلات ، وتعرض فجأة جميع رسائل الترحيب وما كنت قد تلقيته سابقًا. لذلك أعتقد أن هذه الرسائل الواردة قد تم إنشاؤها بشكل صحيح في حدث وإضافتها إلى قائمة انتظار الحدث ثم تم إيقاف قائمة انتظار الحدث ، وفتح نافذة المشغلات ، ثم أعاد تشغيلها.

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

في /src/Host.cpp#L1397 دالة Host :: postIrcMessage (a، b، c) ، يتم إنشاء الحدث sysIrcMessage ومن ثم يتم استدعاء liftEvent.
يبدو الأمر منطقيًا بما يكفي بالنسبة لي ... أنشئ حدثًا ، ضع 4 سلاسل مع أحدها يقول "sysIrcMessage" والآخرون بالبيانات الأخرى ، قم بتسميتها على أنها 4 سلاسل ، وقم بتغذيتها لرفع الحدث ().

يتم استدعاء وظيفة Host :: postIrcMessage بواسطة مربع حوار IRC الذي يقوم بتنسيق نص ونسخة html للرسالة وإرسال نص إلى lua و html إلى نافذة دردشة IRC.
هذا موجود في /src/dlgIRC.cpp#L613
لذا بما أن نافذة دردشة IRC يتم تحديثها بشكل صحيح وتعرض الدردشة الواردة ، فهذا يعني أن الأمر lua يحدث في نفس الوقت ، لأن تحديث نافذة دردشة IRC يأتي في السطر 618 ، بعد جزء lua في السطر 606. إنه يتجاوز هذا الرمز عندما يصل إليه ، ولكن بعد ذلك يتم تعليقه في مكان ما لاحقًا. نظرًا لإمكانية إعادة تشغيله والتعامل معه بشكل صحيح ، أعتقد أن الحدث يتم بناؤه بشكل صحيح ، فقط لا يتم استدعاؤه في الوقت المناسب. في بعض الأحيان يمكنك ذلك ، ولكن قد لا تتمكن من إعادة تشغيله.

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

في كل حالة ، تظهر نافذة دردشة IRC بشكل صحيح وتلقيت كل محادثة أرسلتها من عميل IRC الآخر الخاص بي بقدر ما أستطيع أن أخبرك.

في الفيديو ، بين 1:00 و 1:02 ، لا تظهر نافذة لعبتك أي رسائل "ترحيب في IRC" من الاتصال بـ IRC على الرغم من أن نافذة IRC الخاصة بك مفتوحة وانضمت بالفعل إلى القناة. ولكن بعد ذلك تفتح نافذة المشغلات ، وتعرض فجأة جميع رسائل الترحيب وما كنت قد تلقيته سابقًا. لذلك أعتقد أن هذه الرسائل الواردة قد تم إنشاؤها بشكل صحيح في حدث وإضافتها إلى قائمة انتظار الحدث ثم تم إيقاف قائمة انتظار الحدث ، وفتح نافذة المشغلات ، ثم أعاد تشغيلها.

لقد لاحظت هذا أيضًا منذ بضعة أسابيع ، ولذا كنت أحاول أشياء مختلفة "لتحريكها" عندما أصاب بحالة سيئة. مثل بقية المشكلة يبدو عشوائيًا جدًا. في بعض الأحيان ، يؤدي فتح نوافذ الإعدادات أو إطلاق أمر lua إلى تشغيل قائمة انتظار الأحداث ، ولكن فقط حوالي 50٪ من الوقت في تجربتي.

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

لذلك أعتقد أن هناك مشكلتين:

  • يمكنك على ما يبدو تشغيل feedTriggers (سلسلة) من هذا الرمز وعدم ظهوره في النافذة الرئيسية حتى وقت لاحق. سيكون الزوجان الأولان على ما يرام ثم لا يقوم الآخرون بتحديث الشاشة بأنفسهم.
  • نصف الجلسات لا يتم تشغيل هذا الحدث sysIrcMessage (على الرغم من أن نافذة IRC تعمل). من المحتمل وجود مشكلة في تسجيل هذا الحدث ، لأنه إذا نجح مرة واحدة ، فإنه يعمل طوال الجلسة.

لقد رأيت ملاحظة في الدليل بخصوص feedTriggers تنص على أن feedTriggers من المفترض أن تجعل السلسلة تظهر جنبًا إلى جنب مع الرسالة التالية إذا لم تستخدم سطرًا جديدًا. لكن هذا النص يحتوي على سطر جديد هناك ، لذلك لا ينبغي انتظار إخراج اللعبة أو إشارة البدء وما إلى ذلك. في الوقت الحالي أضفت إرسال ("\ n") مما يعني أن موجهي من اللعبة يقوم على الأقل بتحديث شاشتي الى الان.

في Ubuntu ، جمعت mudlet وقمت بتشغيله ويبدو أنني أقوم بالسيناريو كما هو متوقع. أعني أن العرض لا يزال متأخرًا حتى مرور اللعبة ، لكنه على الأقل يقوم بتشغيل البرنامج النصي عند رسائل IRC الواردة. جربتها حوالي 20 مرة على التوالي حيث عملت بشكل جيد. ثم قمت بتنزيل الإصدار 4.8.2 linux وتشغيله ، وهذا نصف ونصف تمامًا كما كان يفعل Windows.

حسنًا ، ربما يكون لدى إصدار dev بعض الإصلاحات بخصوص هذه المشكلة؟

لذا جربت البعض مع Windows 10 مرة أخرى. كنت أستخدم 4.8.2 طوال الوقت ، لذلك قمت بتنزيل ملف zip لاختبار PR 3872 الذي أنشأه روبوت المترجم. لديها نفس المشكلة ، ~ 50٪ من الوقت لا تسجل المعالج.

قد يكون هذا متعلقًا بالطريقة التي يعمل بها feedTriggers() . وفقًا لدليل feedTriggers () ، تتطلب هذه الوظيفة أن "يتلقى" Mudlet البيانات من اللعبة قبل معالجة النمور.

لاقتباس ملاحظة من الصفحة:

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

لذا ، حاول إضافة send("\n") إلى الوظيفة onIRCMessage أو تغليف سطر IRC الوارد بأحرف سطر جديد ومعرفة ما إذا كان ذلك مفيدًا.

  • نصف الجلسات لا يتم تشغيل هذا الحدث sysIrcMessage (على الرغم من أن نافذة IRC تعمل). من المحتمل وجود مشكلة في تسجيل هذا الحدث ، لأنه إذا نجح مرة واحدة ، فإنه يعمل طوال الجلسة.

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

https://github.com/Mudlet/Mudlet/blob/development/src/dlgIRC.cpp#L612 -L614

هذا الجزء قديم من الوقت الذي اعتدت فيه أن تكون قادرًا على تشغيل IRC دون فتح ملف تعريف. الآن يجب أن يكون مرتبطًا بملف تعريف ، ولا يوجد "مضيف افتراضي" اعتبارًا من أغسطس 2019. https://github.com/Mudlet/Mudlet/pull/2950

يجب أن يكون هذا الرمز القديم مجرد سخام طفيف على الرغم من أنه لم يعد يتم اتباعه. لم أتطلع بعد لمعرفة سبب ظهور isDefaultHostClient () أحيانًا عندما يكون عميل IRC مرتبطًا في الواقع بملف تعريف مفتوح.

لقد قمت بإزالة الرمز القديم ، لذا يمكنك تجربة هذا PR على Windows:

https://make.mudlet.org/snapshots/ccfee3/Mudlet-4.9.1-testing-pr3927-24eab7a5-windows.zip

يبدو أن هذا قد حل المشكلة! لقد حاولت حوالي 20 repros ولم أتمكن من إعادة إظهار المشكلة.

يبدو أن العميل لا يزال يتطلب نوعًا من المدخلات لدفع الحدث الأول ، ولكن نقرة في أي مكان ستفعل ذلك - بما في ذلك نقرة لتقليل نافذة IRC ، وهو أمر ضروري لإعادة التركيز إلى النافذة الرئيسية على أي حال.

شكرا لكما! عمل جميل جدا. :)

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات