#!/usr/bin/perl # A Multiple Network Rot13 'encryption' bot use strict; use warnings; use POE qw(Component::IRC); my $nickname = 'Flibble' . $$; my $ircname = 'Flibble the Sailor Bot'; my $settings = { 'server1.irc' => { port => 6667, channels => [ '#Foo' ], }, 'server2.irc' => { port => 6668, channels => [ '#Bar' ], }, 'server3.irc' => { port => 7001, channels => [ '#Baa' ], }, }; # We create our PoCo-IRC objects for my $server ( keys %{ $settings } ) { POE::Component::IRC->spawn( alias => $server, nick => $nickname, ircname => $ircname, ); } POE::Session->create( package_states => [ main => [ qw(_default _start irc_registered irc_001 irc_public) ], ], heap => { config => $settings }, ); $poe_kernel->run(); sub _start { my ($kernel, $session) = @_[KERNEL, SESSION]; # Send a POCOIRC_REGISTER signal to all poco-ircs $kernel->signal( $kernel, 'POCOIRC_REGISTER', $session->ID(), 'all' ); return; } # We'll get one of these from each PoCo-IRC that we spawned above. sub irc_registered { my ($kernel, $heap, $sender, $irc_object) = @_[KERNEL, HEAP, SENDER, ARG0]; my $alias = $irc_object->session_alias(); my %conn_hash = ( server => $alias, port => $heap->{config}->{ $alias }->{port}, ); # In any irc_* events SENDER will be the PoCo-IRC session $kernel->post( $sender, 'connect', \%conn_hash ); return; } sub irc_001 { my ($kernel, $heap, $sender) = @_[KERNEL, HEAP, SENDER]; # Get the component's object at any time by accessing # the heap of the SENDER my $poco_object = $sender->get_heap(); print "Connected to ", $poco_object->server_name(), "\n"; my $alias = $poco_object->session_alias(); my @channels = @{ $heap->{config}->{ $alias }->{channels} }; $kernel->post( $sender => join => $_ ) for @channels; return; } sub irc_public { my ($kernel, $sender, $who, $where, $what) = @_[KERNEL, SENDER, ARG0 .. ARG2]; my $nick = ( split /!/, $who )[0]; my $channel = $where->[0]; if ( my ($rot13) = $what =~ /^rot13 (.+)/ ) { $rot13 =~ tr[a-zA-Z][n-za-mN-ZA-M]; $kernel->post( $sender => privmsg => $channel => "$nick: $rot13" ); } if ( $what =~ /^!bot_quit$/ ) { # Someone has told us to die =[ $kernel->signal( $kernel, 'POCOIRC_SHUTDOWN', "See you loosers" ); } return; } # We registered for all events, this will produce some debug info. sub _default { my ($event, $args) = @_[ARG0 .. $#_]; my @output = ( "$event: " ); for my $arg ( @$args ) { if ( ref($arg) eq 'ARRAY' ) { push( @output, '[' . join(' ,', @$arg ) . ']' ); } else { push ( @output, "'$arg'" ); } } print join ' ', @output, "\n"; return 0; }