]> git.donarmstrong.com Git - infobot.git/blobdiff - src/IRC/IrcHooks.pl
- dbGet: warn if $select is NULL
[infobot.git] / src / IRC / IrcHooks.pl
index d1359d901d3cbef6642b56aff504d09273c517a8..ff75f369b984ece5b1b5decfe887c114828d9ee4 100644 (file)
@@ -355,8 +355,11 @@ sub on_endofnames {
 
     # sync time should be done in on_endofwho like in BitchX
     if (exists $cache{jointime}{$chan}) {
-       my $delta_time = sprintf("%.03f", &timeget() - $cache{jointime}{$chan});
+       my $delta_time = sprintf("%.03f", &timedelta($cache{jointime}{$chan}) );
        $delta_time    = 0      if ($delta_time < 0);
+       if ($delta_time > 100) {
+           &WARN("endofnames: delta_time > 100 ($delta_time)");
+       }
 
        &status("$b_blue$chan$ob: sync in ${delta_time}s.");
     }
@@ -379,7 +382,8 @@ sub on_endofnames {
     &status("$b_blue$chan$ob: [$chanstats]");
 
     &chanServCheck($chan);
-    &joinNextChan();
+    # schedule used to solve ircu (OPN) "target too fast" problems.
+    $conn->schedule(5, sub { &joinNextChan(); } );
 }
 
 sub on_init {
@@ -429,16 +433,23 @@ sub on_join {
     if (exists $netsplit{lc $who}) {
        delete $netsplit{lc $who};
        $netsplit = 1;
+
+       if (!scalar keys %netsplit) {
+           &DEBUG("on_join: netsplit hash is now empty!");
+           undef %netsplitservers;
+           &netsplitCheck();   # any point in running this?
+           &chanlimitCheck();
+       }
     }
 
-    if ($netsplit and !$netsplittime) {
+    if ($netsplit and !exists $cache{netsplit}) {
        &DEBUG("on_join: ok.... re-running chanlimitCheck in 60.");
        $conn->schedule(60, sub {
                &chanlimitCheck();
-               $netsplittime = undef;
+               delete $cache{netsplit};
        } );
 
-       $netsplittime = time();
+       $cache{netsplit} = time();
     }
 
     # how to tell if there's a netjoin???
@@ -454,7 +465,8 @@ sub on_join {
     ### on-join bans.
     my @bans;
     push(@bans, keys %{ $bans{$chan} }) if (exists $bans{$chan});
-    push(@bans, keys %{ $bans{"*"} })  if (exists $bans{"*"});
+    push(@bans, keys %{ $bans{"*"} })   if (exists $bans{"*"});
+
     foreach (@bans) {
        my $ban = $_;
        s/\?/./g;
@@ -486,6 +498,7 @@ sub on_join {
 
     # no need to go further.
     return if ($netsplit);
+
     # who == bot.
     if ($who eq $ident or $who =~ /^$ident$/i) {
        if (defined( my $whojoin = $cache{join}{$chan} )) {
@@ -501,10 +514,10 @@ sub on_join {
     }
 
     ### ROOTWARN:
-    &rootWarn($who,$user,$host,$chan)
-               if (&IsChanConf("rootWarn") &&
-                   $user =~ /^r(oo|ew|00)t$/i &&
-                   $channels{$chan}{'o'}{$ident});
+    &rootWarn($who,$user,$host,$chan) if (
+               &IsChanConf("rootWarn") &&
+               $user =~ /^r(oo|ew|00)t$/i
+    );
 
     ### NEWS:
     if (&IsChanConf("news") && &IsChanConf("newsKeepRead")) {
@@ -563,8 +576,8 @@ sub on_mode {
 
 sub on_modeis {
     my ($self, $event) = @_;
-    my $nick = $event->nick();
     my ($myself, undef,@args) = $event->args();
+    my $nick   = $event->nick();
     $chan      = ($event->args())[1];
 
     &hookMode($nick, @args);
@@ -614,6 +627,7 @@ sub on_nick {
     if (exists $netsplit{lc $newnick}) {
        &status("Netsplit: $newnick/$nick came back from netsplit and changed to original nick! removing from hash.");
        delete $netsplit{lc $newnick};
+       &netsplitCheck() if (time() != $sched{netsplitCheck}{TIME});
     }
 
     my ($chan,$mode);
@@ -671,6 +685,7 @@ sub on_notice {
 
        if ($check) {
            &status("nickserv told us to register; doing it.");
+
            if (&IsParam("nickServ_pass")) {
                &status("NickServ: ==> Identifying.");
                &rawout("PRIVMSG NickServ :IDENTIFY $param{'nickServ_pass'}");
@@ -695,6 +710,7 @@ sub on_notice {
        }
     } elsif ($nick =~ /^ChanServ$/i) {         # chanserv.
        &status("ChanServ: <== '$args'.");
+
     } else {
        if ($chan =~ /^$mask{chan}$/) { # channel notice.
            &status("-$nick/$chan- $args");
@@ -728,7 +744,11 @@ sub on_part {
 
     $chanstats{$chan}{'Part'}++;
     &delUserInfo($nick,$chan);
-    &clearChanVars($chan) if ($nick eq $ident);
+    if ($nick eq $ident) {
+       &DEBUG("on_part: ok, I left $chan... clearChanVars...");
+       &clearChanVars($chan);
+    }
+
     if (!&IsNickInAnyChan($nick) and &IsChanConf("seenStats")) {
        delete $userstats{lc $nick};
     }
@@ -778,9 +798,20 @@ sub on_public {
        $userstats{lc $nick}{'Time'} = time();
     }
 
-#    if (&IsChanConf("hehCounter")) {
-#      #...
-#    }
+    # would this slow things down?
+    if ($_ = &getChanConf("ircTextCounters")) {
+       foreach (split /[\s]+/) {
+           next unless ($msg =~ /^\Q$_\E$/i);
+           &status("textcounters: $_ matched for $who");
+
+           my $v = &dbGet("stats", "counter", "nick='$who' and type='$msg'");
+           $v++;
+
+           &dbReplace("stats", (nick => $who, type => $_, counter => $v) );
+           # does not work, atleast with old mysql!!! :(
+#          &dbReplace("stats", (nick => $who, type => $_, -counter => "counter+1") );
+       }
+    }
 
     &hookMsg('public', $chan, $nick, $msg);
     $chanstats{$chan}{'PublicMsg'}++;
@@ -818,7 +849,8 @@ sub on_quit {
     if (exists $nuh{lc $nick}) {
        delete $nuh{lc $nick};
     } else {
-       &DEBUG("on_quit: nuh{lc $nick} does not exist! FIXME");
+       # well.. it's good but weird that this has happened - lets just
+       # be quiet about it.
     }
     delete $userstats{lc $nick} if (&IsChanConf("seenStats"));
     delete $chanstats{lc $nick};
@@ -828,14 +860,20 @@ sub on_quit {
        $reason = "NETSPLIT: $1 <=> $2";
 
        # chanlimit code.
-       if (&ChanConfList("chanlimitcheck") and !scalar keys %netsplit) {
-           &DEBUG("on_quit: netsplit detected on $chan; disabling chan limit.");
-           &rawout("MODE $chan -l");
+       my @l = &getNickInChans($nick);
+       &DEBUG("on_quit: l => ".scalar(@l) );
+
+       foreach $chan ( &getNickInChans($nick) ) {
+           next unless ( &IsChanConf("chanlimitcheck") );
+           next unless ( exists $channels{$_}{'l'} );
+
+           &DEBUG("on_quit: netsplit detected on $_; disabling chan limit.");
+           &rawout("MODE $_ -l");
        }
 
        $netsplit{lc $nick} = time();
        if (!exists $netsplitservers{$1}{$2}) {
-           &status("netsplit detected between $1 and $2.");
+           &status("netsplit detected between $1 and $2 at [".scalar(localtime)."]");
            $netsplitservers{$1}{$2} = time();
        }
     }
@@ -846,6 +884,7 @@ sub on_quit {
        &ERROR("^^^ THIS SHOULD NEVER HAPPEN (10).");
     }
 
+    # does this work?
     if ($nick !~ /^\Q$ident\E$/ and $nick =~ /^\Q$param{'ircNick'}\E$/i) {
        &status("nickchange: own nickname became free; changing.");
        &nick($param{'ircNick'});
@@ -875,11 +914,12 @@ sub on_targettoofast {
            $cache{sleepTime} = time();
        }
 
-    } else {
-       if (!exists $cache{TargetTooFast}) {
-           &DEBUG("on_ttf: failed: $why");
-           $cache{TargetTooFast}++;
-       }
+       return;
+    }
+
+    if (!exists $cache{TargetTooFast}) {
+       &DEBUG("on_ttf: failed: $why");
+       $cache{TargetTooFast}++;
     }
 }
 
@@ -950,27 +990,38 @@ sub on_crversion {
 
     if ($ver =~ /bitchx/i) {
        $ver{bitchx}{$nick}     = $ver;
+
     } elsif ($ver =~ /xc\!|xchat/i) {
        $ver{xchat}{$nick}      = $ver;
+
     } elsif ($ver =~ /irssi/i) {
        $ver{irssi}{$nick}      = $ver;
+
     } elsif ($ver =~ /epic/i) {
        $ver{epic}{$nick}       = $ver;
+
     } elsif ($ver =~ /mirc/i) {
        &DEBUG("verstats: mirc: $nick => '$ver'.");
        $ver{mirc}{$nick}       = $ver;
+
     } elsif ($ver =~ /ircle/i) {
        $ver{ircle}{$nick}      = $ver;
+
     } elsif ($ver =~ /ircII/i) {
        $ver{ircII}{$nick}      = $ver;
+
     } elsif ($ver =~ /sirc /i) {
        $ver{sirc}{$nick}       = $ver;
+
     } elsif ($ver =~ /kvirc/i) {
        $ver{kvirc}{$nick}      = $ver;
+
     } elsif ($ver =~ /eggdrop/i) {
        $ver{eggdrop}{$nick}    = $ver;
+
     } elsif ($ver =~ /xircon/i) {
        $ver{xircon}{$nick}     = $ver;
+
     } else {
        &DEBUG("verstats: other: $nick => '$ver'.");
        $ver{other}{$nick}      = $ver;
@@ -997,6 +1048,11 @@ sub on_who {
        return;
     }
 
+    if ($args[5] =~ /^nickserv$/i and !$nickserv) {
+       &DEBUG("ok... we did a who for nickserv.");
+       &rawout("PRIVMSG NickServ :IDENTIFY $param{'nickServ_pass'}");
+    }
+
     $nuh{lc $args[5]} = $args[5]."!".$args[2]."\@".$args[3];
 }
 
@@ -1016,6 +1072,7 @@ sub on_whoisuser {
 sub on_chanfull {
     my ($self, $event) = @_;
     my @args   = $event->args;
+
     &DEBUG("on_chanfull: args => @args");
     &joinNextChan();
 }
@@ -1023,6 +1080,7 @@ sub on_chanfull {
 sub on_inviteonly {
     my ($self, $event) = @_;
     my @args   = $event->args;
+
     &DEBUG("on_inviteonly: args => @args");
     &joinNextChan();
 }
@@ -1030,6 +1088,7 @@ sub on_inviteonly {
 sub on_banned {
     my ($self, $event) = @_;
     my @args   = $event->args;
+
     &DEBUG("on_banned: args => @args");
     &joinNextChan();
 }
@@ -1037,6 +1096,7 @@ sub on_banned {
 sub on_badchankey {
     my ($self, $event) = @_;
     my @args   = $event->args;
+
     &DEBUG("on_badchankey: args => @args");
     &joinNextChan();
 }