我正在尝试制作自己的 Jabber 机器人,但遇到了一些麻烦。我已经让我的机器人响应消息,但是,如果我尝试更改机器人的存在,那么您发送给机器人的所有消息似乎都会延迟。
我的意思是,当我运行脚本时,我会更改存在,以便我可以看到它在线。然后,当我向它发送一条消息时,我为消息设置的回调子例程需要三个时间才能被调用。在发送第三条消息并调用聊天子例程后,它仍会处理我发送的第一条消息。
这实际上并没有造成太大的问题,只是我将它设置为在我发送消息“注销”时注销,并且必须在它之后再发送两条消息才能注销。我不确定我必须做些什么来解决这个问题,但我认为它与 iq 数据包有关,因为我也设置了 iq 回调,并且在设置存在后它会被调用两次。
这是我的源代码:
#!/usr/bin/perl 使用严格; 使用警告; #图书馆 使用 Net::Jabber; 使用 DBI; 使用 DBD::mysql; #--------------- 配置变量 ----- # Jabber 客户端 我的 $jbrHostname = "域名"; 我的 $jbrUserName = "用户名"; 我的 $jbrPassword = "密码"; 我的 $jbrResource = "资源"; 我的 $jbrBoss = new Net::Jabber::JID(); $jbrBoss->SetJID(userid=>"USERNAME",server=>$jbrHostname); # MySQL 我的 $dbHostname = "域名"; 我的 $dbName = "数据库名称"; 我的 $dbUserName = "用户名"; 我的 $dbPassword = "密码"; #--------------- 结束配置 ----- # 连接到数据库 我的 $dbh = DBI->connect("DBI:mysql:database=$dbName;host=$dbHostname",$dbUserName, $dbPassword, {RaiseError => 1}) 或 die "无法连接到数据库:$ !\n"; # 创建一个新的 jabber 客户端并连接到服务器 我的 $jabberBot = Net::Jabber::Client->new(); 我的 $status = $jabberBot->Connect(hostname=>$jbrHostname) 或死 "无法连接 ($!)\n"; 我的@results = $jabberBot->AuthSend(username=>$jbrUserName,password=>$jbrPassword,resource=>$jbrResource); if($results[0] ne "ok") { die "Jabber 身份验证错误@results\n"; } # 设置 jabber bot 回调 $jabberBot->SetMessageCallBacks(chat=>\&chat); $jabberBot->SetPresenceCallBacks(可用=>\&welcome); $jabberBot->SetCallBacks(iq=>\&gotIQ); $jabberBot->PresenceSend(type=>"available"); $jabberBot->进程(1); 子欢迎 { $jabberBot->MessageSend(to=>$jbrBoss->GetJID(),subject=>"",body=>"你好!",type=>"chat",priority=>10); &保持下去; } $jabberBot->MessageSend(to=>$jbrBoss->GetJID(),subject=>"",body=>"Hello There! Global...",type=>"chat",priority=>10); #$jabberBot->进程(5); &保持下去; 子聊天 { 打印“已调用聊天!\n”; 我的 ($sessionID,$msg) = @_; $jabberBot->MessageSend(to=>$msg->GetFrom(),subject=>"",body=>"正在聊天!",type=>"chat",priority=>10); if($msg->GetBody() ne '注销') { 打印 $msg->GetBody()."\n"; &保持下去; } 别的 { &killBot($msg); } } 子得到IQ { 打印 $_[1]->GetID()."\n"; &聊天; } 子 keepItGoing { print "Movin' the chain!\n"; 我的 $proc = $jabberBot->Process(1); 而(定义($proc)&& $proc!= 1) { $proc = $jabberBot->进程(1); } } 子杀戮机器人 { $jabberBot->MessageSend(to=>$_[0]->GetFrom(),subject=>"",body=>"注销!",type=>"chat",priority=>10); $jabberBot->进程(1); $jabberBot->断开连接(); 出口; }
谢谢你的帮助!