实现IRC RFC:如何响应MODE?

Rya*_*yan 3 irc

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

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

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

caf*_*caf 5

RFC 1459是着名的稀疏.它没有告诉您编写服务器时需要知道的一切.

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

例如,如果客户端的缺口是foo,它发送:

MODE foo
Run Code Online (Sandbox Code Playgroud)

然后这是查询其当前的用户模式 ​​- 它会期望RPL_UMODEIS回复如下:

:irc.example.org 221 foo :+i
Run Code Online (Sandbox Code Playgroud)

如果客户端发送:

MODE foo :+w
Run Code Online (Sandbox Code Playgroud)

然后这会改变它的用户模式 ​​- 它将获得类似的数字错误ERR_USERSDONTMATCH或模式更改的确认:

:foo!foo@bar.com MODE foo :+w
Run Code Online (Sandbox Code Playgroud)

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

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

MODE #channel
Run Code Online (Sandbox Code Playgroud)

那么它将期望RPL_CHANNELMODEIS包含当前"简单"通道模式的RPL_CREATIONTIME响应,并且可能是给出通道创建时间的响应.如果它查询当前禁止列表:

MODE #channel b
Run Code Online (Sandbox Code Playgroud)

然后应该得到零或更多的RPL_BANLIST响应,然后是a RPL_ENDOFBANLIST.

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

MODE #channel :+k zounds
Run Code Online (Sandbox Code Playgroud)

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