2010-03-29 2 views
3

Jabber 봇을 만들려고하는데 메시지를 기다리는 동안 계속 실행하는 데 문제가 있습니다. 스크립트를 계속 실행하려면 어떻게해야합니까? while 루프를 가지고있는 서브 루틴을 호출 해 보았습니다. 이론적으로는 메시지를 확인하고 그에 따라 반응하도록 설정했지만 스크립트는 그런 식으로 행동하지 않습니다. http://pastebin.com/03HabbvhPerl Jabber 봇을 이벤트 기반 프로그램으로 만들려면 어떻게해야합니까?

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

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

sub welcome 
{ 
    print "Welcome!\n"; 
    $jabberBot->MessageSend(to=>$jbrBoss->GetJID(),subject=>"",body=>"Hello There!",type=>"chat",priority=>10); 
    &keepItGoing; 
} 

sub prnt 
{ 
    print $_[1]."\n"; 
} 

#$jabberBot->MessageSend(to=>$jbrBoss->GetJID(),subject=>"",body=>"Hello There! Global...",type=>"chat",priority=>10); 
#$jabberBot->Process(5); 
#&keepItGoing; 

sub chat 
{ 
    my ($sessionID,$msg) = @_; 
    $dump->pl2xml($msg); 
    if($msg->GetType() ne 'get' && $msg->GetType() ne 'set' && $msg->GetType() ne '') 
    { 
     my $jbrCmd = &trimSpaces($msg->GetBody()); 
     my $dbQry = $dbh->prepare("SELECT command,acknowledgement FROM commands WHERE message = '".lc($jbrCmd)."'"); 
     $dbQry->execute(); 
     if($dbQry->rows() > 0 && $jbrCmd !~ /^insert/si) 
     { 
      my $ref = $dbQry->fetchrow_hashref(); 
      $dbQry->finish(); 
      $jabberBot->MessageSend(to=>$msg->GetFrom(),subject=>"",body=>$ref->{'acknowledgement'},type=>"chat",priority=>10); 
      eval $ref->{'command'}; 
      &keepItGoing; 
     } 
     else 
     { 
      $jabberBot->MessageSend(to=>$msg->GetFrom(),subject=>"",body=>"I didn't understand you!",type=>"chat",priority=>10); 
      $dbQry->finish(); 
      &keepItGoing; 
     } 
    } 
} 

sub gotIQ 
{ 
    print "iq\n"; 
} 

sub trimSpaces 
{ 
    my $string = $_[0]; 
    $string =~ s/^\s+//; #remove leading spaces 
    $string =~ s/\s+$//; #remove trailing spaces 
    return $string; 
} 

sub keepItGoing 
{ 

    print "keepItGoing!\n"; 
    my $proc = $jabberBot->Process(1); 
    while(defined($proc) && $proc != 1) 
    { 
     $proc = $jabberBot->Process(1); 
    } 
} 

sub killBot 
{ 
    print "killing\n"; 
    $jabberBot->MessageSend(to=>$_[0]->GetFrom(),subject=>"",body=>"Logging Out!",type=>"chat",priority=>10); 
    $jabberBot->Process(1); 
    $jabberBot->Disconnect(); 
    exit; 
} 

답변

6

POE이 꽤 좋은 이벤트 프레임 워크가 있습니다

여기 내 소스입니다. 나는 Jabber (POE :: Component :: Jabber)가 얼마나 좋은지 모르지만, 그럴 가치가있다. 난 강력하게 (예 : AnyEvent (내 개인 좋아하는) 또는 POE와 같은 프레임 워크를 처리하는 적절한 이벤트를 사용하여 기존의 추천 것이라고

0 while $jabber->Process 

말했다 데 :

2

난 당신이 일을하여 예를 들어 작업을 할 수 있다고 생각 선택). 이 지원되는 루프 (심지어 POEAnyEvent's own, Event, EV, Tk, Glib/Gtk) 어떤 이벤트 기반의 응용 프로그램에서 실행할 수 있습니다 AnyEvent 사용하기 때문에

+0

내 루프가 지금 사용하고있는 것이지만 iq 패킷과 메시지 패킷을 받으면 엉망이됩니다. – cskwrd

4

AnyEvent::XMPP은 터무니 포괄적합니다.

+0

AnyEvent를 사용하여 시도했지만 실행 중에 문제가 발생했습니다. 나는 다른 것을 시도 할 것이지만, 그것이 ActivePerl을 사용할 수 있는지 알고 있니? 나는 궁극적으로 이것을 * nix 컴퓨터에서 실행하기를 원하지만 지금은 이클립스와 perl 플러그인을 사용하여 윈도우 7에서 개발 중이다. – cskwrd

+0

AnyEvent 모듈을 다시 사용하려고 시도했는데 메시지를 보내거나 봇의 존재를 설정하려고하면 AnyEvent :: Util :: guard에 대해 객체 메서드 "push_write"를 찾을 수 없다는 오류가 발생하고 나는 그것을 고치는 법을 알아낼 수 없다. 나는 CentOS 5에서 64 비트 버전의 perl을 사용하고 있기 때문에 그럴 것이라고 생각합니다. – cskwrd

관련 문제