#perl.it wants your bot

87

Upload: flavio-poletti

Post on 29-Jun-2015

1.669 views

Category:

Education


3 download

DESCRIPTION

Se volete entrare in #perl.it e chiedere come fare un bot IRC... leggete qui prima! Il codice lo trovate su http://tinyurl.com/ce7hvy

TRANSCRIPT

Page 1: #perl.it wants your bot
Page 2: #perl.it wants your bot

Il 120% dei pivelli su #perl.it chiede dritte per un Bot IRC

Pivelli Vogliono un bot IRC

100

120

Page 3: #perl.it wants your bot

Il 120% dei pivelli su #perl.it chiede dritte per un Bot IRC

Pivelli Vogliono un bot IRC

100

120

Page 4: #perl.it wants your bot
Page 5: #perl.it wants your bot
Page 6: #perl.it wants your bot

POE::Component

::IRC

Page 7: #perl.it wants your bot

POE::Component

::IRC

Page 8: #perl.it wants your bot
Page 9: #perl.it wants your bot

PerlObject

Environment

Page 10: #perl.it wants your bot

MultitaskingCooperativo

Page 11: #perl.it wants your bot

KERNEL

Page 12: #perl.it wants your bot

KERNEL

SESSION

Page 13: #perl.it wants your bot
Page 14: #perl.it wants your bot

POE::Component

::IRC

Page 15: #perl.it wants your bot
Page 16: #perl.it wants your bot
Page 17: #perl.it wants your bot

Specialista

Page 18: #perl.it wants your bot

Specialista

Page 19: #perl.it wants your bot

POE::Component

::IRC

Page 20: #perl.it wants your bot

POE::Component::IRC

Nostra Sessione

KERNEL

Page 21: #perl.it wants your bot

#!/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');

Page 22: #perl.it wants your bot

#!/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');

Page 23: #perl.it wants your bot

KERNEL

Nostra Sessione

POE::Component::IRC

Page 24: #perl.it wants your bot

my $irc = POE::Component::IRC->spawn(

alias => 'irc',

nick => 'ipw2008',

ircname =>

'IPW 2008 ' . basename($0),

server => 'irc.freenode.net',

port => 6667,

);

Page 25: #perl.it wants your bot

my $irc = POE::Component::IRC->spawn(

alias => 'irc',

nick => 'ipw2008',

ircname =>

'IPW 2008 ' . basename($0),

server => 'irc.freenode.net',

port => 6667,

);

Page 26: #perl.it wants your bot

my $irc = POE::Component::IRC->spawn(

alias => 'irc',

nick => 'ipw2008',

ircname =>

'IPW 2008 ' . basename($0),

server => 'irc.freenode.net',

port => 6667,

);

Page 27: #perl.it wants your bot

KERNEL

Nostra Sessione

POE::Component::IRC

Page 28: #perl.it wants your bot

POE::Session->create(

package_states => [

main => [qw(

_start _default

irc_001 irc_public

)]

],

);

$poe_kernel->run();

Page 29: #perl.it wants your bot

POE::Session->create(

package_states => [

main => [qw(

_start _default

irc_001 irc_public

)]

],

);

Page 30: #perl.it wants your bot

POE::Session->create(

package_states => [

main => [qw(

_start _default

irc_001 irc_public

)]

],

);

Page 31: #perl.it wants your bot

POE::Session->create(

package_states => [

main => [qw(

_start _default

irc_001 irc_public

)]

],

);

Page 32: #perl.it wants your bot

POE::Session->create(

package_states => [

main => [qw(

_start _default

irc_001 irc_public

)]

],

);

KERNEL

Page 33: #perl.it wants your bot

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

Page 34: #perl.it wants your bot

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

Page 35: #perl.it wants your bot

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

Page 36: #perl.it wants your bot

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à

Page 37: #perl.it wants your bot

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à

Page 38: #perl.it wants your bot

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

Page 39: #perl.it wants your bot

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

Page 40: #perl.it wants your bot

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

