3

我正在尝试制作 Jabber 机器人,但在等待消息时无法保持其运行。如何让我的脚本连续运行?我尝试调用一个子程序,该子程序有一个 while 循环,理论上我已经设置它来检查任何消息并做出相应的反应,但我的脚本并没有那样做。

这是我的来源: http: //pastebin.com/03Habbvh

# 设置 jabber bot 回调
$jabberBot->SetMessageCallBacks(chat=>\&chat);
$jabberBot->SetPresenceCallBacks(available=>\&welcome,unavailable=>\&killBot);
$jabberBot->SetCallBacks(receive=>\&prnt,iq=>\&gotIQ);

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

子欢迎
{
    打印“欢迎!\n”;
    $jabberBot->MessageSend(to=>$jbrBoss->GetJID(),subject=>"",body=>"你好!",type=>"chat",priority=>10);
    &保持下去;
}

子打印
{
    打印 $_[1]."\n";
}

#$jabberBot->MessageSend(to=>$jbrBoss->GetJID(),subject=>"",body=>"Hello There! Global...",type=>"chat",priority=>10);
#$jabberBot->进程(5);
#&保持下去;

子聊天
{
    我的 ($sessionID,$msg) = @_;
    $dump->pl2xml($msg);
    if($msg->GetType() ne 'get' && $msg->GetType() ne 'set' && $msg->GetType() ne '')
    {
        我的 $jbrCmd = &trimSpaces($msg->GetBody());
        我的 $dbQry = $dbh->prepare("SELECT command,acknowledgement FROM commands WHERE message = '".lc($jbrCmd)."'");
        $dbQry->执行();
        if($dbQry->rows() > 0 && $jbrCmd !~ /^insert/si)
        {
            我的 $ref = $dbQry->fetchrow_hashref();
            $dbQry->完成();
            $jabberBot->MessageSend(to=>$msg->GetFrom(),subject=>"",body=>$ref->{'acknowledgement'},type=>"chat",priority=>10);
            评估 $ref->{'command'};
            &保持下去;
        }
        别的
        {
            $jabberBot->MessageSend(to=>$msg->GetFrom(),subject=>"",body=>"我没听懂你!",type=>"chat",priority=>10);
            $dbQry->完成();
            &保持下去;
        }
    }
}

子得到IQ
{
    打印“iq\n”;
}

子修剪空间
{
    我的 $string = $_[0];
    $string =~ s/^\s++//; #删除前导空格
    $string =~ s/\s+$//; #删除尾随空格
    返回$字符串;
}

子 keepItGoing
{

    打印 "keepItGoing!\n";
    我的 $proc = $jabberBot->Process(1);
    而(定义($proc)&& $proc!= 1)
    {
        $proc = $jabberBot->进程(1);
    }
}

子杀戮机器人
{
    打印“杀戮\n”;
    $jabberBot->MessageSend(to=>$_[0]->GetFrom(),subject=>"",body=>"注销!",type=>"chat",priority=>10);
    $jabberBot->进程(1);
    $jabberBot->断开连接();
    出口;
}
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 回答