X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2FIRC%2FIrc.pl;h=19c5bc6a147486d3b95c05c7d09ddd50ee92e30e;hb=faab69f2c1cc5dc537e93ef36d233789df215b02;hp=82542afce48c795f41959e9f4d63327e8b934120;hpb=40f6dad8bfd5a8a707a69cb31ba62cc6d26139c1;p=infobot.git diff --git a/src/IRC/Irc.pl b/src/IRC/Irc.pl index 82542af..19c5bc6 100644 --- a/src/IRC/Irc.pl +++ b/src/IRC/Irc.pl @@ -19,9 +19,6 @@ use vars qw($notcount $nottime $notsize $msgcount $msgtime $msgsize use vars qw($b_blue $ob); use vars qw(@ircServers); -#use open ':utf8'; -#use open ':std'; - $nickserv = 0; # It's probably closer to 510, but let's be cautious until we calculate it extensively. @@ -39,14 +36,14 @@ sub ircloop { # JUST IN CASE. irq was complaining about this. if ( $lastrun == time() ) { - &DEBUG("ircloop: hrm... lastrun == time()"); + &DEBUG('ircloop: hrm... lastrun == time()'); $error++; sleep 10; next; } if ( !defined $host ) { - &DEBUG("ircloop: ircServers[x] = NULL."); + &DEBUG('ircloop: ircServers[x] = NULL.'); $lastrun = time(); next; } @@ -57,19 +54,19 @@ sub ircloop { $error++; if ( $error % 3 == 0 and $error != 0 ) { - &status("IRC: Could not connect."); - &status("IRC: "); + &status('IRC: Could not connect.'); + &status('IRC: '); next; } if ( $error >= 3 * 2 ) { - &status("IRC: cannot connect to any IRC servers; stopping."); + &status('IRC: cannot connect to any IRC servers; stopping.'); &shutdown(); exit 1; } } - &status("IRC: ok, done one cycle of IRC servers; trying again."); + &status('IRC: ok, done one cycle of IRC servers; trying again.'); &loadIRCServers(); goto loop; @@ -105,86 +102,86 @@ sub irc { my %args = ( Nick => $param{'ircNick'}, - Server => $server, + Server => $resolve, Port => $port, Ircname => $param{'ircName'}, ); $args{'LocalAddr'} = $param{'ircHost'} if ( $param{'ircHost'} ); $args{'Password'} = $param{'ircPasswd'} if ( $param{'ircPasswd'} ); - foreach my $mynick ( split ',', $param{'ircNick'} ) { - &status( -"Connecting to port $port of server $server ($resolve) as $mynick ..." - ); - $args{'Nick'} = $mynick; - $conns{$mynick} = $irc->newconn(%args); - if ( !defined $conns{$mynick} ) { - &ERROR("IRC: connection failed."); - &ERROR( -"add \"set ircHost 0.0.0.0\" to your config. If that does not work" - ); - &ERROR( -"Please check /etc/hosts to see if you have a localhost line like:" - ); - &ERROR("127.0.0.1 localhost localhost"); - &ERROR( - "If this is still a problem, please contact the maintainer."); - } - $conns{$mynick}->maxlinelen($maxlinelen); - - # handler stuff. - $conns{$mynick}->add_global_handler( 'caction', \&on_action ); - $conns{$mynick}->add_global_handler( 'cdcc', \&on_dcc ); - $conns{$mynick}->add_global_handler( 'cping', \&on_ping ); - $conns{$mynick}->add_global_handler( 'crping', \&on_ping_reply ); - $conns{$mynick}->add_global_handler( 'cversion', \&on_version ); - $conns{$mynick}->add_global_handler( 'crversion', \&on_crversion ); - $conns{$mynick}->add_global_handler( 'dcc_open', \&on_dcc_open ); - $conns{$mynick}->add_global_handler( 'dcc_close', \&on_dcc_close ); - $conns{$mynick}->add_global_handler( 'chat', \&on_chat ); - $conns{$mynick}->add_global_handler( 'msg', \&on_msg ); - $conns{$mynick}->add_global_handler( 'public', \&on_public ); - $conns{$mynick}->add_global_handler( 'join', \&on_join ); - $conns{$mynick}->add_global_handler( 'part', \&on_part ); - $conns{$mynick}->add_global_handler( 'topic', \&on_topic ); - $conns{$mynick}->add_global_handler( 'invite', \&on_invite ); - $conns{$mynick}->add_global_handler( 'kick', \&on_kick ); - $conns{$mynick}->add_global_handler( 'mode', \&on_mode ); - $conns{$mynick}->add_global_handler( 'nick', \&on_nick ); - $conns{$mynick}->add_global_handler( 'quit', \&on_quit ); - $conns{$mynick}->add_global_handler( 'notice', \&on_notice ); - $conns{$mynick} - ->add_global_handler( 'whoischannels', \&on_whoischannels ); - $conns{$mynick} - ->add_global_handler( 'useronchannel', \&on_useronchannel ); - $conns{$mynick}->add_global_handler( 'whois', \&on_whois ); - $conns{$mynick}->add_global_handler( 'other', \&on_other ); - $conns{$mynick}->add_global_handler( 'disconnect', \&on_disconnect ); - $conns{$mynick} - ->add_global_handler( [ 251, 252, 253, 254, 255 ], \&on_init ); - - # $conns{$mynick}->add_global_handler(302, \&on_init); # userhost - $conns{$mynick}->add_global_handler( 303, \&on_ison ); # notify. - $conns{$mynick}->add_global_handler( 315, \&on_endofwho ); - $conns{$mynick}->add_global_handler( 422, \&on_endofwho ); # nomotd. - $conns{$mynick}->add_global_handler( 324, \&on_modeis ); - $conns{$mynick}->add_global_handler( 333, \&on_topicinfo ); - $conns{$mynick}->add_global_handler( 352, \&on_who ); - $conns{$mynick}->add_global_handler( 353, \&on_names ); - $conns{$mynick}->add_global_handler( 366, \&on_endofnames ); - $conns{$mynick}->add_global_handler( 376, \&on_endofmotd ) - ; # on_connect. - $conns{$mynick}->add_global_handler( 433, \&on_nick_taken ); - $conns{$mynick}->add_global_handler( 439, \&on_targettoofast ); - - # for proper joinnextChan behaviour - $conns{$mynick}->add_global_handler( 471, \&on_chanfull ); - $conns{$mynick}->add_global_handler( 473, \&on_inviteonly ); - $conns{$mynick}->add_global_handler( 474, \&on_banned ); - $conns{$mynick}->add_global_handler( 475, \&on_badchankey ); - $conns{$mynick}->add_global_handler( 443, \&on_useronchan ); - - # end of handler stuff. + foreach my $mynick ( sort split ',', $param{'ircNick'} ) { + if (!defined $conns{$mynick}) { + &status("Connecting to port $port of server $server ($resolve) as $mynick ..."); + $args{'Nick'} = $mynick; + $args{'Username'} = $mynick; + $conns{$mynick} = $irc->newconn(%args); + # FIXME: connections should happen in the background and get retried per nick + #sleep(10.0); + if ( !defined $param{'ircHost'} and !defined $conns{$mynick} ) { + &ERROR("IRC: $mynick @ $server connection failed."); + &ERROR("add \"set ircHost 0.0.0.0\" to your config. If that does not work"); + &ERROR('Please check /etc/hosts to see if you have a localhost line like:'); + &ERROR('127.0.0.1 localhost localhost'); + &ERROR('If this is still a problem, please contact the maintainer.'); + } + if (defined $conns{$mynick}) { + # explicit binmode for socket as "use open" does not seem to work here + binmode $conns{$mynick}->{_socket}, ":encoding(UTF-8)"; + + $conns{$mynick}->maxlinelen($maxlinelen); + + # handler stuff. + $conns{$mynick}->add_global_handler( 'caction', \&on_action ); + $conns{$mynick}->add_global_handler( 'cdcc', \&on_dcc ); + $conns{$mynick}->add_global_handler( 'cping', \&on_ping ); + $conns{$mynick}->add_global_handler( 'crping', \&on_ping_reply ); + $conns{$mynick}->add_global_handler( 'cversion', \&on_version ); + $conns{$mynick}->add_global_handler( 'crversion', \&on_crversion ); + $conns{$mynick}->add_global_handler( 'dcc_open', \&on_dcc_open ); + $conns{$mynick}->add_global_handler( 'dcc_close', \&on_dcc_close ); + $conns{$mynick}->add_global_handler( 'chat', \&on_chat ); + $conns{$mynick}->add_global_handler( 'msg', \&on_msg ); + $conns{$mynick}->add_global_handler( 'public', \&on_public ); + $conns{$mynick}->add_global_handler( 'join', \&on_join ); + $conns{$mynick}->add_global_handler( 'part', \&on_part ); + $conns{$mynick}->add_global_handler( 'topic', \&on_topic ); + $conns{$mynick}->add_global_handler( 'invite', \&on_invite ); + $conns{$mynick}->add_global_handler( 'kick', \&on_kick ); + $conns{$mynick}->add_global_handler( 'mode', \&on_mode ); + $conns{$mynick}->add_global_handler( 'nick', \&on_nick ); + $conns{$mynick}->add_global_handler( 'quit', \&on_quit ); + $conns{$mynick}->add_global_handler( 'notice', \&on_notice ); + $conns{$mynick}->add_global_handler( 'whoischannels', \&on_whoischannels ); + $conns{$mynick}->add_global_handler( 'useronchannel', \&on_useronchannel ); + $conns{$mynick}->add_global_handler( 'whois', \&on_whois ); + $conns{$mynick}->add_global_handler( 'other', \&on_other ); + $conns{$mynick}->add_global_handler( 'disconnect', \&on_disconnect ); + $conns{$mynick}->add_global_handler( [ 251, 252, 253, 254, 255 ], \&on_init ); + + # $conns{$mynick}->add_global_handler(302, \&on_init); # userhost + $conns{$mynick}->add_global_handler( 303, \&on_ison ); # notify. + $conns{$mynick}->add_global_handler( 315, \&on_endofwho ); + $conns{$mynick}->add_global_handler( 422, \&on_endofwho ); # nomotd. + $conns{$mynick}->add_global_handler( 324, \&on_modeis ); + $conns{$mynick}->add_global_handler( 333, \&on_topicinfo ); + $conns{$mynick}->add_global_handler( 352, \&on_who ); + $conns{$mynick}->add_global_handler( 353, \&on_names ); + $conns{$mynick}->add_global_handler( 366, \&on_endofnames ); + $conns{$mynick}->add_global_handler( "001", \&on_connected ) + ; # on_connect. + $conns{$mynick}->add_global_handler( 433, \&on_nick_taken ); + $conns{$mynick}->add_global_handler( 439, \&on_targettoofast ); + + # for proper joinnextChan behaviour + $conns{$mynick}->add_global_handler( 471, \&on_chanfull ); + $conns{$mynick}->add_global_handler( 473, \&on_inviteonly ); + $conns{$mynick}->add_global_handler( 474, \&on_banned ); + $conns{$mynick}->add_global_handler( 475, \&on_badchankey ); + $conns{$mynick}->add_global_handler( 443, \&on_useronchan ); + + # end of handler stuff. + } + } } &clearIRCVars(); @@ -200,7 +197,7 @@ sub irc { # should likely listen on a tcp port instead #$irc->addfh(STDIN, \&on_stdin, 'r'); - &status("starting main loop"); + &status('starting main loop'); $irc->start; } @@ -234,7 +231,7 @@ sub say { } if ( &getChanConf( 'silent', $talkchannel ) - and not( &IsFlag("s") and &verifyUser( $who, $nuh{ lc $who } ) ) ) + and not( &IsFlag('s') and &verifyUser( $who, $nuh{ lc $who } ) ) ) { &DEBUG("say: silent in $talkchannel, not saying $msg"); return; @@ -286,7 +283,7 @@ sub say { sub msg { my ( $nick, $msg ) = @_; if ( !defined $nick ) { - &ERROR("msg: nick == NULL."); + &ERROR('msg: nick == NULL.'); return; } @@ -298,7 +295,7 @@ sub msg { # some say() end up here (eg +help) if ( &getChanConf( 'silent', $nick ) - and not( &IsFlag("s") and &verifyUser( $who, $nuh{ lc $who } ) ) ) + and not( &IsFlag('s') and &verifyUser( $who, $nuh{ lc $who } ) ) ) { &DEBUG("msg: silent in $nick, not saying $msg"); return; @@ -338,19 +335,19 @@ sub action { my $mynick = $conn->nick(); my ( $target, $txt ) = @_; if ( !defined $txt ) { - &WARN("action: txt == NULL."); + &WARN('action: txt == NULL.'); return; } if ( &getChanConf( 'silent', $target ) - and not( &IsFlag("s") and &verifyUser( $who, $nuh{ lc $who } ) ) ) + and not( &IsFlag('s') and &verifyUser( $who, $nuh{ lc $who } ) ) ) { &DEBUG("action: silent in $target, not doing $txt"); return; } if ( length $txt > 480 ) { - &status("action: txt too long; truncating."); + &status('action: txt too long; truncating.'); chop($txt) while ( length $txt > 480 ); } @@ -362,7 +359,7 @@ sub action { sub notice { my ( $target, $txt ) = @_; if ( !defined $txt ) { - &WARN("notice: txt == NULL."); + &WARN('notice: txt == NULL.'); return; } @@ -414,7 +411,7 @@ sub performReply { my ($reply) = @_; if ( !defined $reply or $reply =~ /^\s*$/ ) { - &DEBUG("performReply: reply == NULL."); + &DEBUG('performReply: reply == NULL.'); return; } @@ -492,7 +489,7 @@ sub dccsay { my ( $who, $reply ) = @_; if ( !defined $reply or $reply =~ /^\s*$/ ) { - &WARN("dccsay: reply == NULL."); + &WARN('dccsay: reply == NULL.'); return; } @@ -522,6 +519,7 @@ sub joinchan { my ( $chan, $key ) = @_; $key ||= &getChanConf( 'chankey', $chan ); $key ||= ''; + my $mynick = $conn->nick(); # forgot for about 2 years to implement channel keys when moving # over to Net::IRC... @@ -532,12 +530,12 @@ sub joinchan { } #} else { - &status("joining $b_blue$chan $key$ob"); + &status("$mynick joining $b_blue$chan $key$ob"); return if ( $conn->join( $chan, $key ) ); return if ( &validChan($chan) ); - &DEBUG("joinchan: join failed. trying connect!"); + &DEBUG('joinchan: join failed. trying connect!'); &clearIRCVars(); $conn->connect(); @@ -571,7 +569,7 @@ sub part { sub mode { my ( $chan, @modes ) = @_; - my $modes = join( " ", @modes ); + my $modes = join( ' ', @modes ); if ( &validChan($chan) == 0 ) { &ERROR("mode: invalid chan => '$chan'."); @@ -676,11 +674,11 @@ sub unban { sub quit { my ($quitmsg) = @_; if ( defined $conn ) { - &status( "QUIT " . $conn->nick() . " has quit IRC ($quitmsg)" ); + &status( 'QUIT ' . $conn->nick() . " has quit IRC ($quitmsg)" ); $conn->quit($quitmsg); } else { - &WARN("quit: could not quit!"); + &WARN('quit: could not quit!'); } } @@ -689,12 +687,12 @@ sub nick { my $mynick = $conn->nick(); if ( !defined $newnick ) { - &ERROR("nick: nick == NULL."); + &ERROR('nick: nick == NULL.'); return; } if ( !defined $mynick ) { - &WARN("nick: mynick == NULL."); + &WARN('nick: mynick == NULL.'); return; } @@ -705,7 +703,7 @@ sub nick { if ($bad) { &WARN( "Nick: not going to try to change from $mynick to $newnick. [" . scalar(gmtime) - . "]" ); + . ']' ); # hrm... over time we lose track of our own nick. #return; @@ -737,20 +735,19 @@ sub invite { # Usage: &joinNextChan(); sub joinNextChan { my $joined = 0; - foreach ( sort keys %conns ) { - $conn = $conns{$_}; - my $mynick = $conn->nick(); - my @join = getJoinChans(1); + if (defined $conn) { + my $mynick = $conn->nick(); + my @join = getJoinChans(1); - if ( scalar @join ) { - my $chan = shift @join; - &joinchan($chan); + if ( scalar @join ) { + my $chan = shift @join; + &joinchan($chan); - if ( my $i = scalar @join ) { - &status("joinNextChan: $mynick $i chans to join."); - } - $joined = 1; - } + if ( my $i = scalar @join ) { + &status("joinNextChan: $mynick $i chans to join."); + } + $joined = 1; + } } return if $joined; @@ -759,8 +756,8 @@ sub joinNextChan { my $timestr = &Time2String($delta); # FIXME: @join should be @in instead (hacked to 10) - #my $rate = sprintf("%.1f", $delta / @in); - my $rate = sprintf( "%.1f", $delta / 10 ); + #my $rate = sprintf('%.1f', $delta / @in); + my $rate = sprintf( '%.1f', $delta / 10 ); delete $cache{joinTime}; &status("time taken to join all chans: $timestr; rate: $rate sec/join"); @@ -799,7 +796,7 @@ sub IsNickInChan { $chan =~ tr/A-Z/a-z/; # not lowercase unfortunately. if ( $chan =~ /^$/ ) { - &DEBUG("INIC: chan == NULL."); + &DEBUG('INIC: chan == NULL.'); return 0; } @@ -814,7 +811,7 @@ sub IsNickInChan { else { foreach ( keys %channels ) { next unless (/[A-Z]/); - &DEBUG("iNIC: hash channels contains mixed cased chan!!!"); + &DEBUG('iNIC: hash channels contains mixed cased chan!!!'); } return 0; } @@ -850,7 +847,7 @@ sub validChan { if ( defined $channels{$chan} or exists $channels{$chan} ) { if ( $chan =~ /^_?default$/ ) { - # &WARN("validC: chan cannot be _default! returning 0!"); + # &WARN('validC: chan cannot be _default! returning 0!'); return 0; } @@ -901,7 +898,7 @@ sub getJoinChans { my @skip; my @join; - # Display "Chans:" only if more than $show seconds since last display + # Display 'Chans:' only if more than $show seconds since last display if ( time() - $lastChansTime > $show ) { $lastChansTime = time(); } @@ -959,7 +956,7 @@ sub getJoinChans { sub closeDCC { - # &DEBUG("closeDCC called."); + # &DEBUG('closeDCC called.'); my $type; foreach $type ( keys %dcc ) {