#perl.it wants your bot
Post on 29-Jun-2015
1.671 Views
Preview:
DESCRIPTION
TRANSCRIPT
Il 120% dei pivelli su #perl.it chiede dritte per un Bot IRC
Pivelli Vogliono un bot IRC
100
120
Il 120% dei pivelli su #perl.it chiede dritte per un Bot IRC
Pivelli Vogliono un bot IRC
100
120
POE::Component
::IRC
POE::Component
::IRC
PerlObject
Environment
MultitaskingCooperativo
KERNEL
KERNEL
SESSION
POE::Component
::IRC
Specialista
Specialista
POE::Component
::IRC
POE::Component::IRC
Nostra Sessione
KERNEL
#!/usr/bin/env perl
use strict;
use warnings;
use English qw( -no_match_vars );
use Log::Log4perl qw( :easy );
Log::Log4perl->easy_init($INFO);
use File::Basename qw( basename );
use POE qw( Component::IRC );
my @canali = ('#ipw2008');
#!/usr/bin/env perl
use strict;
use warnings;
use English qw( -no_match_vars );
use Log::Log4perl qw( :easy );
Log::Log4perl->easy_init($INFO);
use File::Basename qw( basename );
use POE qw( Component::IRC );
my @canali = ('#ipw2008');
KERNEL
Nostra Sessione
POE::Component::IRC
my $irc = POE::Component::IRC->spawn(
alias => 'irc',
nick => 'ipw2008',
ircname =>
'IPW 2008 ' . basename($0),
server => 'irc.freenode.net',
port => 6667,
);
my $irc = POE::Component::IRC->spawn(
alias => 'irc',
nick => 'ipw2008',
ircname =>
'IPW 2008 ' . basename($0),
server => 'irc.freenode.net',
port => 6667,
);
my $irc = POE::Component::IRC->spawn(
alias => 'irc',
nick => 'ipw2008',
ircname =>
'IPW 2008 ' . basename($0),
server => 'irc.freenode.net',
port => 6667,
);
KERNEL
Nostra Sessione
POE::Component::IRC
POE::Session->create(
package_states => [
main => [qw(
_start _default
irc_001 irc_public
)]
],
);
$poe_kernel->run();
POE::Session->create(
package_states => [
main => [qw(
_start _default
irc_001 irc_public
)]
],
);
POE::Session->create(
package_states => [
main => [qw(
_start _default
irc_001 irc_public
)]
],
);
POE::Session->create(
package_states => [
main => [qw(
_start _default
irc_001 irc_public
)]
],
);
POE::Session->create(
package_states => [
main => [qw(
_start _default
irc_001 irc_public
)]
],
);
KERNEL
sub _start {
my $kernel = $_[KERNEL];
INFO 'mi registro con PoCo::IRC';
$kernel->post(irc => register => 'all');
INFO 'chiedo a PoCo::IRC di connettersi quando possibile';
$kernel->post(irc => connect => {});
return;
} ## end sub _start
sub _start {
my $kernel = $_[KERNEL];
INFO 'mi registro con PoCo::IRC';
$kernel->post(irc => register => 'all');
INFO 'chiedo a PoCo::IRC di connettersi quando possibile';
$kernel->post(irc => connect => {});
return;
} ## end sub _start
sub _start {
my $kernel = $_[KERNEL];
INFO 'mi registro con PoCo::IRC';
$kernel->post(irc => register => 'all');
INFO 'chiedo a PoCo::IRC di connettersi quando possibile';
$kernel->post(irc => connect => {});
return;
} ## end sub _start
sub _start {
my $kernel = $_[KERNEL];
INFO 'mi registro con PoCo::IRC';
$kernel->post(irc => register => 'all');
INFO 'chiedo a PoCo::IRC di connettersi quando possibile';
$kernel->post(irc => connect => {});
return;
} ## end sub _start
Chiede al Kernel di registrare un'attività
sub _start {
my $kernel = $_[KERNEL];
INFO 'mi registro con PoCo::IRC';
$kernel->post(irc => register => 'all');
INFO 'chiedo a PoCo::IRC di connettersi quando possibile';
$kernel->post(irc => connect => {});
return;
} ## end sub _start
Chiede al Kernel di registrare un'attività
Destinatario dell'attività
sub _start {
my $kernel = $_[KERNEL];
INFO 'mi registro con PoCo::IRC';
$kernel->post(irc => register => 'all');
INFO 'chiedo a PoCo::IRC di connettersi quando possibile';
$kernel->post(irc => connect => {});
return;
} ## end sub _start
Chiede al Kernel di registrare un'attività
Destinatario dell'attività
Attività e parametri
sub _start {
my $kernel = $_[KERNEL];
INFO 'mi registro con PoCo::IRC';
$kernel->post(irc => register => 'all');
INFO 'chiedo a PoCo::IRC di connettersi quando possibile';
$kernel->post(irc => connect => {});
return;
} ## end sub _start
sub _default { my ($event, $args) = @_[ARG0, ARG1]; my @output = ("$event: ");
foreach my $arg (@$args) { if (ref($arg) eq 'ARRAY') { push(@output, "[" . join(" ,", @$arg) . "]");
} else { push(@output, defined $arg ? "'$arg'" : '<undef>');
} } ## end foreach my $arg (@$args)
INFO join ' ', @output;
return 0;} ## end sub _default
sub _default { my ($event, $args) = @_[ARG0, ARG1]; my @output = ("$event: ");
foreach my $arg (@$args) { if (ref($arg) eq 'ARRAY') { push(@output, "[" . join(" ,", @$arg) . "]");
} else { push(@output, defined $arg ? "'$arg'" : '<undef>');
} } ## end foreach my $arg (@$args)
INFO join ' ', @output;
return 0;} ## end sub _default
POE::Session->create(
package_states => [
main => [qw(
_start _default
irc_001 irc_public
)]
],
);
POE::Component::IRC
sub irc_001 { my $kernel = $_[KERNEL];
INFO "connesso, mi unisco ai canali: @canali";
$kernel->post(irc => join => $_) for @canali;
return;} ## end sub irc_001
sub irc_001 { my $kernel = $_[KERNEL];
INFO "connesso, mi unisco ai canali: @canali";
$kernel->post(irc => join => $_) for @canali;
return;} ## end sub irc_001
sub irc_public { my ($kernel, $chi, $dove, $cosa) = @_[KERNEL, ARG0 .. ARG2]; my $nick = (split /!/, $chi)[0]; my $canale = $dove->[0];
if (my ($testo) = $cosa =~ /\A rot13 \s+ (.+)/mxs) { $testo =~ tr[a-zA-Z][n-za-mN-ZA-M]; $kernel->post(irc => privmsg => $canale => "$nick: $testo"); } else { $kernel->post(irc => privmsg => $canale => 'non capisco...'); }
return;} ## end sub irc_public
sub irc_public { my ($kernel, $chi, $dove, $cosa) = @_[KERNEL, ARG0 .. ARG2]; my $nick = (split /!/, $chi)[0]; my $canale = $dove->[0];
if (my ($testo) = $cosa =~ /\A rot13 \s+ (.+)/mxs) { $testo =~ tr[a-zA-Z][n-za-mN-ZA-M]; $kernel->post(irc => privmsg => $canale => "$nick: $testo"); } else { $kernel->post(irc => privmsg => $canale => 'non capisco...'); }
return;} ## end sub irc_public
sub irc_public { my ($kernel, $chi, $dove, $cosa) = @_[KERNEL, ARG0 .. ARG2]; my $nick = (split /!/, $chi)[0]; my $canale = $dove->[0];
if (my ($testo) = $cosa =~ /\A rot13 \s+ (.+)/mxs) { $testo =~ tr[a-zA-Z][n-za-mN-ZA-M]; $kernel->post(irc => privmsg => $canale => "$nick: $testo"); } else { $kernel->post(irc => privmsg => $canale => 'non capisco...'); }
return;} ## end sub irc_public
sub irc_public { my ($kernel, $chi, $dove, $cosa) = @_[KERNEL, ARG0 .. ARG2]; my $nick = (split /!/, $chi)[0]; my $canale = $dove->[0];
if (my ($testo) = $cosa =~ /\A rot13 \s+ (.+)/mxs) { $testo =~ tr[a-zA-Z][n-za-mN-ZA-M]; $kernel->post(irc => privmsg => $canale => "$nick: $testo"); } else { $kernel->post(irc => privmsg => $canale => 'non capisco...'); }
return;} ## end sub irc_public
sub irc_public { my ($kernel, $chi, $dove, $cosa) = @_[KERNEL, ARG0 .. ARG2]; my $nick = (split /!/, $chi)[0]; my $canale = $dove->[0];
if (my ($testo) = $cosa =~ /\A rot13 \s+ (.+)/mxs) { $testo =~ tr[a-zA-Z][n-za-mN-ZA-M]; $kernel->post(irc => privmsg => $canale => "$nick: $testo"); } else { $kernel->post(irc => privmsg => $canale => 'non capisco...'); }
return;} ## end sub irc_public
rot13
sub irc_public { my ($kernel, $chi, $dove, $cosa) = @_[KERNEL, ARG0 .. ARG2]; my $nick = (split /!/, $chi)[0]; my $canale = $dove->[0];
if (my ($testo) = $cosa =~ /\A rot13 \s+ (.+)/mxs) { $testo =~ tr[a-zA-Z][n-za-mN-ZA-M]; $kernel->post(irc => privmsg => $canale => "$nick: $testo"); } else { $kernel->post(irc => privmsg => $canale => 'non capisco...'); }
return;} ## end sub irc_public
sub irc_public { my ($kernel, $chi, $dove, $cosa) = @_[KERNEL, ARG0 .. ARG2]; my $nick = (split /!/, $chi)[0]; my $canale = $dove->[0];
if (my ($testo) = $cosa =~ /\A rot13 \s+ (.+)/mxs) { $testo =~ tr[a-zA-Z][n-za-mN-ZA-M]; $kernel->post(irc => privmsg => $canale => "$nick: $testo"); } else { $kernel->post(irc => privmsg => $canale => 'non capisco...'); }
return;} ## end sub irc_public
Nostra Sessione
POE::Component::IRC
KERNEL
$poe_kernel->run();
2Aggiunta Comando
sub irc_public { my ($kernel, $chi, $dove, $cosa) = @_[KERNEL, ARG0 .. ARG2]; my $nick = (split /!/, $chi)[0]; my $canale = $dove->[0];
if (my ($testo) = $cosa =~ /\A rot13 \s+ (.+)/mxs) { $testo =~ tr[a-zA-Z][n-za-mN-ZA-M]; $kernel->post(irc => privmsg => $canale => "$nick: $testo"); } elsif ($cosa =~ /\A (?: quit | bye) \z/mxs) { $kernel->post(irc => shutdown => 'ci si vede!'); } else { $kernel->post(irc => privmsg => $canale => 'non capisco...'); }
return;} ## end sub irc_public
3NickServ
Query
use POE qw( Component::IRC Component::IRC::Plugin::NickServID );
#...
$irc->plugin_add(NickServID => POE::Component::IRC::Plugin::NickServID ->new(Password => 'blah'));
POE::Session->create( package_states => [ main => [ qw( _start _default irc_001 irc_public irc_msg ) ] ],);
sub irc_msg { my ($kernel, $chi, $dove, $cosa) = @_[KERNEL, ARG0 .. ARG2]; my $nick = (split /!/, $chi)[0];
$kernel->post(irc => privmsg => $nick => 'tu chi sei?!?');
return;} ## end sub irc_msg
4Tracciamento
dello Stato
use POE qw( Component::IRC::State Component::IRC::Plugin::NickServID );
#...
my $irc = POE::Component::IRC::State ->spawn( #...
sub irc_msg { my ($kernel, $chi, $dove, $cosa) = @_[KERNEL, ARG0 .. ARG2]; my $nick = (split /!/, $chi)[0];
$kernel->post( irc => privmsg => $nick => 'chi sei?!?');
# Delazione in canale! my $irc = $kernel->alias_resolve('irc') ->get_heap(); $kernel->post(irc => privmsg => $_ => "Al bruto! $nick mi ha detto '$cosa' in privato!")
for $irc->nick_channels($nick);
return;} ## end sub irc_msg
5Riconnessione
Automatica
use POE qw( Component::IRC::State Component::IRC::Plugin::NickServID Component::IRC::Plugin::Connector);
#...
$irc->plugin_add(Connector => POE::Component::IRC::Plugin::Connector ->new(delay => 60));
6Comandi Lenti
sub irc_public { my ($kernel, $chi, $dove, $cosa) = @_[KERNEL, ARG0 .. ARG2]; my $nick = (split /!/, $chi)[0]; my $canale = $dove->[0];
if (my ($testo) = $cosa =~ /\A rot13 \s+ (.+)/mxs) { $testo =~ tr[a-zA-Z][n-za-mN-ZA-M]; $kernel->post(irc => privmsg => $canale => "$nick: $testo"); } elsif ($cosa =~ /\A (?: quit | bye) \z/mxs) { $kernel->post(irc => shutdown => 'ci si vede!'); }
elsif ($cosa eq 'comando lento') { my $risposta = comando_lento(); $kernel->post(irc => privmsg => $canale => "$nick: $_") for split /\n/, $risposta; } else { $kernel->post(irc => privmsg => $canale => 'non capisco...'); }
return;} ## end sub irc_public
sub comando_lento { sleep 5; return "Ciao\na tutti\n";}
7Comandi Lenti
7Comandi Lenti
KERNEL
WHEEL
SESSION
ProcessoEsternoPOE
::Wheel::Run
KERNEL
Nostra Sessione
POE::Component::IRC
ProcessoEsterno
POE::Wheel::Run
use POE qw( Component::IRC::State Component::IRC::Plugin::NickServID Component::IRC::Plugin::Connector Wheel::Run);
sub irc_public { my ($kernel, $chi, $dove, $cosa) = @_[KERNEL, ARG0 .. ARG2]; my $nick = (split /!/, $chi)[0]; my $canale = $dove->[0];
if (my ($testo) = $cosa =~ /\A rot13 \s+ (.+)/mxs) { $testo =~ tr[a-zA-Z][n-za-mN-ZA-M]; $kernel->post(irc => privmsg => $canale => "$nick: $testo"); } elsif ($cosa =~ /\A (?: quit | bye) \z/mxs) { $kernel->post(irc => shutdown => 'ci si vede!'); }
elsif ($cosa eq 'comando lento') { my $wheel = accoda_comando_lento(\&comando_lento); $_[HEAP]->{comando_lento}{$wheel->ID()} = { nick => $nick, canale => $canale, wheel => $wheel, }; $kernel->post(irc => privmsg => $canale => "$nick: ci penso un po'..."); } else { $kernel->post(irc => privmsg => $canale => 'non capisco...'); }
return;} ## end sub irc_public
sub irc_public { my ($kernel, $chi, $dove, $cosa) = @_[KERNEL, ARG0 .. ARG2]; my $nick = (split /!/, $chi)[0]; my $canale = $dove->[0];
if (my ($testo) = $cosa =~ /\A rot13 \s+ (.+)/mxs) { $testo =~ tr[a-zA-Z][n-za-mN-ZA-M]; $kernel->post(irc => privmsg => $canale => "$nick: $testo"); } elsif ($cosa =~ /\A (?: quit | bye) \z/mxs) { $kernel->post(irc => shutdown => 'ci si vede!'); }
elsif ($cosa eq 'comando lento') { my $wheel = accoda_comando_lento(\&comando_lento); $_[HEAP]->{comando_lento}{$wheel->ID()} = { nick => $nick, canale => $canale, wheel => $wheel, }; $kernel->post(irc => privmsg => $canale => "$nick: ci penso un po'..."); } else { $kernel->post(irc => privmsg => $canale => 'non capisco...'); }
return;} ## end sub irc_public
sub irc_public { my ($kernel, $chi, $dove, $cosa) = @_[KERNEL, ARG0 .. ARG2]; my $nick = (split /!/, $chi)[0]; my $canale = $dove->[0];
if (my ($testo) = $cosa =~ /\A rot13 \s+ (.+)/mxs) { $testo =~ tr[a-zA-Z][n-za-mN-ZA-M]; $kernel->post(irc => privmsg => $canale => "$nick: $testo"); } elsif ($cosa =~ /\A (?: quit | bye) \z/mxs) { $kernel->post(irc => shutdown => 'ci si vede!'); }
elsif ($cosa eq 'comando lento') { my $wheel = accoda_comando_lento(\&comando_lento); $_[HEAP]->{comando_lento}{$wheel->ID()} = { nick => $nick, canale => $canale, wheel => $wheel, }; $kernel->post(irc => privmsg => $canale => "$nick: ci penso un po'..."); } else { $kernel->post(irc => privmsg => $canale => 'non capisco...'); }
return;} ## end sub irc_public
sub irc_public { my ($kernel, $chi, $dove, $cosa) = @_[KERNEL, ARG0 .. ARG2]; my $nick = (split /!/, $chi)[0]; my $canale = $dove->[0];
if (my ($testo) = $cosa =~ /\A rot13 \s+ (.+)/mxs) { $testo =~ tr[a-zA-Z][n-za-mN-ZA-M]; $kernel->post(irc => privmsg => $canale => "$nick: $testo"); } elsif ($cosa =~ /\A (?: quit | bye) \z/mxs) { $kernel->post(irc => shutdown => 'ci si vede!'); }
elsif ($cosa eq 'comando lento') { my $wheel = accoda_comando_lento(\&comando_lento); $_[HEAP]->{comando_lento}{$wheel->ID()} = { nick => $nick, canale => $canale, wheel => $wheel, }; $kernel->post(irc => privmsg => $canale => "$nick: ci penso un po'..."); } else { $kernel->post(irc => privmsg => $canale => 'non capisco...'); }
return;} ## end sub irc_public
sub accoda_comando_lento { my ($comando) = @_; INFO 'accodo un comando lento...'; return POE::Wheel::Run->new( Program => $comando, StdoutEvent => 'dati_da_comando_lento', CloseEvent => 'comando_lento_completato', );}
POE::Session->create( package_states => [ main => [ qw( _start _default irc_001 irc_public irc_msg dati_da_comando_lento comando_lento_completato ) ] ],);
sub dati_da_comando_lento { my ($heap, $dati, $id) = @_[HEAP, ARG0, ARG1]; INFO "dati: $dati";
my $datastore = $heap->{comando_lento}{$id}{dati}; push @$datastore, $dati;
return;}
sub comando_lento_completato { my ($kernel, $heap, $id) = @_[KERNEL, HEAP, ARG0]; INFO "comando lento completato"; my $comando = delete $heap->{comando_lento}{$id}; $kernel->post(irc => privmsg => $comando->{canale} => "$comando->{nick}: risposta al comando lento: $_")
for @{$comando->{dati}}; return;}
sub comando_lento { sleep 5; print "Ciao\na tutti\n";}
top related