RFC2812 Internet Relay Chat: Client Protocolを読んでみた。（5.1 Command responses）

# はじめに
どうも。こんにちは。
[42tokyo](https://42tokyo.jp/)といったところで、簡単なIRCサーバの実装を行なっています。

今回は、[5.1 Command responses](https://datatracker.ietf.org/doc/html/rfc2812#section-5.1)を読み、サーバの返信メッセージについて学んで行きたいと思います。

間違い等があれば、ご指摘ください。
# 5. Replies
* この章では、[3. Message Datails](https://datatracker.ietf.org/doc/html/rfc2812#section-3)や[4. Optional features](https://datatracker.ietf.org/doc/html/rfc2812#section-4)で出てくるコマンドへの応答として生成されるnumeric repliesについて説明する
* 各数字には、番号、名前、返信文字列が与えられている

## 5.1 Command responses
* 001〜099の数値は、クライアントとサーバー間でのみ使用され、サーバー間での通信では使用しない
* 200〜399の数値は、コマンドへの応答として生成される

## 001 ~ 004
##### 001 RPL_WELCOME
`"Welcome to the Internet Relay Network <nick>!<user>@<host>"`
##### 002 RPL_YOURHOST
`"Your host is <servername>, running version <ver>"`
##### 003 RPL_CREATED
`"This server was created <date>"`
##### 004 RPL_MYINFO
`"<servername> <version> <available user modes> <available channel modes>"`

* サーバは、ユーザ登録に成功すると、001から004をユーザに送信する

## 005
##### 005 RPL_BOUNCE
`"Try server <server name>, port <port number>"`
* サーバがユーザに送る
* サーバに接続可能なクライアント数の上限に達し、新たなクライアントの接続を拒否するときに送ることが多い
* 代替サーバを提案するメッセージが付く

## 302
##### 302 RPL_USERHOST
`":*1<reply> *( " " <reply> )"`

:::note info
※ 今のところ使用していないので、解説は省略
:::

## 303
##### 303 RPL_ISON
`":*1<nick> *( " " <nick> )"`

:::note info
※ 今のところ使用していないので、解説は省略
:::

## 301, 305, 306
##### 301 RPL_AWAY
`"<nick> :<away message>"`
##### 305 RPL_UNAWAY
`":You are no longer marked as being away"`
##### 306 RPL_NOWAWAY
`":You have been marked as being away"`
* 301から306のリプライは、AWAYコマンドとともに使用される(許可されていれば)
* RPL_AWAYは、離席中のクライアントにPRIVMSGを送るクライアントに送られる
* RPL_AWAYは、クライアントが接続しているサーバからのみ送られる
* RPL_UNAWAYとRPL_NOWAWAYは、クライアントがAWAYメッセージを削除して設定するときに送られる

## 311 ~ 313, 317 ~ 319
##### 311 RPL_WHOISUSER
`"<nick> <user> <host> * :<real name>"`
##### 312 RPL_WHOISSERVER
`"<nick> <server> :<server info>"`
##### 313 RPL_WHOISOPERATOR
`"<nick> :is an IRC operator"`
##### 317 RPL_WHOISIDLE
`"<nick> <integer> :seconds idle"`
##### 318 RPL_ENDOFWHOIS
`"<nick> :End of WHOIS list"`
##### 319 RPL_WHOISCHANNELS
`"<nick> :*( ( "@" / "+" ) <channel> " " )"`

:::note info
※ 今のところ使用していないので、解説は省略
:::

## 314, 369
##### 314 RPL_WHOWASUSER
`"<nick> <user> <host> * :<real name>"`
##### 369 RPL_ENDOFWHOWAS
`"<nick> :End of WHOWAS"`

:::note info
※ 今のところ使用していないので、解説は省略
:::

## 321 ~ 323
##### 321 RPL_LISTSTART
:::note warn
廃止。使用されていない。
:::

##### 322 RPL_LIST
`"<channel> <# visible> :<topic>"`

##### 323 RPL_LISTEND
`":End of LIST"`

* RPL_LIST、RPL_LISTENDは、LISTコマンドに対するリプライとして送信するデータと、そのデータの終了を表す
* 返せるchannelがない場合は、RPL_LISTENDだけを送らなければならない **[MUST]**

## 325, 324, 331, 332
##### 325 RPL_UNIQOPIS
`"<channel> <nickname>"`

##### 324 RPL_CHANNELMODEIS
`"<channel> <mode> <mode params>"`

##### 331 RPL_NOTOPIC
`"<channel> :No topic is set"`

##### 332 RPL_TOPIC
`"<channel> :<topic>"`

* RPL_NOTOPICとRPL_TOPICは、TOPICコマンドのリプライとして使用する
（TOPICコマンドとは、チャンネルのトピックを決めるために使用する）
* トピックが設定されていれば RPL_TOPIC を返す。そうでなければ RPL_NOTOPIC を返す

## 341
##### 341 RPL_INVITING
`"<channel> <nick>"`

* INVITEメッセージが成功したこと、INVITEメッセージがエンドクライアントに渡されたことを示すために、サーバがINVITEメッセージの送信者（招待者）に返す

## 342
##### 342 RPL_SUMMONING
`"<user> :Summoning user to IRC"`

:::note info
※ 今のところ使用していないので、解説は省略
:::

## 346, 347
##### 346 RPL_INVITELIST
`"<channel> <invitemask>"`
##### 347 RPL_ENDOFINVITELIST
`"<channel> :End of channel invite list"`

* 与えられた\<channel\>の\<invitemask\>をリストするとき、サーバは、RPL_INVITELISTとRPL_ENDOFINVITELISTメッセージを使用してリストを送り返すことが要求される
* サーバは、active mask毎にRPL_INVITELISTを作成し返す
* リストの最後、または存在しない場合、サーバは、RPL_ENDOFINVITELISTを返す **[MUST]**

## 348, 349
##### 348 RPL_EXCEPTLIST
`"<channel> <exceptionmask>"`

##### 349 RPL_ENDOFEXCEPTLIST
`"<channel> :End of channel exception list"`

* 与えられた\<channel\>の\<exceptionmask\>をリストするとき、サーバは、RPL_EXCEPTLISTとRPL_ENDOFEXCEPTLISTメッセージを使用してリストを送り返すことが要求される
* サーバは、active mask毎にRPL_EXCEPTLISTを作成し返す
* リストの最後、または存在しない場合、サーバは、RPL_ENDOFEXCEPTLISTを返す **[MUST]**

## 351
##### 351 RPL_VERSION
`"<version>.<debuglevel> <server> :<comments>"`

## 352, 315
##### 352 RPL_WHOREPLY
`"<channel> <user> <host> <server> <nick> ( "H" / "G" > ["*"] [ ( "@" / "+" ) ] :<hopcount> <real name>"`
##### 315 RPL_ENDOFWHO
`"<name> :End of WHO list"`

:::note info
※ 今のところ使用していないので、解説は省略
:::

## 353
##### 353 RPL_NAMREPLY
`"( "=" / "*" / "@" ) <channel> :[ "@" / "+" ] <nick> *( " " [ "@" / "+" ] <nick> )`

* NAMESメッセージへのリプライとして使用する
* サーバは、RPL_NAMREPLYとRPL_ENDOFNAMESのペアをクライアントに返す
* prefixと対応するchannelの種類は、以下の通り
  * 「\"@\"」は、秘密チャンネル（secret channels）
  * 「\"*\"」は、プライベート・チャンネル（private channels）
  * 「\"=\"」は、それ以外のパブリック・チャンネル（public channels）

## 366
##### 366 RPL_ENDOFNAMES
`"<channel> :End of NAMES list"`

* NAMESメッセージへのリプライとして使用する
* サーバは、RPL_NAMREPLYとRPL_ENDOFNAMESのペアをクライアントに返す
* \<channel\>が見つからない場合、サーバはRPL_ENDOFNAMESだけを返す
* 上記の例外として、NAMESメッセージがパラメータなしで送信され、すべてのvisible channelとコンテンツに関するリプライを送り返す場合が挙げられる

## 364, 365
##### 364 RPL_LINKS
`"<mask> <server> :<hopcount> <server info>"`
##### 365 RPL_ENDOFLINKS
`"<mask> :End of LINKS list"`

:::note info
※ 今のところ使用していないので、解説は省略
:::

## 367, 368
##### 367 RPL_BANLIST
`"<channel> <banmask>"`

##### 368 RPL_ENDOFBANLIST
`"<channel> :End of channel ban list"`

* \<channel\>のアクティブな\<banmask\>をリストアップするとき、サーバは、RPL_BANLISTとRPL_ENDOFBANLISTメッセージを使用してリストを返す
* アクティブな\<banmask\>毎に、RPL_BANLISTメッセージを作成する
* \<banmask\>がリストされた後(または存在しない場合)、サーバは、RPL_ENDOFBANLISTを送信しなければならない **[MUST]**

## 371, 374
##### 371 RPL_INFO
`":<string>"`
##### 374 RPL_ENDOFINFO
`":End of INFO list"`

:::note info
※ 今のところ使用していないので、解説は省略
:::

## 375, 372, 376
##### 375 RPL_MOTDSTART
`":- <server> Message of the day - "`
##### 372 RPL_MOTD
`":- <text>"`
##### 376 RPL_ENDOFMOTD
`":End of MOTD command"`

:::note info
※ 今のところ使用していないので、解説は省略
:::

## 381
##### 381 RPL_YOUREOPER
`":You are now an IRC operator"`
* OPERメッセージが成功し、オペレータステータスを得たクライアントに返す

## 382
##### 382 RPL_REHASHING
`"<config file> :Rehashing"`

:::note info
※ 今のところ使用していないので、解説は省略
:::

## 383
##### 383 RPL_YOURESERVICE
`"You are service <servicename>"`

:::note info
※ 今のところ使用していないので、解説は省略
:::

## 391
##### 391 RPL_TIME
`"<server> :<string showing server's local time>"`

:::note info
※ 今のところ使用していないので、解説は省略
:::

## 392 ~ 395
##### 392 RPL_USERSSTART
`":UserID   Terminal  Host"`
##### 393 RPL_USERS
`":<username> <ttyline> <hostname>"`
##### 394 RPL_ENDOFUSERS
`":End of users"`
##### 395 RPL_NOUSERS
`":Nobody logged in"`

:::note info
※ 今のところ使用していないので、解説は省略
:::

## 200 ~ 210, 261, 262
##### 200 RPL_TRACELINK
`"Link <version & debug level> <destination> <next server> V<protocol version> <link uptime in seconds> <backstream sendq> <upstream sendq>"`
##### 201 RPL_TRACECONNECTING
`"Try. <class> <server>"`
##### 202 RPL_TRACEHANDSHAKE
`"H.S. <class> <server>"`
##### 203 RPL_TRACEUNKNOWN
`"???? <class> [<client IP address in dot form>]"`
##### 204 RPL_TRACEOPERATOR
`"Oper <class> <nick>"`
##### 205 RPL_TRACEUSER
`"User <class> <nick>"`
##### 206 RPL_TRACESERVER
`"Serv <class> <int>S <int>C <server> <nick!user|*!*>@<host|server> V<protocol version>"`
##### 207 RPL_TRACESERVICE
`"Service <class> <name> <type> <active type>"`
##### 208 RPL_TRACENEWTYPE
`"<newtype> 0 <client name>"`
##### 209 RPL_TRACECLASS
`"Class <class> <count>"`
##### 210 RPL_TRACERECONNECT
Unused.
##### 261 RPL_TRACELOG
`"File <logfile> <debug level>"`
##### 262 RPL_TRACEEND
`"<server name> <version & debug level> :End of TRACE"`

:::note info
※ 今のところ使用していないので、解説は省略
:::

## 211
##### 211 RPL_STATSLINKINFO
`"<linkname> <sendq> <sent messages> <sent Kbytes> <received messages> <received Kbytes> <time open>"`

:::note info
※ 今のところ使用していないので、解説は省略
:::

## 212
##### 212 RPL_STATSCOMMANDS
`"<command> <count> <byte count> <remote count>"`

:::note info
※ 今のところ使用していないので、解説は省略
:::

## 219, 242
##### 219 RPL_ENDOFSTATS
`"<stats letter> :End of STATS report"`
##### 242 RPL_STATSUPTIME
`":Server Up %d days %d:%02d:%02d"`

:::note info
※ 今のところ使用していないので、解説は省略
:::

## 243
##### 243 RPL_STATSOLINE
`"O <hostmask> * <name>"`

:::note info
※ 今のところ使用していないので、解説は省略
:::

## 221
##### 221 RPL_UMODEIS
`"<user mode string>"`
* クライアント自身のモードに関する問い合わせへの返答を意味する値

## 234, 235
##### 234 RPL_SERVLIST
`"<name> <server> <mask> <type> <hopcount> <info>"`
##### 235 RPL_SERVLISTEND
`"<mask> <type> :End of service listing"`

:::note info
※ 今のところ使用していないので、解説は省略
:::

## 251 ~ 255
##### 251 RPL_LUSERCLIENT
`":There are <integer> users and <integer> services on <integer> servers"`
##### 252 RPL_LUSEROP
`"<integer> :operator(s) online"`
##### 253 RPL_LUSERUNKNOWN
`"<integer> :unknown connection(s)"`
##### 254 RPL_LUSERCHANNELS
`"<integer> :channels formed"`
##### 255 RPL_LUSERME
`":I have <integer> clients and <integer> servers"`

:::note info
※ 今のところ使用していないので、解説は省略
:::

## 256 ~ 259
##### 256 RPL_ADMINME
`"<server> :Administrative info"`
##### 257 RPL_ADMINLOC1
`":<admin info>"`
##### 258 RPL_ADMINLOC2
`":<admin info>"`
##### 259 RPL_ADMINEMAIL
`":<admin info>"`

:::note info
※ 今のところ使用していないので、解説は省略
:::

## 263
##### 263 RPL_TRYAGAIN
`"<command> :Please wait a while and try again."`

:::note info
※ 今のところ使用していないので、解説は省略
:::

## 5.3 Reserved numerics
* 本節では、以下の理由から上記で解説されていないリプライナンバーを取り上げる
  * もう使用されていない
  * 将来的に使用する予定がある
  * 現在使用されているが、一般的ではない

##### 231 RPL_SERVICEINFO
##### 232 RPL_ENDOFSERVICES
##### 233 RPL_SERVICE
##### 300 RPL_NONE
##### 316 RPL_WHOISCHANOP
##### 361 RPL_KILLDONE
##### 362 RPL_CLOSING
##### 363 RPL_CLOSEEND  
##### 373 RPL_INFOSTART
##### 384 RPL_MYPORTIS
##### 213 RPL_STATSCLINE
##### 214 RPL_STATSNLINE
##### 215 RPL_STATSILINE
##### 216 RPL_STATSKLINE
##### 217 RPL_STATSQLINE
##### 218 RPL_STATSYLINE
##### 240 RPL_STATSVLINE 
##### 241 RPL_STATSLLINE
##### 244 RPL_STATSHLINE
##### 244 RPL_STATSSLINE
##### 246 RPL_STATSPING
##### 247 RPL_STATSBLINE
##### 250 RPL_STATSDLINE

# 12.Full Copyright Statement
> Copyright (C) The Internet Society (2000). All Rights Reserved.
> 
> This document and translations of it may be copied and furnished to others,
and derivative works that comment on or otherwise explain it
or assist in its implementation may be prepared, copied, published
and distributed, in whole or in part, without restriction of any kind,
provided that the above copyright notice and this paragraph are included on
all such copies and derivative works.
However, this document itself may not be modified in any way,
such as by removing the copyright notice or references to the Internet Society
or other Internet organizations, except as needed for the purpose of developing
Internet standards in which case the procedures for copyrights defined in
the Internet Standards process must be followed, or as required to
translate it into languages other than English.
> 
> The limited permissions granted above are perpetual and will not be revoked by
the Internet Society or its successors or assigns.
> 
> This document and the information contained herein is provided on an "AS IS" basis and
THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
> 
> Acknowledgement
> 
> Funding for the RFC Editor function is currently provided by the Internet Society.

# さいごに
だいぶ、それっぽいものができてきました。

解説のないリプライナンバーについては、徐々に追加していこうと思います。
ありがとうございました！

# 参考

https://datatracker.ietf.org/doc/html/rfc2812