天狼星の欠片2で使われているCTCP SSTPについて解説します。
Copyright (C) 2001 by YoR@Kyaratech
CTCPは、IRCクライアント間でのデータ交換の為に作られたIRCの拡張機能です。
この文章の目的は、これにSSTPを転送するためのCTCP SSTPを追加することです。
CTCPについてはctcp.newという英文ドキュメントが存在します。
実は何度か日本語訳を作ろうとしたのですが、そのたびに挫折しています(涙)。
(2001/09/29追加)やっと日本語訳を完了しました。まだ準備稿みたいな物ですが、興味のある方は誤訳でも指摘するつもりで読んでみてください。
(この文章では、数値や文字列の表現にC言語の表記を使っています。他の言語で実装する場合はそれぞれ読み替えてください)
"PRIVMSG Sakura \x01VERSION\x01"
CTCPには、メッセージの中に8bitコードの全てを埋め込めるように、二種類のエンコードが用意されています。
CTCPのメッセージの内部用と、通常のIRCメッセージ用に分けられています。
0x01 → \ a (0x5c 0x61)
\ (0x5c) → \ \ (0x5c 0x5c)
\hえんい〜\uえんい〜\e
はこう変換されます。
\\hえんい〜\\uえんい〜\\e
0x00 → 0x10 0 (0x10 0x30)
0x0a → 0x10 n (0x10 0x6e)
0x0d → 0x10 r (0x10 0x72)
0x10 → 0x10 0x10 (0x10 0x10)
CTCP SSTPでは、CTCPのコマンドタグとして、"SSTP"を使います。
その後にスペース(0x20)を一つ入れてSSTPの本文を続けます。
IRCの一行の文字数が512文字(改行コードを含む)に制限されているので、
SSTPを埋め込むとそれを越えることがあります。
そのようなときには、適当に区切れる所でスクリプトを分割し、
複数回に分けて送信してください。
update 2001/04/04
スクリプトの分割はCTCPに埋め込むためのエンコードに引っかからなければ、どこで切ってもかまいません。
受信した後文字化けを起こすことなく結合されることが要求されます。
ただし分割した最後のメッセージには"\e"を含めてください。
この2文字がスクリプトの最後を示す目印になります。
CTCP SSTPで送られるスクリプトは、ここで述べられているものをそのまま送ります。
実際にIRCサーバーに送られるメッセージは、上記のエンコードを行った後、以下のようなものになります。
(書式をCの文字列のものにしているので、\の文字は\\となっていることに注意してください)
"PRIVMSG sakura \x01SSTP SEND SSTP/1.1\x10r\x10nSender: カードキャプター\x10r\x10nScript: \\\\h\\\\s0いくら大学教授とはいえ‥‥\\\\w8\\\\w8書斎に偶然あんな本が置いてあったと思うか?\\\\e\x10r\x10nOption: nodescript,notranslate\x10r\x10nCharset: Shift_JIS\x10r\x10n\x10r\x10n"これは元々はこのようなスクリプトです。
update 2001/03/21
何か。に送るSSTPはPRIVMSGで送ります。
何か。からのリターンはNOTICEで返されます。
update 2001/03/28
そのときには、PRIVMSGで送ってきた相手に直接送り返します。