我想讓自己的Jabber機器人,但我遇到了一點麻煩。但是,如果我嘗試更改機器人的存在,那麼看起來您發送給機器人的所有消息都會延遲。爲什麼我必須在註銷之前將多條消息發送到我的Jabber機器人?
我的意思是當我運行腳本時,我改變了存在,所以我可以看到它在線。然後,當我發送一條消息時,在我爲消息設置的回調子例程被調用之前需要三個消息。發送第三條消息並調用聊天子例程後,它仍會處理我發送的第一條消息。
這實際上不會造成太多的問題,除了當我發送消息「註銷」時它已設置爲註銷,並且必須緊接着兩條消息才能註銷。我不確定我需要做些什麼來解決這個問題,但我認爲它與iq數據包有關,因爲我也有一個iq回調集,並且在設置存在之後它會被調用兩次。
這裏是我的源代碼:
#!/usr/bin/perl use strict; use warnings; #Libraries use Net::Jabber; use DBI; use DBD::mysql; #--------------- Config Vars ----------------- # Jabber Client my $jbrHostname = "DOMAINNAME"; my $jbrUserName = "USERNAME"; my $jbrPassword = "PASSWORD"; my $jbrResource = "RESOURCE"; my $jbrBoss = new Net::Jabber::JID(); $jbrBoss->SetJID(userid=>"USERNAME",server=>$jbrHostname); # MySQL my $dbHostname = "DOMAINNAME"; my $dbName = "DATABASENAME"; my $dbUserName = "USERNAME"; my $dbPassword = "PASSWORD"; #--------------- End Config ----------------- # connect to the db my $dbh = DBI->connect("DBI:mysql:database=$dbName;host=$dbHostname",$dbUserName, $dbPassword, {RaiseError => 1}) or die "Couldn't connect to the database: $!\n"; # create a new jabber client and connect to server my $jabberBot = Net::Jabber::Client->new(); my $status = $jabberBot->Connect(hostname=>$jbrHostname) or die "Cannot connect ($!)\n"; my @results = $jabberBot->AuthSend(username=>$jbrUserName,password=>$jbrPassword,resource=>$jbrResource); if($results[0] ne "ok") { die "Jabber auth error @results\n"; } # set jabber bot callbacks $jabberBot->SetMessageCallBacks(chat=>\&chat); $jabberBot->SetPresenceCallBacks(available=>\&welcome); $jabberBot->SetCallBacks(iq=>\&gotIQ); $jabberBot->PresenceSend(type=>"available"); $jabberBot->Process(1); sub welcome { $jabberBot->MessageSend(to=>$jbrBoss->GetJID(),subject=>"",body=>"Hello There!",type=>"chat",priority=>10); &keepItGoing; } $jabberBot->MessageSend(to=>$jbrBoss->GetJID(),subject=>"",body=>"Hello There! Global...",type=>"chat",priority=>10); #$jabberBot->Process(5); &keepItGoing; sub chat { print "Chat Called!\n"; my ($sessionID,$msg) = @_; $jabberBot->MessageSend(to=>$msg->GetFrom(),subject=>"",body=>"Chatting!",type=>"chat",priority=>10); if($msg->GetBody() ne 'logout') { print $msg->GetBody()."\n"; &keepItGoing; } else { &killBot($msg); } } sub gotIQ { print $_[1]->GetID()."\n"; &chat; } sub keepItGoing { print "Movin' the chains!\n"; my $proc = $jabberBot->Process(1); while(defined($proc) && $proc != 1) { $proc = $jabberBot->Process(1); } } sub killBot { $jabberBot->MessageSend(to=>$_[0]->GetFrom(),subject=>"",body=>"Logging Out!",type=>"chat",priority=>10); $jabberBot->Process(1); $jabberBot->Disconnect(); exit; }
感謝您的幫助!
我有麻煩搞清楚什麼你的標題有你的問題做。 – mob 2010-03-29 03:19:41
我不知道如何使用perl的XMPP模塊。正如我上面所說的那樣,當我改變存在的時候,它所處理的消息似乎被放入一個隊列中,並且它們仍然能夠處理消息#1,理論上它應該處理#3,處理#2當它處理#4時等等。 – cskwrd 2010-03-29 03:31:13
好的,你正在使用XMPP和Perl來完成這項任務。但是,您的消息並未證明XMPP和Perl是問題所在。也許這是因爲你使用'Net :: Jabber'的方式。也許這與緩衝sockethandles或片狀隊列或100其他事情有關。有人可能能夠向您解釋「XMPP模塊如何在perl中工作」(而不是每個其他模塊如何在perl中工作),但我不清楚這會讓您更接近解決您的問題。如何標題「在Jabber響應之前,爲什麼我必須發送我的消息3次?」 – mob 2010-03-29 05:36:22