X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2FIRC%2FIrc.pl;h=51b35a9ff17a6c0774d1542ca9af579a373ff082;hb=d2f87ccd1d5f93afedc8f9f13b9f35260328614a;hp=e4c43a88916b354b38b34f59c19192d830db2a86;hpb=dd3a610c735093c82495a37a26a6353fd776dc43;p=infobot.git diff --git a/src/IRC/Irc.pl b/src/IRC/Irc.pl index e4c43a8..51b35a9 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. @@ -105,86 +102,90 @@ 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}, ":utf8"; + #binmode $conns{$mynick}->{_socket}, ":encoding(UTF-8)"; + # TODO: need to input bytes, but output utf8 + binmode $conns{$mynick}->{_socket}, ":bytes"; + binmode $conns{$mynick}->socket, ":bytes"; + + $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(); @@ -522,6 +523,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,7 +534,7 @@ 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) ); @@ -737,20 +739,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; @@ -904,9 +905,9 @@ sub getJoinChans { # Display 'Chans:' only if more than $show seconds since last display if ( time() - $lastChansTime > $show ) { $lastChansTime = time(); - } - else { - $show = 0; # Don't display since < 15min since last + } else { + # Don't display since < 15min since last + $show = 0; } # can't join any if not connected @@ -929,28 +930,25 @@ sub getJoinChans { $chanconf{$_}{autojoin} = $val; } $skip++ if ( lc $val ne lc $nick ); - } - else { + } else { $skip++; } if ($skip) { push( @skip, $_ ); - } - else { + } else { if ( defined $channels{$_} or exists $channels{$_} ) { push( @in, $_ ); - } - else { + } else { push( @join, $_ ); } } } my $str; - $str .= ' in:' . join( ',', sort @in ) if scalar @in; - $str .= ' skip:' . join( ',', sort @skip ) if scalar @skip; $str .= ' join:' . join( ',', sort @join ) if scalar @join; + $str .= ' in:' . join( ',', sort @in ) if scalar @in; + $str .= ' skip:' . scalar @skip if scalar @skip; &status("Chans: ($nick)$str") if ($show);