实现IRC RFC:如何响应MODE?

时间:2012-10-14 21:12:38

标签: irc

我正在尝试编写自己的IRC服务器。我正在引用IRC RFC,但这对我来说有点混乱。如果我严格遵守RFC,我不认为任何流行的客户端都可以使用我的服务器,比如mIRC。例如,RFC表示服务器应响应成功的MODE命令以下数字响应之一:RPL_BANLISTRPL_CHANNELMODEISRPL_ENDOFBANLISTRPL_UMODEIS。这将使我相信,在成功的用户模式更改后,我会回复RPL_UMODEIS,尽管RFC似乎没有明确说明。

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

你应该如何回应MODE命令?是否有更好的格式化RFC,它有一个简单的命令和响应图表,或什么?

2 个答案:

答案 0 :(得分:5)

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的直接回复 - 它是服务器通知客户端其状态的相关更改,这恰好是由客户端命令触发的。

频道模式存在类似情况。如果客户端使用以下方式查询当前通道模式:

MODE #channel

然后它会期望包含当前“简单”通道模式的RPL_CHANNELMODEIS响应,并且可能是RPL_CREATIONTIME响应,从而提供通道创建时间。如果它使用以下命令查询当前禁止列表:

MODE #channel b

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

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

MODE #channel :+k zounds

然后直接回复将是错误回复或没有;如果实际更改了通道模式,它将看到MODE命令回显。在后一种情况下,成功的MODE命令也将被发送到通道的其他成员 - 这有助于说明它实际上不是对初始MODE命令的直接回复,而是对...的间接响应它

答案 1 :(得分:1)

它应该是用户模式字符串。通常回复是:

  • 用于+/- b模式:RPL_BANLIST和/或禁止列表然后RPL_ENDOFBANLIST
  • 用于频道模式:RPL_CHANNELMODEIS
  • 使用rmodes:RPL_UMODEIS

有时发出MODE命令不是为了改变模式而是为了列出它(比如没有任何参数的+ b)。所以作为回应,你给出任何适当的数字代码,然后吐出模式。有关于RFC 2812 update to RFC 1459中服务器的内容的更多信息,更多关注客户端。