RFC2812 Internet Relay Chat: Client Protocolを読んでみた。（5.2 Error Replies）

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

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

間違い等があれば、ご指摘ください。
# 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.2 Error Replies
* 400〜599の数値は、エラー値として使用する
## 401
##### 401 ERR_NOSUCHNICK
`"<nickname> :No such nick/channel"`
* コマンドに与えられた\<nickname\>パラメータが現在使われていないことを示す

## 402
##### 402 ERR_NOSUCHSERVER
`"<server name> :No such server"`
* \<server name\>パラメータが、現在存在しないことを示す

## 403
##### 403 ERR_NOSUCHCHANNEL
`"<channel name> :No such channel"`
* \<channel name\>パラメータの値が無効であることを示す

## 404
##### 404 ERR_CANNOTSENDTOCHAN
`"<channel name> :Cannot send to channel"`
* (a)か(b)のどちらかに該当するユーザ、または、チャンネルへの参加が禁止されているユーザが、そのチャネルにPRIVMSGコマンドを実行した場合に送信する
  * (a) 送信先のユーザが、mode +n が設定されているチャネルに居ない
  * (b) 送信先のユーザが、mode +m が設定されているチャネルの chanop（または mode +v）でない

## 405
##### 405 ERR_TOOMANYCHANNELS
`"<channel name> :You have joined too many channels"`
* ユーザ参加できるチャンネル数を超えて、別のチャンネルに参加しようとしたときに送信する

## 406
##### 406 ERR_WASNOSUCHNICK
`"<nickname> :There was no such nickname"`

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

## 407
##### 407 ERR_TOOMANYTARGETS
`"<target> :<error code> recipients. <abort message>"`

* このエラーは、以下のような状態でPRIVMSG/NOTICEコマンドを実行したクライアントに返す
  * PRIVMSG/NOTICEコマンドの送信先を示すパラメータのフォーマットが「user@host」で、「user@host」に一致する送信先が複数ある場合
  * 送信先が多すぎる場合
* このエラーは、短縮名を使用して安全なチャンネルにJOINしようとしたクライアントに返す？

本文
> Returned to a client which is attempting to JOIN a safe channel using the shortname when there are more than one such channel.

## 408
##### 408 ERR_NOSUCHSERVICE
`"<service name> :No such service"`

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

## 409
##### 409 ERR_NOORIGIN
`":No origin specified"`
* PING/PONGコマンドにパラメータが与えられていないときに送信する

## 411 ~ 415
##### 411 ERR_NORECIPIENT
`":No recipient given (<command>)"`

##### 412 ERR_NOTEXTTOSEND
`":No text to send"`

##### 413 ERR_NOTOPLEVEL
`"<mask> :No toplevel domain specified"`

##### 414 ERR_WILDTOPLEVEL
`"<mask> :Wildcard in toplevel domain"`

##### 415 ERR_BADMASK
`"<mask> :Bad Server/host mask"`

* 412 ~ 415 は、PRIVMSGコマンドが返すエラー
* 何らかの理由でメッセージが届かなかったことを示す
* ERR_NOTOPLEVEL と ERR_WILDTOPLEVEL は、 "PRIVMSG $\<server\>" や "PRIVMSG #\<host\>" などのマスクを不正に使用した場合に返されるエラー

## 421
##### 421 ERR_UNKNOWNCOMMAND
`"<command> :Unknown command"`
* サーバにとって不明なコマンドであることを示す。登録済みのクライアントに返す

## 422
##### 422 ERR_NOMOTD
`":MOTD File is missing"`

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

## 423
##### 423 ERR_NOADMININFO
`"<server> :No administrative info available"`

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

## 424
##### 424 ERR_FILEERROR
`":File error doing <file op> on <file>"`

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

## 431
##### 431 ERR_NONICKNAMEGIVEN
`":No nickname given"`

* パラメータにニックネームが与えられていないことを示す

## 432
##### 432 ERR_ERRONEUSNICKNAME
`"<nick> :Erroneous nickname"`

