Mudlet: GMCP/GA 文本在登录时被抑制

创建于 2019-02-02  ·  36评论  ·  资料来源: Mudlet/Mudlet

问题的简要摘要/请求功能的描述:

我们已启用 GMCP 并尝试使用 LDmud 3.3.495 启用 GA。 为了在 LDmud 中实现这一点,您必须在 lib 的 master.c 中启用 H_PRINT_PROMPT 挂钩,并为 lib 提供打印到屏幕的功能,其中包括强制执行 Go Ahead 提示。 这个函数在播放器对象和 Mudlet 中工作得很好,你可以看到 GA 部分的增量。

第一次连接mud时,我们的用户名和密码提示是正常显示的,但是如果你退出mud并且没有重启Mudlet,点击重新连接按钮,则没有任何提示显示给用户。 我做了一个数据包跟踪,我确实看到了传递给客户端的用户名提示,但 Mudlet 不会显示提示。 为了增加复杂性,如果我采用相同的用户名/密码提示并在提示末尾添加 n,Mudlet 将显示它,但出于某种原因,它不会在不强制换行的情况下打印(这不是我想要的对用户输入做)。

重现问题的步骤/添加功能的原因:

  1. 使用 Mudlet 连接到我们的 Mud
  2. 退出但不重启 Mudlet
  3. 在同一窗口中,只需单击重新连接

错误输出/特征的预期结果

用户名和密码提示不打印在屏幕上,但用户可以在盲区输入他们的用户名和密码。 输入两个字段后,Mudlet 将显示缓存的提示

额外信息,例如 Mudlet 版本、操作系统以及如何解决/实施的想法:

如果我们用 n 后挂提示,Mudlet 将正确显示提示,但强制回车,这是次优的。 Mudlet 应该能够像我们第一次连接到 MUD 一样正常打印提示。

我已经完成了数据包跟踪并确认提示正在发送到 Mudlet,只是没有显示提示。 我还在#help 频道的 Discord 中发布了屏幕截图。

在 Windows 10 上使用 Mudlet 3.16.1

need more info

最有用的评论

那么我所听到的声音不一样,我们不复位的东西时,服务器断开连接-所有我们需要做的是制定出有什么不同,第二次左右,并改变它回到它是如何在第一时间...:尖叫:

所有36条评论

这早于我最近(3.16.1发行版)提交的修复程序,最终允许服务器协商 telnet 选项 1 (ECHO) 并接管Mudlet 发送到服务器回 Mudlet回显- 这样,如果操作正确,如果用户在 Mudlet 命令行中输入的密码设置了“将我输入的内容回显到我的屏幕”选项上显示- 所以我想打折作为没有更多信息的原因。

你知道这是最近的变化还是 Mudlet一直这样?

老实说,听起来我们没有在(void) cTelnet::reset()方法中重置我们应该重置的东西 - 我只是不知道(还)它可能是什么 - 任何人有任何想法......?

我唯一要说的是,如果我在 master.c 中禁用 H_PRINT_PROMPT 钩子,则在第二次登录尝试时不会出现问题,但是,事实是它们显示启用了钩子的第一个连接,但仅在后续登录时失败连接,尽管文本被发送到 Mudlet,但我很难将问题抛给 mud lib 或驱动程序。 在用户名和密码提示中添加 n 会导致 Mudlet 显示提示这一事实让我认为 Mudlet 中存在问题。 (即这有效: input_to("get_name", INPUT_PROMPT, "你希望知道什么名字?n" ); 但在提示后导致一行返回,然后输入在下一行)

此外,我们在任何其他经过测试的客户端(telnet、tintin++)上都没有看到同样的问题

这些帮助有用?

我们在 StickMUD 上也有这个问题。 @mfczureal和我花了很多时间试图通过游戏来解决它,但确实感觉这个与 Mudlet 相关。

在 LDmud 3.5.1 和 Mudlet 3.17 中得到确认——但这已经在 Mudlet 中存在了很长一段时间。 我很确定我之前在某处注意到了这个问题,但无法自发地找到它。 感谢您报告详细信息!

那么我所听到的声音不一样,我们不复位的东西时,服务器断开连接-所有我们需要做的是制定出有什么不同,第二次左右,并改变它回到它是如何在第一时间...:尖叫:

我尝试录制重播进行比较,但它与原始不同。 第一次连接:显示正常。 以下连接: 显示器关闭。 此时正在播放重播:第一次连接时也显示错误。

screen shot 2019-02-06 at 7 45 36 am
以下是首次登录和连续登录时的行为示例。 GA 正在从游戏中发送。