Page 41: #perl.it wants your bot

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

Page 42: #perl.it wants your bot

POE::Session->create(

package_states => [

main => [qw(

_start _default

irc_001 irc_public

)]

],

);

POE::Component::IRC

Page 43: #perl.it wants your bot

sub irc_001 { my $kernel = $_[KERNEL];

INFO "connesso, mi unisco ai canali: @canali";

$kernel->post(irc => join => $_) for @canali;

return;} ## end sub irc_001

Page 44: #perl.it wants your bot

sub irc_001 { my $kernel = $_[KERNEL];

INFO "connesso, mi unisco ai canali: @canali";

$kernel->post(irc => join => $_) for @canali;

return;} ## end sub irc_001

Page 45: #perl.it wants your bot

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

Page 46: #perl.it wants your bot

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

Page 47: #perl.it wants your bot

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

Page 48: #perl.it wants your bot

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

Page 49: #perl.it wants your bot

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

Page 50: #perl.it wants your bot

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

Page 51: #perl.it wants your bot

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

Page 52: #perl.it wants your bot

Nostra Sessione

POE::Component::IRC

KERNEL

Page 53: #perl.it wants your bot

$poe_kernel->run();

Page 54: #perl.it wants your bot

2Aggiunta Comando

Page 55: #perl.it wants your bot

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

Page 56: #perl.it wants your bot

3NickServ

Query

Page 57: #perl.it wants your bot

use POE qw( Component::IRC Component::IRC::Plugin::NickServID );

#...

$irc->plugin_add(NickServID => POE::Component::IRC::Plugin::NickServID ->new(Password => 'blah'));

Page 58: #perl.it wants your bot

POE::Session->create( package_states => [ main => [ qw( _start _default irc_001 irc_public irc_msg ) ] ],);

Page 59: #perl.it wants your bot

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

Page 60: #perl.it wants your bot

4Tracciamento

dello Stato

Page 61: #perl.it wants your bot

use POE qw( Component::IRC::State Component::IRC::Plugin::NickServID );

#...

my $irc = POE::Component::IRC::State ->spawn( #...

Page 62: #perl.it wants your bot

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

Page 63: #perl.it wants your bot

5Riconnessione

Automatica

Page 64: #perl.it wants your bot

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));

Page 65: #perl.it wants your bot

6Comandi Lenti

Page 66: #perl.it wants your bot

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

Page 67: #perl.it wants your bot

sub comando_lento { sleep 5; return "Ciao\na tutti\n";}

Page 68: #perl.it wants your bot
Page 69: #perl.it wants your bot
Page 70: #perl.it wants your bot
Page 71: #perl.it wants your bot

7Comandi Lenti

Page 72: #perl.it wants your bot

7Comandi Lenti

Page 73: #perl.it wants your bot

KERNEL

WHEEL

SESSION

Page 74: #perl.it wants your bot

ProcessoEsternoPOE

::Wheel::Run

Page 75: #perl.it wants your bot

KERNEL

Nostra Sessione

POE::Component::IRC

ProcessoEsterno

POE::Wheel::Run

Page 76: #perl.it wants your bot

use POE qw( Component::IRC::State Component::IRC::Plugin::NickServID Component::IRC::Plugin::Connector Wheel::Run);

Page 77: #perl.it wants your bot

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

Page 78: #perl.it wants your bot

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

Page 79: #perl.it wants your bot

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

Page 80: #perl.it wants your bot

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

Page 81: #perl.it wants your bot

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', );}

Page 82: #perl.it wants your bot

POE::Session->create( package_states => [ main => [ qw( _start _default irc_001 irc_public irc_msg dati_da_comando_lento comando_lento_completato ) ] ],);

Page 83: #perl.it wants your bot

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;}

Page 84: #perl.it wants your bot

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;}

Page 85: #perl.it wants your bot

sub comando_lento { sleep 5; print "Ciao\na tutti\n";}

Page 86: #perl.it wants your bot
Page 87: #perl.it wants your bot