3

Jabber ボットを作成しようとしていますが、メッセージを待っている間、それを実行し続けることができません。スクリプトを継続的に実行するにはどうすればよいですか? 理論的には、メッセージをチェックしてそれに応じて反応するように設定した while ループを持つサブルーチンを呼び出してみましたが、スクリプトはそのように動作しません。

これが私のソースです:http://pastebin.com/03Habbvh

# Jabber ボットのコールバックを設定
$jabberBot->SetMessageCallBacks(chat=>\&chat);
$jabberBot->SetPresenceCallBacks(available=>\&welcome,unavailable=>\&killBot);
$jabberBot->SetCallBacks(receive=>\&prnt,iq=>\&gotIQ);

$jabberBot->PresenceSend(type="available");
$jabberBot->Process(1);

サブウェルカム
{
    print "ようこそ!\n";
    $jabberBot->MessageSend(to=>$jbrBoss->GetJID(),subject=>"",body=>"こんにちは!",type=>"chat",priority=>10);
    &続けて;
}

サブプリント
{
    print $_[1]."\n";
}

#$jabberBot->MessageSend(to=>$jbrBoss->GetJID(),subject=>"",body=>"こんにちは!グローバル...",type=>"chat",priority=>10);
#$jabberBot->Process(5);
#&続けて;

サブチャット
{
    私 ($sessionID,$msg) = @_;
    $dump->pl2xml($msg);
    if($msg->GetType() ne 'get' && $msg->GetType() ne 'set' && $msg->GetType() ne '')
    {
        私の $jbrCmd = &trimSpaces($msg->GetBody());
        my $dbQry = $dbh->prepare("SELECT コマンド、承認 FROM コマンド WHERE メッセージ = '".lc($jbrCmd)."'");
        $dbQry->execute();
        if($dbQry->rows() > 0 && $jbrCmd !~ /^insert/si)
        {
            私の $ref = $dbQry->fetchrow_hashref();
            $dbQry->finish();
            $jabberBot->MessageSend(to=>$msg->GetFrom(),subject=>"",body=>$ref->{'acknowledgement'},type=>"chat",priority=>10);
            eval $ref->{'コマンド'};
            &続けて;
        }
        そうしないと
        {
            $jabberBot->MessageSend(to=>$msg->GetFrom(),subject=>"",body=>"わからなかった!",type=>"チャット",priority=>10);
            $dbQry->finish();
            &続けて;
        }
    }
}

サブゴットIQ
{
    print "iq\n";
}

サブトリムスペース
{
    私の $string = $_[0];
    $string =~ s/^\s+//; #先頭のスペースを削除
    $string =~ s/\s+$//; #末尾のスペースを削除
    $文字列を返します。
}

サブkeepItGoing
{

    print "keepItGoing!\n";
    私の $proc = $jabberBot->Process(1);
    while(定義済み($proc) && $proc != 1)
    {
        $proc = $jabberBot->Process(1);
    }
}

サブキルボット
{
    print "殺害\n";
    $jabberBot->MessageSend(to=>$_[0]->GetFrom(),subject=>"",body=>"Logging Out!",type=>"chat",priority=>10);
    $jabberBot->Process(1);
    $jabberBot->Disconnect();
    出口;
}
4

3 に答える 3

6

POEにはかなり優れたイベント フレームワークがいくつかあります。Jabber 用 (POE::Component::Jabber) がどれだけ優れているかはわかりませんが、一見の価値はあるでしょう。

于 2010-03-29T06:50:28.767 に答える
4

AnyEvent::XMPPはとてつもなく包括的であり、AnyEventを使用しているため、サポートされているループ ( AnyEvent 自身のEventEVTkGlib/Gtk、さらにはPOE )を備えた任意のイベント駆動型アプリケーションで実行できます。

于 2010-03-29T11:57:50.860 に答える
2

これを行うことで、例を機能させることができると思います:

0 while $jabber->Process

そうは言っても、AnyEvent (私の個人的なお気に入り) や POE (伝統的な選択肢) などの適切なイベント処理フレームワークを使用することを強くお勧めします。

于 2010-03-29T06:53:27.377 に答える