| 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>