【メモ】irc.twitch.tvはNOTICEコマンドを受け付けない
タイトルの通り。忘れないうちに土曜日の作業メモ。
IRCサーバーと通信するbotは、次の慣習に従うことが強く推奨されている。
- 受信したPRIVMSGコマンドに反応しないこと
- PRIVMSGコマンドを送信しないこと
- botから送信するテキストメッセージにはNOTICEコマンドを用いること
これによりbotのメッセージに別なbotが反応し、それにまた別なbotが...という事態の発生を予防できる。(※と言うことだと思うけどIRC初心者なのでアレ)
このことを踏まえて、例えばLimechat2のスクリプト処理系は、PRIVMSGコマンドの送信をグローバル関数として提供していない。マクロについても同様。ところがタイトルの通りtwitchtvのチャットサーバーであるirc.twitch.tvはNOTICEコマンドに対して421: ERR_UNKNOWNCOMMANDを返却する。そのためbotからのメッセージにもPRIVMSGコマンドを使用する必要がある。以下Limechat2のスクリプト例(JScript)。
/* このスクリプトにより、ラダー勝敗予想betの開催と締切を行うチャット用コマンドopenladderbetを定義する。 自分自身から送信された"!openladderbet"メッセージに反応し、時間差をおいてModBotのコマンド2つとチャット参加者用案内メッセージを配信用チャンネル#lapack_rtsに送信する。 送信される2つのModBotコマンドとは"!bet open"と"!bet close"である。 */ //CONSTANTS //Raw commands strings: irc.twitch.tvはNOTICEコマンドを受け付けないため、PRIVMSGコマンドを送信する必要がある。そのために必要な生のIRCコマンド文字列を定義する。 PRIVMSG_OPENBET = "PRIVMSG #lapack_rts !bet open Lapack,Opponent"; PRIVMSG_ANNOUNCEMENT = "PRIVMSG #lapack_rts ラダーの勝敗予想betがオープンしました。betは120秒後に締め切られます。"; PRIVMSG_CLOSEBET = "PRIVMSG #lapack_rts !bet close"; //bet openからcloseまでの時間 timeToBet = 120000; //ラダーbet開催コマンドのマッチング用パターン文字列 openladderbet = "/^!openladderbet$/" //自分自身からの!openladderbetコマンドにのみ反応し、bet open, betの案内メッセージをチャンネルに送信して一定時間後にbet closeを行う。 function event::onChannelText(prefix, channel, text) { if (prefix.nick == myNick) { if (text.match(openladderbet) ) { sendRaw(PRIVMSG_OPENBET); sendRaw(PRIVMSG_ANNOUNCEMENT); setTimeout(function(){sendRaw(PRIVMSG_CLOSEBET);}, timeToBet); } } }