]> git.donarmstrong.com Git - infobot.git/blobdiff - src/IRC/Irc.pl
more multiconnect issues
[infobot.git] / src / IRC / Irc.pl
index 82542afce48c795f41959e9f4d63327e8b934120..ced6f28e5ab81b4c5de1c4b1a12f2fd4f9b4cb50 100644 (file)
@@ -39,14 +39,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 +57,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;
@@ -112,79 +112,79 @@ sub irc {
     $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}) {
+               $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 +200,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 +234,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 +286,7 @@ sub say {
 sub msg {
     my ( $nick, $msg ) = @_;
     if ( !defined $nick ) {
-        &ERROR("msg: nick == NULL.");
+        &ERROR('msg: nick == NULL.');
         return;
     }
 
@@ -298,7 +298,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 +338,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 +362,7 @@ sub action {
 sub notice {
     my ( $target, $txt ) = @_;
     if ( !defined $txt ) {
-        &WARN("notice: txt == NULL.");
+        &WARN('notice: txt == NULL.');
         return;
     }
 
@@ -414,7 +414,7 @@ sub performReply {
     my ($reply) = @_;
 
     if ( !defined $reply or $reply =~ /^\s*$/ ) {
-        &DEBUG("performReply: reply == NULL.");
+        &DEBUG('performReply: reply == NULL.');
         return;
     }
 
@@ -492,7 +492,7 @@ sub dccsay {
     my ( $who, $reply ) = @_;
 
     if ( !defined $reply or $reply =~ /^\s*$/ ) {
-        &WARN("dccsay: reply == NULL.");
+        &WARN('dccsay: reply == NULL.');
         return;
     }
 
@@ -522,6 +522,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 +533,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 +572,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 +677,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 +690,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 +706,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,21 +738,23 @@ sub invite {
 # Usage: &joinNextChan();
 sub joinNextChan {
     my $joined = 0;
-    foreach ( sort keys %conns ) {
-        $conn = $conns{$_};
-        my $mynick = $conn->nick();
-        my @join   = getJoinChans(1);
-
-        if ( scalar @join ) {
-            my $chan = shift @join;
-            &joinchan($chan);
-
-            if ( my $i = scalar @join ) {
-                &status("joinNextChan: $mynick $i chans to join.");
-            }
-            $joined = 1;
-        }
-    }
+    #foreach ( sort keys %conns ) {
+        #$conn = $conns{$mynick};
+       if (defined $conn) {
+           my $mynick = $conn->nick();
+           my @join   = getJoinChans(1);
+
+           if ( scalar @join ) {
+               my $chan = shift @join;
+               &joinchan($chan);
+
+               if ( my $i = scalar @join ) {
+                   &status("joinNextChan: $mynick $i chans to join.");
+               }
+               $joined = 1;
+           }
+       }
+    #}
     return if $joined;
 
     if ( exists $cache{joinTime} ) {
@@ -759,8 +762,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 +802,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 +817,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 +853,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 +904,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 +962,7 @@ sub getJoinChans {
 
 sub closeDCC {
 
-    #    &DEBUG("closeDCC called.");
+    #    &DEBUG('closeDCC called.');
     my $type;
 
     foreach $type ( keys %dcc ) {