Mudlet: Регистрация события sysIrcMessage иногда не вызывает связанную функцию

Созданный на 1 мая 2020  ·  7Комментарии  ·  Источник: Mudlet/Mudlet

Краткое содержание проблемы:

Иногда registerAnonymousEventHandler ("sysIrcMessage", onIrcMessage) не вызывает функцию при получении сообщения IRC.

Воспроизведение видео здесь: https://youtu.be/seLTuTSOtsk (отметки времени см. В описании)

Действия по воспроизведению проблемы:

  1. Установите IRC-сервер oragono для 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 и функцией эха должно отображать все сообщения IRC.

Дополнительная информация, такая как версия Mudlet, операционная система и идеи по решению:

Мадлет 4.6.2
Windows 10, версия 1909, сборка 18363.815
Перезапуск Mudlet в конечном итоге приводит к правильному срабатыванию.

Самый полезный комментарий

На https://github.com/Mudlet/Mudlet/issues/1469 уже существовала более ранняя проблема по этому поводу, но она была закрыта после того, как исходный плакат перестал участвовать и были внесены некоторые связанные изменения.

Краткое содержание видео:

  • У вас есть сценарий, который запускается строкой текста на экране входа в игру, так что когда вы подключаетесь к игре, ваш клиент должен подключаться к IRC, присоединяться к каналу и отправлять исходящее сообщение, входящие сообщения из IRC должен отображаться на экране вашей игры. Все материалы «добро пожаловать в IRC» и сообщения из канала проходят через эту же функцию.
  • Вы подключаетесь к игре, появляется окно IRC, показывая вам канал. У вас есть обычный IRC-клиент, который наблюдает за вашим присоединением.
  • В игровом окне может быть или нет материал, отраженный в нем. Вы можете общаться в чате из другого IRC-клиента, и это даже будет видно в IRC-окне mudlet, но не запускает код lua, чтобы отобразить его в окне игры. Это длится в течение сеанса, перезапуск мадлета может помочь, а может и не помочь.

Я попробовал это сам и сразу смог воспроизвести проблему, ненадежно, но это около 50%. Я не могу сказать никакой закономерности, сначала чередующейся с полосой хороших и плохих. Мне не нужно было закрывать и перезапускать Mudlet, чтобы увидеть изменения, вместо этого я оставил открытым какой-то другой профиль, что означает, что я могу закрыть этот профиль и открыть его резервную копию, и это может или не может исправить это так же, как и перезапуск.

Это сообщение «Привет от мудлета» ни в коем случае не доходит до канала. Я предполагаю, что это связано с тем, что он находится в том же блоке кода, что и материал подключения, и, вероятно, должен завершить соединение перед отправкой сообщений, вероятно, игнорируется, а не помещается в очередь для отправки при присоединении. Я не уверен, может ли этот код быть отделен и запущен успешным присоединением к серверу или принятием присоединения к каналу с сервера или чем-то еще. Я пока забуду эту часть, потому что думаю, что это ожидаемое поведение.

На видео между 1:00 и 1:02 в окне игры не отображаются сообщения «добро пожаловать в IRC» при подключении к IRC, даже если окно IRC открыто и уже подключено к каналу. Но затем вы открываете окно триггеров, и оно внезапно показывает все приветственные сообщения и еще много чего, что вы получили ранее. Поэтому я думаю, что эти входящие сообщения были правильно встроены в событие и добавлены в очередь событий, а затем очередь событий была остановлена, и открытие окна триггеров запустило его обратно.

Когда я набирал команду «lua», она иногда запускала то же самое и у меня. Иногда я получал первые приветственные сообщения, а затем они прекращались, и я мог набирать «lua» и отображать остальные приветственные сообщения и входящий чат, которые еще не были обработаны.

В /src/Host.cpp#L1397 функции Host :: postIrcMessage (a, b, c) создается событие sysIrcMessage, а затем вызывается raiseEvent.
Мне это кажется достаточно логичным ... создать событие, поместить 4 строки, одна из которых говорит "sysIrcMessage", а другие - с другими данными, пометить их как 4 строки, передать их в raiseEvent ().

Эта функция 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, чтобы отобразить его в окне игры. Это длится в течение сеанса, перезапуск мадлета может помочь, а может и не помочь.

Я попробовал это сам и сразу смог воспроизвести проблему, ненадежно, но это около 50%. Я не могу сказать никакой закономерности, сначала чередующейся с полосой хороших и плохих. Мне не нужно было закрывать и перезапускать Mudlet, чтобы увидеть изменения, вместо этого я оставил открытым какой-то другой профиль, что означает, что я могу закрыть этот профиль и открыть его резервную копию, и это может или не может исправить это так же, как и перезапуск.

