봇 :: Basicbot Bot (poe :: component :: irc)을 올바르게 종료하려면 어떻게해야합니까?
문제
이것은 샘플 스크립트입니다. Ctrl+C를 쳤을 때 봇은 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');
}
해결책
Bot :: Basicbot의 유지 관리를 인수했으며 버전 0.82에서는 제대로 종료 할 수 있습니다. $bot->shutdown($quit_message)
.
다른 팁
BOT :: BasicBot의 문서 및 소스 코드를 보면서 종료하는 우아한 방법을 찾을 수 없습니다. 당신이 시연 한대로 전화하십시오 $bot->shutdown()
(실제로 a shutdown
이벤트 POE::Component::IRC
) 그냥 원인이 될 것입니다 Bot::BasicBot
다시 연결하려면 (동일 $bot->quit()
그런데).
이 제한 사항 및 기타 제한 사항이 사용하여 사용하는 것이 좋습니다. POE::Component::IRC
곧장. 요즘 제공되는 기능에 대한 플러그인이 많습니다 Bot::BasicBot
언제 누락되었습니다 Bot::BasicBot
만들어졌습니다. 기본 봇을 설치하고 실행하려면 조금 더 타이핑해야 할 수도 있지만 훨씬 더 유연성이 있습니다. 아래는 사용하지 않고 예제의 봇입니다. Bot::BasicBot
. Ctrl+C를 누르면 IRC 서버에 종료 메시지를 보내고 연결이 끊어 질 때까지 기다린 다음 종료합니다.
#!/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};
}
제휴하지 않습니다 StackOverflow