gpt4 book ai didi

irc - 实现 IRC RFC : How to respond to MODE?

转载 作者:行者123 更新时间:2023-12-01 10:59:10 26 4
gpt4 key购买 nike

我正在尝试编写我自己的 IRC 服务器。我引用的是 IRC RFC,但它让我有点困惑。如果我严格遵守 RFC,我认为任何流行的客户端都不会与我的服务器一起工作,比如 mIRC。例如,RFC 规定服务器应响应以下数字响应之一的成功 MODE 命令:RPL_BANLISTRPL_CHANNELMODEISRPL_ENDOFBANLISTRPL_UMODEIS。这会让我相信,在成功更改用户模式时,我会使用 RPL_UMODEIS 进行响应,尽管 RFC 似乎没有明确说明。

但是,当我检查另一个开源 IRC 服务器的源代码时,我看到它以“MODE”的非数字命令响应。它只是回显它看起来像的 MODE 命令。

您应该如何响应 MODE 命令?是否有格式更好的 RFC,具有简单的命令和响应图表或其他内容?

最佳答案

RFC 1459 是出了名的稀疏。它并没有告诉您编写服务器所需知道的一切。

在这种情况下,缺少的是查询现有模式的 MODE 命令与设置新模式的 MODE 命令之间的区别。在模式查询的情况下,客户端将收到指示现有模式的数字回复;在改变模式的情况下,除非出现错误,否则客户端不会收到直接的数字回复。但是,如果模式成功更改,则客户端将从服务器接收到一个MODE,通知它更改。

例如,如果客户端的昵称是 foo 并且它发送:

MODE foo

然后这是在查询它当前的用户模式 ​​- 它会期待一个 RPL_UMODEIS 回复,比如:

:irc.example.org 221 foo :+i

如果客户端随后发送:

MODE foo :+w

然后这是在改变它的用户模式 ​​- 它会得到一个数字错误,如 ERR_USERSDONTMATCH 或模式更改的确认:

:foo!foo@bar.com MODE foo :+w

请注意,此确认在技术上不是对 MODE 的直接回复 - 它是服务器通知客户端其状态的相关更改,这恰好是由客户端命令触发的。

channel 模式也存在类似情况。如果客户端查询当前 channel 模式:

MODE #channel

然后它将期待包含当前“简单” channel 模式的 RPL_CHANNELMODEIS 响应,以及可能提供 channel 创建时间的 RPL_CREATIONTIME 响应。如果它查询当前的禁止列表:

MODE #channel b

然后应该得到零个或多个 RPL_BANLIST 响应,然后是 RPL_ENDOFBANLIST

如果客户端尝试更改 channel 模式:

MODE #channel :+k zounds

那么直接回复要么是错误回复,要么什么都不是;并且如果 channel 模式实际上已更改,它将看到 MODE 命令回显。在后一种情况下,成功的 MODE 命令也将发送到 channel 的其他成员 - 这有助于说明它并不是对初始 MODE 命令的直接回复,而是对其的间接响应。

关于irc - 实现 IRC RFC : How to respond to MODE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12886573/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com