봇 :: 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};
}
Bot :: BasicBot을 사용하지 않으려면 AnyEvent :: IRC 또는 Net :: Async :: IRC를 살펴보고 성능이 훨씬 뛰어나고 복잡하지 않은 마법을 사용할 수도 있습니다. – MkV
POE :: Component :: IRC보다 성능이 어떻습니까? 너무 복잡한 마법은 어디에 있습니까? 이것에 관한 유용한 정보가 있으면, POE :: Component :: IRC를 개선 할 수 있을지도 모른다. – Hinrik
실제로 PoCo-IRC가 아니지만 POE에 대한 API는 복잡합니다 (커널, 루프, 필터, 세션 및 이벤트 사용) 많은 상용구가 필요합니다 (Poco-IRC, AE-IRC 및 Net-Async-IRC의 모듈). 성능에 관해서는 아마도 POE의 복잡성으로 이어질 것입니다. 유용한 벤치 마크는 Starman on CPAN, 벤치 마크 섹션, Twiggy는 AnyEvent Plack 서버, Corona는 Coro (AnyEvent + Coroutines) Plack 서버입니다. – MkV