Это сообщение «Привет от мудлета» ни в коем случае не доходит до канала. Я предполагаю, что это связано с тем, что он находится в том же блоке кода, что и материал подключения, и, вероятно, должен завершить соединение перед отправкой сообщений, вероятно, игнорируется, а не помещается в очередь для отправки при присоединении. Я не уверен, может ли этот код быть отделен и запущен успешным присоединением к серверу или принятием присоединения к каналу с сервера или чем-то еще. Я пока забуду эту часть, потому что думаю, что это ожидаемое поведение.

На видео между 1:00 и 1:02 в окне игры не отображаются сообщения «добро пожаловать в IRC» при подключении к IRC, даже если окно IRC открыто и уже подключено к каналу. Но затем вы открываете окно триггеров, и оно внезапно показывает все приветственные сообщения и еще много чего, что вы получили ранее. Поэтому я думаю, что эти входящие сообщения были правильно встроены в событие и добавлены в очередь событий, а затем очередь событий была остановлена, и открытие окна триггеров запустило его обратно.

Когда я набирал команду «lua», она иногда запускала то же самое и у меня. Иногда я получал первые приветственные сообщения, а затем они прекращались, и я мог набирать «lua» и отображать остальные приветственные сообщения и входящий чат, которые еще не были обработаны.

В /src/Host.cpp#L1397 функции Host :: postIrcMessage (a, b, c) создается событие sysIrcMessage, а затем вызывается raiseEvent.
Мне это кажется достаточно логичным ... создать событие, поместить 4 строки, одна из которых говорит "sysIrcMessage", а другие - с другими данными, пометить их как 4 строки, передать их в raiseEvent ().

Эта функция 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 (string) из этого кода, и он не будет отображаться в главном окне до позднего времени. Первая пара будет в порядке, а остальные не будут обновлять экран самостоятельно.
  • В половине сеансов это событие sysIrcMessage не запускается (даже если окно IRC работает). Вероятно, проблема с регистрацией этого события, потому что, если оно сработает один раз, то будет работать в течение всего сеанса.

Я видел в руководстве примечание относительно feedTriggers, в котором говорится, что feedTriggers должен отображать строку рядом со следующим сообщением, если вы не используете новую строку. Но у этого скрипта есть новая строка, поэтому он не должен ждать выхода игры или разрешения и т. Д. На данный момент я добавил send ("\ n"), что означает, что мое приглашение из игры, по крайней мере, обновляет мой экран сейчас.

В Ubuntu я скомпилировал мудлет и запустил его, и, похоже, он выполняет сценарий, как и ожидалось. Я имею в виду, что отображение все еще откладывается до игрового трафика, но, по крайней мере, оно запускает скрипт при входящих сообщениях IRC. Пробовал около 20 раз подряд, все работает нормально. Затем я загрузил и запустил версию Linux 4.8.2, и это половина с половиной, как это делала Windows.

Что ж, может быть, в сборке разработчика есть исправления по этой проблеме?

Так что попробовал еще раз с Windows 10. Я все время использовал 4.8.2, поэтому я загрузил zip-файл для тестирования недавнего PR 3872, созданного ботом-компилятором. У него та же проблема, ~ 50% времени он не регистрирует обработчик.

Это может быть связано с тем, как работает feedTriggers() . Согласно руководству для feedTriggers () , эта функция требует, чтобы Mudlet "принимал" данные из игры до обработки тигров.

Чтобы процитировать заметку со страницы:

Примечание. Система обработки триггеров также требует, чтобы некоторые данные были (или кажутся) получены от игры для обработки feedTriggers (), поэтому используйте send ("\ n"), чтобы правильно получить новое приглашение (то есть новые данные). после или убедитесь, что текст включает символ новой строки «\ n», чтобы имитировать строку данных с игрового сервера.

Итак, попробуйте добавить send("\n") к функции onIRCMessage или обернуть входящую строку IRC символами новой строки и посмотреть, поможет ли это.

  • В половине сеансов это событие sysIrcMessage не запускается (даже если окно IRC работает). Вероятно, проблема с регистрацией этого события, потому что, если оно сработает один раз, то будет работать в течение всего сеанса.

Я больше не думаю, что это проблема с регистрацией события, а скорее проблема с его вызовом. Кажется, мы остановились на этом операторе if, в котором он проверяет, является ли он клиентом «хоста по умолчанию».

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 попыток и не смог воспроизвести проблему.

Кажется, что клиенту по-прежнему требуется какой-то ввод, чтобы протолкнуть первое событие, но щелчок в любом месте сделает это - включая щелчок, чтобы свернуть окно IRC, которое в любом случае необходимо для возврата фокуса в главное окно.

Спасибо вам обоим! Очень хорошая работа. :)

Была ли эта страница полезной?
0 / 5 - 0 рейтинги