2010-03-18 7 views
3

이것은 샘플 스크립트입니다. Ctrl + C를 누르면 봇은 IRC를 종료하지만 잠시 후 다시 연결됩니다. 어떻게하면 봇을 올바르게 종료 할 수 있습니까?Bot :: BasicBot 봇을 어떻게 올바르게 종료합니까 (POE :: Component :: IRC 기반)?

#!/usr/bin/perl 

package main; 

my $bot = Perlbot->new (server => 'irc.dal.net'); 

$SIG{'INT'} = 'Handler'; 
$SIG{'TERM'} = 'Handler'; 

sub Handler { 
print "\nShutting down bot...\n"; 
$bot->shutdown('Killed.'); 
}; 

$bot->run; 

package Perlbot; 
use base qw(Bot::BasicBot); 

sub connected { 
my $self = shift; 
$self->join('#codetestchan'); 
} 

답변

2

내가 봇 :: BasicBot의 maintainership 점령했습니다 당신이 CTRL + C를 누를 때까지 기다립니다 IRC 서버에 연결이 해제 될 때까지, 다음 종료 담배를 끊으 메시지를 보내드립니다 0.82이면 $bot->shutdown($quit_message)으로 올바르게 종료 할 수 있습니다.

0

봇 :: basicbot의 설명서와 소스 코드를 보면, 정상적인 방법으로 종료 할 수 없습니다. 시연했듯이 $bot->shutdown() (사실 shutdown 이벤트를 POE::Component::IRC으로 전송)을 호출하면 Bot::BasicBot이 다시 연결됩니다 (단, $bot->quit()과 동일).

사용자가 실행 한이 같은 제한 사항으로 인해 POE::Component::IRC을 직접 사용하는 것이 좋습니다. Bot::BasicBot에 의해 제공되는 기능에 대해서는 요즘 많은 플러그인이 있는데, Bot::BasicBot을 만들 때 누락되었습니다. 기본 봇을 실행하기 위해 좀 더 입력해야 할 수도 있지만 유연성이 훨씬 뛰어납니다. 아래는 Bot::BasicBot을 사용하지 않고 예제의 봇과 같습니다. 및 버전의 같은

#!/usr/bin/env perl 

use strict; 
use warnings; 
use POE; 
use POE::Component::IRC::State; 
use POE::Component::IRC::Common qw(parse_user); 
use POE::Component::IRC::Plugin::Connector; 
use POE::Component::IRC::Plugin::AutoJoin; 

# create our session 
POE::Session->create(
    package_states => [ 
     # event handlers 
     (__PACKAGE__) => [qw(_start int irc_join irc_disconnected)] 
    ] 
); 

# start the event loop 
POE::Kernel->run(); 

# session start handler 
sub _start { 
    my ($kernel, $heap) = @_[KERNEL, HEAP]; 

    # handle CTRL+C 
    $kernel->sig(INT => 'int'); 

    # create bot object 
    my $irc = POE::Component::IRC::State->spawn(
     server => 'irc.freenode.net', 
     nick => 'basic123bot', 
     debug => 1, 
    ); 

    # save $irc in our session's storage heap 
    $heap->{irc} = $irc; 

    # handle reconnects 
    $irc->plugin_add('Connector', POE::Component::IRC::Plugin::Connector->new()); 

    # handle channel joining 
    $irc->plugin_add('AutoJoin', POE::Component::IRC::Plugin::AutoJoin->new(
     Channels => ['#foo123bar'], 
    )); 

    # connect to IRC 
    $irc->yield('connect'); 
} 

# interrupt signal handler 
sub int { 
    my ($kernel, $heap) = @_[KERNEL, HEAP]; 

    $heap->{irc}->yield('quit', 'Quitting, bye!'); 
    $heap->{shutting_down} = 1; 
    $kernel->sig_handled(); 
} 

# join handler 
sub irc_join { 
    my ($who, $chan) = @_[ARG0, ARG1]; 
    my $irc = $_[HEAP]->{irc}; 

    my ($nick, $user, $host) = parse_user($who); 
    if ($nick eq $irc->nick_name()) { 
     # say hello to channel members 
     $irc->yield('privmsg', $chan, 'Hello everybody'); 
    } 
} 

# disconnect handler 
sub irc_disconnected { 
    my ($heap) = $_[HEAP]; 

    # shut down if we disconnected voluntarily 
    $heap->{irc}->yield('shutdown') if $heap->{shutting_down}; 
} 
+0

Bot :: BasicBot을 사용하지 않으려면 AnyEvent :: IRC 또는 Net :: Async :: IRC를 살펴보고 성능이 훨씬 뛰어나고 복잡하지 않은 마법을 사용할 수도 있습니다. – MkV

+0

POE :: Component :: IRC보다 성능이 어떻습니까? 너무 복잡한 마법은 어디에 있습니까? 이것에 관한 유용한 정보가 있으면, POE :: Component :: IRC를 개선 할 수 있을지도 모른다. – Hinrik

+0

실제로 PoCo-IRC가 아니지만 POE에 대한 API는 복잡합니다 (커널, 루프, 필터, 세션 및 이벤트 사용) 많은 상용구가 필요합니다 (Poco-IRC, AE-IRC 및 Net-Async-IRC의 모듈). 성능에 관해서는 아마도 POE의 복잡성으로 이어질 것입니다. 유용한 벤치 마크는 Starman on CPAN, 벤치 마크 섹션, Twiggy는 AnyEvent Plack 서버, Corona는 Coro (AnyEvent + Coroutines) Plack 서버입니다. – MkV