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