我看到这仍然被标记为“需要更多信息”。 我可以提供什么来帮助您解决这个问题? 这个问题阻止了我们将 GA 部署到我们的生产 MUD 中,我们真的很想与你们合作解决这个问题。 谢谢

@斯莱斯文

:thinking: 嗯,重播文件可能还不够,因为它可能无法反映断开/重新连接的行为——所以我需要登录一个显示这个问题的 MUD 并监控一些变量——我有一些怀疑,但仍然存在测试真的会有所帮助。 我可以登录到您的 MUD 中的任何一个@mfczureal / @mpconley吗?

好吧,你最近一直在对 Discord 进行故障排除,所以试试暗风? :)

啊,但我不知道在GitHub上@mfczurealZureaL上龃龉。 :眨眼:

您可以通过连接到mg.mud.de:23来尝试此问题

以像gast这样的名字的来宾身份登录,然后重新连接。

只是检查一下是否有任何跟进? 仍然保持我们在 prod 中实施 GA 的能力,我真的很想能够把它放在床上。 谢谢!

我们需要把需要更多信息的标签去掉,然后把高优先级的标签去掉:)

完毕! 不过,我不确定@SlySven的调查计划是什么。 如果可以,也可以尝试深入研究 Mudlet 代码,看看哪里出了问题。

我确实尝试过对此进行调查,但我无法确定我正在经历您所报告的内容。 我真的不明白 GA 的东西是如何工作的,所以我不确定 IRE Bugfix 的东西和所有这些因素是如何影响的。 我试图登录到 Darkwind,但在可下载的 UI 上发生了非常奇怪的事情(它被安装为一个包和一个模块,每次我开始都要花很长时间)TBH 我不知道我是否遇到了您报告的问题 - 我什至不确定我是否将所有旋钮都放在正确的位置。

:thought_balloon: 我认为在 Mudlet 方面会有帮助的是在HostcTelnet和可能的 main TConsole使用一组临时方法,它是TBuffer实例收集并返回这些类中所有可能相关的bool标志成员的状态,并让它们在登录完成后立即报告(或当提示显示不同的行为时)。 这将是查看第一次登录后哪些标志处于不同的状态(事情是正确的)和第二次和重复的标志(它们不是) - 我强烈怀疑这些标志中的一个(至少)需要在cTelnet::reset()重置/设置 - 就像我发现最近添加的Host::mIsRemoteEchoingActive是必要的...

感谢您的关注! 好的,那我试一试。

mg看不到它

image

在暗风中也没有看到它(必须_真的_挖掘才能找到连接信息 - 请下次在报告中提供它!)

image

Stickmud 中没有任何内容:

image

添加重现问题的确切步骤(最好无需浏览角色创建),我们将再看看这个。 谢谢你们!

由于这些问题,现在我们在我们的 prod 和 dev 实例中禁用了 GA。 我们的一位管理员将启动一个新的 dev MUD 实例,以便我可以重新启用 GA,并且可以成为测试 GA 在 LDMud 中如何工作的绝对游乐场。 应该会在今晚晚些时候上线,准备好后我会提供更新

@vadi2 @SlySven请使用stickmud.com 7680 或Mudlet 中的StickMUD 链接。 以玩家身份连接或以访客身份登录,在登录时输入“访问”并通过验证码。 连接好后,可以lua disconnect() 重复上面的过程。 在第二次及之后的连接中,您将不会像第一次连接时那样看到“提供您的姓名”提示,直到您输入玩家姓名或“访问”之后。

您从 mg 尝试的示例确实可以很好地显示缺陷。 让我解释:

请注意在第一次连接尝试中Wie heisst Du denn ("neu" fuer neuen Spieler)?是如何在您回答gast之前发送的,并且只有在回答该问题之后您才会被问到Bist Du maennlich oder weiblich: - 登录过程的其余部分与此问题无关.

grafik

现在,在接下来的所有尝试中,您都不会在回答gast之前看到Wie heisst Du denn行。 相反,您需要在看到问题之前回答,然后将在同一行中看到两个问题。

grafik

知道了谢谢!

:thinking: :confounded: :man_shrugging:

啊,我偷偷怀疑无论何时启用 GA 的状态都不会在重新连接时重置......所以 Mudlet 仍然认为它已启用,当游戏尚未启用它时(例如mg.mud.de没有启用它,直到您输入gast )。

当 GA 未启用时,Mudlet 在放弃并显示文本之前稍等片刻,但启用它后,它仅在 GA 到来时才显示文本。 所以在这里 - GA 永远不会出现 - Mudlet 永远等待以显示文本。

如果这能解决问题,请告诉我:

@vadi2这适用于我在 OSX 上使用 StickMUD。 谢谢!

