RFC2812 Internet Relay Chat: Client Protocolを読んでみた。（3.3 Sending messages）

# はじめに
どうも。こんにちは。
[42tokyo](https://42tokyo.jp/)といったところで、簡単なIRCサーバの実装を行なっています。
今回は、[3.3　Sending messages](https://datatracker.ietf.org/doc/html/rfc2812#section-3.3)を読み、メッセージの送信に関連したコマンドについて学んで行きたいと思います。

この記事の対象範囲は以下のとおりです。
* 3.3　Sending messages
  * 3.3.1 Private messages
  * 3.3.2 Notice

間違い等があれば、ご指摘ください。
## 3.3　Sending messages
* IRCプロトコルの主目的は、クライアント同士が通信するための基盤を提供すること
* テキストメッセージの配送を実行するコマンドは、以下のものだけ
  * PRIVMSG
  * NOTICE
  * SQUERY[(3.5 Service Query and Commandsで解説)](https://datatracker.ietf.org/doc/html/rfc2812#section-3.5)

### 3.3.1 Private messages
```
   Command: PRIVMSG
Parameters: <msgtarget> <text to be sent>

Numeric Replies:
           411 ERR_NORECIPIENT      ":No recipient given (<command>)"
           412 ERR_NOTEXTTOSEND     ":No text to send"
           404 ERR_CANNOTSENDTOCHAN "<channel name> :Cannot send to channel"
           413 ERR_NOTOPLEVEL       "<mask> :No toplevel domain specified"
           414 ERR_WILDTOPLEVEL     "<mask> :Wildcard in toplevel domain"
           407 ERR_TOOMANYTARGETS   "<target> :<error code> recipients. <abort message>"
           401 ERR_NOSUCHNICK       "<nickname> :No such nick/channel"
           301 RPL_AWAY             "<nick> :<away message>"

Examples:
  :Angel!wings@irc.org PRIVMSG Wiz :Are you receiving this message ?
  「:Angel!wings@irc.orgから、Wizへメッセージを送信」

  PRIVMSG Angel :yes I'm receiving it !
  「Angelへメッセージを送る」

  PRIVMSG jto@tolsun.oulu.fi :Hello !
  「tolsun.oulu.fiサーバのユーザ"jto"にメッセージを送る」

  PRIVMSG kalt%millennium.stealth.net@irc.stealth.net :Are you a frog?
  「irc.stealth.netサーバのユーザ"kalt"（ホスト名millennium.stealth.net）へのメッセージ」

  PRIVMSG kalt%millennium.stealth.net :Do you like cheese?
  「ローカルサーバーのユーザ"kalt"（ホスト名millennium.stealth.net）へのメッセージ」

  PRIVMSG Wiz!jto@tolsun.oulu.fi :Hello !
  「ニックネーム"Wiz"（ユーザー名"jto"、ホスト名tolsun.oulu.fi）から接続しているユーザーへのメッセージ」

  PRIVMSG $*.fi :Server tolsun.oulu.fi rebooting.
  「サーバ名が[*.fi]と一致するサーバに所属する全員へのメッセージ」

  PRIVMSG #*.edu :NSFNet is undergoing work, expect interruptions
  「ホスト名が[*.edu]と一致するホストから来たすべてのユーザへのメッセージ」
```
* PRIVMSGはユーザ間のプライベートなメッセージ送信や、チャンネルへのメッセージ送信に使用する
* \<msgtarget\>パラメータには、通常、送信先(受信者)のニックネームかチャンネル名を与える
* \<msgtarget\>パラメータには、host mask (#\<mask\>) やserver mask ($\<mask\>) を指定できる
どちらの場合も、サーバはそのマスクにマッチするサーバかホストにのみPRIVMSGを送る
* マスクには少なくとも1つの「.（ドット）」を入れなければならない
* 最後の「.（ドット）」に続くワイルドカードは使用できない **[MUST]**
この条件は、マスクに「#＊」や「$＊」を指定し、全ユーザにブロードキャストされるのを防ぐためにある
* 使用できるワイルドカードは「＊」と「？」
* PRIVMSGコマンドの拡張機能（送信先にワイルドカードを使用すること。か？）は、オペレータのみが使用できる

### 3.3.2 Notice
```
   Command: NOTICE
Parameters: <msgtarget> <text>
```
* NOTICEコマンドはPRIVMSGコマンドと同じ働きをする
* NOTICEコマンドとPRIVMSGコマンドの違いは、NOTICEメッセージを受け取ったクライアントは、リプライしてはいけないこと **[MUST NOT]**
* これは、サーバにも適用される
* サーバは、 NOTICEを受信したとき、クライアントにエラー応答してはならない **[MUST NOT]**
このルールは、受信した何かに応答してクライアントが自動的に何かを送るといったループを避けることを目的としている
* NOTICEコマンドは、ユーザだけでなくサービスも使用できる
* これは通常、サービスやオートマトン(AIや他の対話型プログラムが動作を制御するクライアント)で使用される
* Repliesなどの詳細と例は[3.3.1 PRIVMSG](#331-private-messages)を参照

# 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.

# さいごに
いよいよIRCサーバの中心的な機能を実装していきます。
とても楽しみです。
ワイルドカードの対応が気がかりですが。
ありがとうございました！

# 参考

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