* \<nick\>に使用可能ではない文字が含まれている、NICKメッセージを受信したサーバが返す
* \<nick\>で使用可能な文字は、[2.3.1 Message format in Augmented BNF](https://datatracker.ietf.org/doc/html/rfc2812#section-2.3.1)を参照

## 433
##### 433 ERR_NICKNAMEINUSE
`"<nick> :Nickname is already in use"`
* ユーザが既に使用されているニックネームへ変更しようとした場合に返す

## 436
##### 436 ERR_NICKCOLLISION
`"<nick> :Nickname collision KILL from <user>@<host>"`
* 他サーバが管理するユーザのニックネームと、同じニックネームへ変更しようした場合に返す

## 437
##### 437 ERR_UNAVAILRESOURCE
`"<nick/channel> :Nick/channel is temporarily unavailable"`

* 「チャンネル遅延メカニズム？」によって、現在ユーザのJOINコマンドをブロックしているチャンネルに、JOINしようとするユーザに対してサーバが返す値
* 「ニックネーム遅延メカニズム？」によって、使用できないニックネームに変更しようとするユーザに対してサーバが返す

## 441
##### 441 ERR_USERNOTINCHANNEL
`"<nick> <channel> :They aren't on that channel"`
* コマンドがターゲットとするユーザが、指定されたチャンネルにいないとき、サーバが返す

## 442
##### 442 ERR_NOTONCHANNEL
`"<channel> :You're not on that channel"`
* クライアントがメンバーではないchannelに影響を与えるコマンドを実行したとき、サーバが返す

## 443
##### 443 ERR_USERONCHANNEL
`"<user> <channel> :is already on channel"`
* 招待した\<user\>が既に\<channel\>へ参加しているとき、サーバが返す

## 444
##### 444 ERR_NOLOGIN
`"<user> :User not logged in"`

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

## 445
##### 445 ERR_SUMMONDISABLED
`":SUMMON has been disabled"`

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

## 446
##### 446 ERR_USERSDISABLED
`":USERS has been disabled"`

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

## 451
##### 451 ERR_NOTREGISTERED
`":You have not registered"`
* クライアントにユーザ情報が登録されていないことを示すためにサーバが返す
* クライアントは、サーバが詳細な解析をクライアントへ許可する前に、登録しなければならない **[MUST]**

## 461
##### 461 ERR_NEEDMOREPARAMS
`"<command> :Not enough parameters"`
* パラメータが足りないことを示す。多数のコマンドでサーバが返す値

## 462
##### 462 ERR_ALREADYREGISTRED
`":Unauthorized command (already registered)"`
* パスワードなどのユーザ情報や登録情報の変更に失敗したとき、サーバが返す

## 463
##### 463 ERR_NOPERMFORHOST
`":Your host isn't among the privileged"`

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

## 464
##### 464 ERR_PASSWDMISMATCH
`":Password incorrect"`
* パスワードが必要な通信で、クライアントがパスワードを送らなかった、またはパスワードが間違っていた場合に返す

## 465
##### 465 ERR_YOUREBANNEDCREEP
":You are banned from this server"

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

## 466
##### 466 ERR_YOUWILLBEBANNED

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

## 467, 471 ~ 478, 481
##### 467 ERR_KEYSET
`"<channel> :Channel key already set"`
##### 471 ERR_CHANNELISFULL
`"<channel> :Cannot join channel (+l)"`
##### 472 ERR_UNKNOWNMODE
`"<char> :is unknown mode char to me for <channel>"`
##### 473 ERR_INVITEONLYCHAN
`"<channel> :Cannot join channel (+i)"`
##### 474 ERR_BANNEDFROMCHAN
`"<channel> :Cannot join channel (+b)"`
##### 475 ERR_BADCHANNELKEY
`"<channel> :Cannot join channel (+k)"`
##### 476 ERR_BADCHANMASK
`"<channel> :Bad Channel Mask"`
##### 477 ERR_NOCHANMODES
`"<channel> :Channel doesn't support modes"`
##### 478 ERR_BANLISTFULL
`"<channel> <char> :Channel list is full"`
##### 481 ERR_NOPRIVILEGES
`":Permission Denied- You're not an IRC operator"`

* オペレータ権限が必要な操作をするコマンドで発生したエラーに使用する **[MUST]**

## 482
##### 482 ERR_CHANOPRIVSNEEDED
`"<channel> :You're not channel operator"`
* channel operatorではないユーザが、channel operator権限を必要とするコマンドを実行した場合、サーバが返す **[MUST]**

## 483
##### 483 ERR_CANTKILLSERVER
`":You can't kill a server!"`

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

## 484
##### 484 ERR_RESTRICTED
`":Your connection is restricted!"`
* 制限付きのユーザ（「+r」 flag）が、制限を超えたコマンドを実行したとき、サーバが返す
参考：[RFC2812 3.1.5 User mode message](https://datatracker.ietf.org/doc/html/rfc2812#section-3.1.5)

## 485
##### 485 ERR_UNIQOPPRIVSNEEDED
`":You're not the original channel operator"`

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

## 491
##### 491 ERR_NOOPERHOST
`":No O-lines for your host"`
* オペレータとしての接続を許可していないホストに所属するクライアントから、OPERメッセージが来た場合、このエラーを返す **[MUST]**

## 501
##### 501 ERR_UMODEUNKNOWNFLAG
`":Unknown MODE flag"`
* サーバの知らないモードフラグが送られてきたとき、サーバが返す

## 502
##### 502 ERR_USERSDONTMATCH
`":Cannot change mode for other users"`
* 自分以外のユーザーモードを表示、または変更しようとしたとき、サーバが返す

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

##### 492 ERR_NOSERVICEHOST

# 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

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