2012-10-14 48 views
3

我想編碼我自己的IRC服務器。我參考了IRC RFC,但對我來說有點困惑。如果我要嚴格遵守RFC,我認爲任何受歡迎的客戶都不會與我的服務器一起工作,例如mIRC。例如,RFC表示服務器應該響應成功的MODE命令以下數字響應之一:RPL_BANLIST,RPL_CHANNELMODEIS,RPL_ENDOFBANLIST,RPL_UMODEIS。這會讓我相信,在成功改變用戶模式的情況下,我會用RPL_UMODEIS做出響應,儘管RFC似乎沒有明確說明。實現IRC RFC:如何響應MODE?

但是,當我檢查到另一個開源IRC服務器的源代碼時,我看到它用一個非數字命令'MODE'響應。它只是回顯它看起來像的MODE命令。

你應該如何迴應MODE命令?有一個更好的格式化的RFC,有一個簡單的命令和響應圖表,或什麼?

回答

5

RFC 1459是着名的稀疏。它不會告訴你編寫服務器所需的一切。

在這種情況下,缺少的是查詢現有模式的MODE命令和設置新模式的MODE命令之間的區別。在模式查詢的情況下,客戶端將收到指示現有模式的數字回覆;在更改模式的情況下,客戶端將不會收到直接的數字回覆,除非出現錯誤。但是,如果模式成功更改了,則客戶端將從服務器接收MODE通知其更改。

因此,舉例來說,如果客戶端的缺口是foo,並將其發送:

MODE foo 

那麼這是查詢其目前的用戶模式 ​​- 它會期待像RPL_UMODEIS回覆:

:irc.example.org 221 foo :+i 

如果然後客戶發送:

MODE foo :+w 

然後這是改變它小號用戶模式 ​​- 它要麼得到一個數字錯誤,如ERR_USERSDONTMATCH或模式改變的確認:

:[email protected] 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

它應該是用戶模式字符串。典型地,該反應是:

  • 爲+/- b兩個模式:RPL_BANLIST和/或然後RPL_ENDOFBANLIST
  • 禁止列表的信道的模式:RPL_CHANNELMODEIS
  • 使用rmodes:RPL_UMODEIS

有時發出MODE命令不是爲了改變模式,而是爲了列出它(例如+ b沒有任何參數)。所以作爲迴應,你給任何適當的數字代碼,只是吐出模式(S)。還有一些關於RFC 2812 update to RFC 1459服務器期望什麼的更多信息,它更側重於客戶端。

相關問題