Wie mache ich einen Bot :: BasicBot -Bot (basierend auf Poe :: component :: irc) richtig?

StackOverflow https://stackoverflow.com/questions/2471373

  •  20-09-2019
  •  | 
  •  

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');
}
War es hilfreich?

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};
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top