KSirc ハンドブック
前のページ | 第 5章Sirc クライアントプログラミング |

# 5.7. ボット

ircIIにボットを作るように、sircスクリプトにボットを作ることができます。それはおそらく悪い考えではないでしょう。というのは、全ての不完全なネットワークプログラミングやすでにサーバ類解析で、処理上素晴らしく強力なプログラミング言語(perl)があるからです。

しかしながらsircは、決してボットクライアントとはされません。また、ボットサポートのためベルや警笛を充実するつもりもありません。ですからこれについては-lや-qオプションを使って最低限のサポートのみ提供しました。

考えとしては、内部機能やフックの設定のようにボットをプログラムにして、`&addhook`や`&docommand`にコールし、それからこのようにsircをロードします。(明らかにssfeはありません。)

`nohup sirc -d -q -l <botfile> -i <bot's ircname> <nick> <server> >/dev/null &`

もちろん、これら全て`<>'s`がありません。`>/dev/null`は、そこで出力を制御します。というのは、どのようにしても画面上でそれを読んでいないはずだからです。

ボットでは、`"nick in use"`もしくは`"invalid" nick"`を伝えるラインを(数値フックを用いて)捕らえ、あるランダムなニックでサーバへのラインを送信し、それらをスキップさせたり、または、ボットはユーザがニックを要求しようとすることを阻止します。`"disconnect"`にもフックを設定し、`&docommand("server 0")`または`"server some.server"`を行わせるとよいでしょう。

サーバへの接続が確立する前でもファイルがロードされることも記憶しておいて下さい。そして、`&sl`へコールし、大概そこで`&docommand's`が失敗するでしょう。

以下はボットの例です。これは接続、チャンネルへ参加、切断された際の再接続、いくつかのコマンドへの応答、オーナのops、そして公的なことを除く全てをファイル上でログとして取ります。"mybot"のようなファイルにそれを保存すれば、これをロードでき、BubbleBotの方がよければ次のようにしてください。

`nohup sirc -d -q -l mybot -i "bot in sirc" BubbleBot some.server.edu >/dev/null`

     $botowner="espel\@clipper.ens.fr";	# 自分のアドレスへ変更

     $logfile=$ENV{'HOME'}."/.botlog";
     &docommand("log on");

     sub hook_publicstuff {		# 公的チャッタを表示禁止
       $silent=1;			# ログファイルを作成しない
     }
     &addhook("public", "publicstuff");

     sub hook_connected {
       &sl("JOIN #BotTub");
     }
     &addhook("376", "connected");   # "end of MOTD" 数値に参加

     srand;				# init ランダム数値生成

     sub hook_badnick {
       local($n);
       $n="B".(int(rand(1000000))+4587454);  # 不要情報ニックの送信...
       &sl("NICK $n");
       $skip=1;
     }
     &addhook("432", "badnick");             # 取り入れられると伝達されたら
     &addhook("433", "badnick");

     sub hook_disc {         # 切断されたら
       sleep(30);		# 30秒待機  (サーバがダウンしているならば
     			# マシンをダウンせずにクロール)
       &docommand("server 1"); # 同サーバに再接続
     }
     &addhook("disconnect", "disc");

     sub hook_joined {	# 誰かが参加したら
       local($ch)=($_[0]);
       $ch =˜ tr/A-Z/a-z/;	# 英小文字でチャンネルを設置
       if (&eq($botowner, "$user\@$host") && $haveops{$ch}) {
         &sl("MODE $ch +o $who");	# op if that's the owner and we have ops
       }
     }
     &addhook("join", "joined");

     sub hook_message {
       if (&eq($botowner, "$user\@$host")) {  # オーナからの msg ならば
         if ($_[0] =˜ /^die$/i) {             # die -> die
           &docommand("quit");
         } elsif ($_[0] =˜ /^say /i) {        # say <something> -> say it
           &say($');
         } elsif ($_[0] =˜ /^nick /i) {       # nick <nick> -> change nicks
           &sl("NICK $'");
         }
     # add more commands here
       }
     }
     &addhook("msg", "message");

日本語翻訳：レーザーファイブ `<info@laser5.co.jp>`

前のページ | Home |
メインselect()ループにファイルハンドルを追加する | Up |