好的。 这将它修复在 Mudlets 方面。 更好的解决方法是立即在连接上启用 GA(因此您不会像 mg 那样看到 No GA。尚未测试stickmud)

到目前为止,只要我们确认它是 Mudlet 或 Grapevine 客户端,我们就会启用 GA - 否则,玩家可以在需要时将其打开。 在某些客户端中,GA 一定不能很好地处理。

从技术上讲,GANVT(网络虚拟终端)模型的一部分,即默认终端应该作为 Telnet 暗示的半双工模型的一部分提供的东西。 禁止向前不是Mudlet曾经同意的选项,所以实际需要的另一端提供GA信号。 我之前没有完全意识到这一点......

这似乎改善了连接mg.mud.de的体验👍

对 GA 需要(或不需要)的评论在 #1252 中进行了更深入的讨论,MG 似乎通过发送 EOR 而不是 GA 似乎可以很好地与 Mudlet 配合使用,GA 似乎已经过时。

Kebab 指出了我对这个问题的关注,我想对 GA/SGA 发表一些评论。 我不确定,还有其他地方,所以就在这里......

你是完全正确的。 GA 是一种(历史性的)流量控制手段。 除非协商 SGA,否则符合标准的通信伙伴需要在允许其他伙伴发送时发送 GA(即现在可能在每次输出之后)。 但同样的道理,合作伙伴只能在收到 GA 后发送......(我认为没有人这样做)

在我看来,处理这个问题并符合标准的唯一合理方法是始终协商 SGA 并摆脱多余的 GA。

这就是我不喜欢使用 GA 作为提示检测手段(提示标记)的原因。 为此,您需要启用Suppress-go-ahead 以禁用GA 作为 telnet 中的流量控制手段。 只有这样,您才能在 telnet 之上的层(在 MUD 输出中标记提示)中以其他含义使用它。 即使您忽略此处的 telnet 标准,您也可以获得 GA 以获取提示并最终获取许多其他非提示输出)。
一个问题是,如果 MUD 使用 GA 进行即时检测,则没有很好的协商方式。

此外,SGA 与 NOECHO 模式和 CHARMODE/LINEMODE 等其他 telnet 选项交织在一起。 这种相互依赖使问题更加复杂。

如果 TELOPT_EOR 被协商,Morgengrauen 使用 EOR 来标记提示(否则它不会标记提示)并且不会摆弄 SGA(因为这会使 mudlib 的 telnet 协商行为变得更加复杂——在这种情况下,Mudlib 必须处理我不想做的 TELOPT_ECHO、TELOPT_SGA、TELOPT_COMPRESS 和 TELOPT_COMPRESS2,这是驱动程序的东西)并将所有流量控制问题留给 LDMud 的 telnet 机器。 这意味着,Morgengrauen 具有使用 LDMud 进行 GA/SGA 的 MUD 的默认行为。

关于 LDMud 的默认行为,我目前不太确定,但@amotzkau当然可以提供更多详细信息。

LDMud 的默认实现是不给出提示的指示(这可能有历史原因,以前提示是在调用 input_to 之前编写的,因此驱动程序也没有任何提示是什么的指示)。

而 LDMud 使用 SGA 来表示字符模式,这也是有历史原因的。 在没有 SGA 的情况下,敦促通信伙伴仅在收到对方的 GA 后才发言,并在他们结束发言后向 GA 发出信号。 所以这个“command, GA - answer, GA”序列有效地构成了一种行模式样式。 然后同意 SGA 被许多客户端视为字符模式,因为客户端现在可以自由发送输入的字符。 这就是为什么在开始时没有协商 SGA。有一个 LINEMODE telnet 选项可以做同样的事情,但它不像 SGA 那样被客户广泛采用。

为了回应@SlySven ,如果不同意 SGA,则每个服务器都需要发送 GA,这在技术上是正确的,但这也意味着在发送 GA 和未收到 GA 之后,不允许客户端再次发送任何内容。 并且在不得不再次等待用户命令之前只允许服务器发送单个响应。 任何带外消息(事件、其他用户的操作)都必须缓冲,直到用户执行另一个命令。 据我所知,没有 MUD 客户端或服务器坚持这一点。

使用 GA 进行提示指示将遵循旧过程(服务器用 GA 完成其响应,响应中的最后一件事是提示),但没有人再执行此过程的其余部分,因此这不是一个很好的理由。 并且每当 SGA 被同意时(所以这与 Mudlet 无关)GA 在接收时不应被发送和忽略。 因此其他客户端可能会忽略字符模式下的提示指示。

此页面是否有帮助?
0 / 5 - 0 等级