Kデスクトップ環境

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");

日本語翻訳:レーザーファイブ