IRCをやっていると、ログをとるためにルームに「Bot」と呼ばれる常駐プログラムを仕込んでいる人が多くいます。もちろん、Botのプログラムは既に便利で高機能なものが様々ありますが、こういったものを自分流に作っていくのも、プログラミングの楽しみの一つというものです。
今回はSmartIRCというライブラリを使用し、IRCに常駐し、こちらの命令に応答する簡単なプログラムを作ってみましょう。
まずは、pearコマンドでNet_SmartIRCのライブラリをインストールします。
pear install Net_SmartIRC
pearコマンドが使用できない場合は直接tgzパッケージをダウンロードして展開しても構いません。
SmartIRCでのBot作成には、2つのオブジェクトが必要です。IRCサーバ、チャンネルへのアクセスを実行するオブジェクトと、チャンネルへjoinした後のBotオブジェクトです。
以下に、基本的なソースを示します。
<?php
require_once("Net/SmartIRC.php");
class mybot
{
function timer(&$irc)
{
$irc->message(SMARTIRC_TYPE_NOTICE, "#phppro", date("Y-m-d H:i:s"));
}
function hello(&$irc, &$data)
{
$irc->message(SMARTIRC_TYPE_NOTICE, $data->channel, 'こんにちは');
}
function quit (&$irc)
{
$irc->quit('さようなら');
}
}
$bot = new mybot();
$irc = new Net_SmartIRC();
$irc->registerTimehandler(10000, $bot, 'timer');
$irc->registerActionhandler(SMARTIRC_TYPE_CHANNEL, '^hi$', $bot, 'hello');
$irc->registerActionhandler(SMARTIRC_TYPE_CHANNEL, '^quit$', $bot, 'quit');
$irc->connect("irc.phppro.jp", 6667);
$irc->login("test_bot", "test");
$irc->join(array("#phppro"));
$irc->listen();
?>
最初に作成しているのが、mybotクラスです。このクラスの中に、botの各動作をメソッドとして記述します。定義したメソッドをSmartIRCのインスタンスのイベントハンドラに登録することで、IRCチャンネル内からの指示や経過時間で任意の動作を行えます。
簡単にここで使用したSmartIRCクラスメソッドの説明を補足しておきます。registerTimehandlerメソッドは、特定の時間が経過するごとに、指定したインスタンスのメソッドを繰り返し実行します。
ここでは、10000ミリ秒経過するごとに$botインスタンスのtimerメソッドを実行するようになっています。timerメソッドは、#phpproチャンネルに現在の日付と時刻をNoticeメッセージとして吐き出す動作を行います。
registerActionhandlerメソッドは、特定のメッセージを受け取った際に、指定したインスタンスのメソッドが実行されます。
第1引数には、受け取るメッセージの種類を指定します。SMARTIRC_TYPE_CHANNELの指定は通常のメッセージのことです。
第2引数には、トリガーとなるメッセージを記述しますが、ここの記述には正規表現を用いることが出来ます。
第3、第4引数はそれぞれ実行するインスタンスとそのメソッドです。
ここで登録した2つのメソッドは、[hi]と話しかけると[こんにちは]と返し、[quit]と話しかけると[さようなら]といってサーバから落ちます。
このように、Net_SmartIRCを用いることで非常に簡単にBotを作成することが出来ます。
あとは、mybotクラスのメソッドを工夫することでニュースを集めて投げるBotなど、様々な機能を持ったBotが作れると思います。
これを使って、自分のお気に入りBotを作ってみてはいかがですか?
※Botにむちゃくちゃな動作をさせるとただの荒らしになります。モラルは守ってプログラミングを楽しみましょう。
PEAR::Net_SmartIRC