Wie mache ich einen Bot :: BasicBot -Bot (basierend auf Poe :: component :: irc) richtig?
Frage
Dies ist ein Beispielskript. Wenn ich Strg+C traf, beendet der Bot IRC, aber er verbindet nach einiger Zeit wieder. Wie schalte ich den Bot richtig ab?
#!/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');
}
Lösung
Ich habe die Wardauerschaft von Bot :: BasicBot übernommen und ab Version 0.82 können Sie es richtig einstellen $bot->shutdown($quit_message)
.
Andere Tipps
Aus den Dokumentation und dem Quellcode von Bot :: BasicBot kann ich keinen anmutigen Weg finden, ihn zu schließen. Wie Sie demonstrierten, rufen Sie an $bot->shutdown()
(was tatsächlich eine sendet shutdown
Ereignis an POE::Component::IRC
) wird einfach verursachen Bot::BasicBot
wieder verbinden (gleiche mit $bot->quit()
übrigens).
Diese und andere Einschränkungen haben mich dazu veranlasst, die Verwendung zu empfehlen POE::Component::IRC
direkt. Heutzutage verfügt es viele Plugins für Funktionen von Funktionen von Bot::BasicBot
die fehlten, wenn Bot::BasicBot
wurde geschaffen. Sie müssen zwar möglicherweise ein bisschen mehr tippen, um einen einfachen Bot zum Laufen zu bringen, aber Sie haben viel mehr Flexibilität. Unten finden Sie einen Bot wie der in Ihrem Beispiel, ohne zu verwenden Bot::BasicBot
. Wenn Sie Strg+C drücken, warten Sie an den IRC -Server, warten Sie, bis sie getrennt wurde, und beenden Sie dann:
#!/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};
}