كيف يمكنني إيقاف تشغيل الروبوت :: BasicBot Bot (بناءً على Poe :: Component :: IRC)؟

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

  •  20-09-2019
  •  | 
  •  

سؤال

هذا هو نموذج نص. عندما أضغط على 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() (الذي يرسل بالفعل shutdown حدث ل POE::Component::IRC) سوف يسبب فقط Bot::BasicBot لإعادة الاتصال (نفس الشيء مع $bot->quit() على فكرة).

تسببت هذه القيود وغيرها من القيود التي دفعها المستخدمون إلى التوصية باستخدامها POE::Component::IRC مباشرة. لديها العديد من الإضافات في الوقت الحاضر للميزات التي توفرها Bot::BasicBot التي كانت مفقودة عندما Bot::BasicBot تم انشائه. على الرغم من أنك قد تضطر إلى كتابة المزيد للحصول على روبوت أساسي وتشغيله ، إلا أن لديك مرونة أكبر بكثير. فيما يلي روبوت مثل واحد في مثالك ، دون استخدام Bot::BasicBot. سوف يرسل رسالة توقف إلى خادم IRC عند الضغط على Ctrl+C ، انتظر حتى يتم فصلها ، ثم الخروج:

#!/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};
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top