1use strict; 2use warnings; 3use Test::More tests => 11; 4use POE::Component::Server::IRC; 5use POE::Component::IRC; 6use POE; 7 8my $pocosi = POE::Component::Server::IRC->spawn( 9 auth => 0, 10 antiflood => 0, 11 plugin_debug => 1, 12); 13my $pocoirc = POE::Component::IRC->spawn(flood => 1); 14 15POE::Session->create( 16 package_states => [ 17 'main' => [qw( 18 _start 19 _shutdown 20 _default 21 irc_001 22 irc_422 23 irc_391 24 ircd_daemon_nick 25 ircd_listener_add 26 ircd_listener_del 27 )], 28 ], 29 heap => { irc => $pocoirc, ircd => $pocosi }, 30); 31 32$poe_kernel->run(); 33 34sub _start { 35 my ($kernel, $heap) = @_[KERNEL, HEAP]; 36 37 $heap->{irc}->yield('register', 'all'); 38 $heap->{ircd}->yield('register', 'all'); 39 $heap->{ircd}->add_listener(); 40 $kernel->delay('_shutdown', 20); 41} 42 43sub _shutdown { 44 my $heap = $_[HEAP]; 45 $_[KERNEL]->delay('_shutdown'); 46 $heap->{irc}->yield('unregister', 'all'); 47 $heap->{irc}->yield('shutdown'); 48 $heap->{ircd}->yield('shutdown'); 49 delete $heap->{irc}; 50 delete $heap->{ircd}; 51} 52 53sub ircd_listener_add { 54 my ($heap, $port) = @_[HEAP, ARG0]; 55 pass("Started a listener on $port"); 56 $heap->{port} = $port; 57 $heap->{irc}->yield( 58 connect => { 59 server => 'localhost', 60 port => $port, 61 nick => 'Moo', 62 }, 63 ); 64} 65 66sub ircd_listener_del { 67 my ($heap, $port) = @_[HEAP, ARG0]; 68 pass("Stopped listener on $port"); 69 $_[KERNEL]->yield('_shutdown'); 70} 71 72sub ircd_backend_connection { 73 pass('ircd_backend_connection'); 74} 75 76sub ircd_backend_auth_done { 77 pass('ircd_backend_auth_done'); 78} 79 80sub ircd_daemon_nick { 81 pass("ircd_daemon_nick $_[ARG0]"); 82} 83 84sub ircd_backend_cmd_user { 85 pass('ircd_backend_cmd_user'); 86} 87 88sub irc_001 { 89 pass("irc_001"); 90 $poe_kernel->post( $_[SENDER], 'time' ); 91} 92 93sub irc_391 { 94 pass("irc_391"); 95 $poe_kernel->yield('_shutdown'); 96} 97 98sub irc_422 { 99 return if $_[HEAP]->{422}; 100 pass("irc_422"); 101 $_[HEAP]->{422}++; 102} 103 104sub _default { 105 my $event = $_[ARG0]; 106 107 if ($event =~ /^irc_(00[1234]|25[15]|323)/ || $event eq 'irc_isupport') { 108 pass($event); 109 } 110 elsif ($event eq 'irc_error') { 111 pass($event); 112 $_[HEAP]->{ircd}->del_listener(port => $_[HEAP]->{port}); 113 } 114} 115