KSirc ハンドブック | ||
---|---|---|
前のページ | 第 5章Sirc クライアントプログラミング |
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>