【メモ】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);
    }
   }
}