]> git.donarmstrong.com Git - infobot.git/blobdiff - src/IRC/Irc.pl
- Another patch from Morten Brix Pedersen <morten@wtf.dk>:
[infobot.git] / src / IRC / Irc.pl
index 48a077df741eb978305ee584f8dd52bf5c9d762e..49d0438ef576933c861ad69d40632a6ff4f812d5 100644 (file)
@@ -97,11 +97,12 @@ sub irc {
                Ircname => $param{'ircName'},
     );
     $args{'LocalAddr'} = $param{'ircHost'} if ($param{'ircHost'});
+    $args{'Password'} = $param{'ircPasswd'} if ($param{'ircPasswd'});
 
     $conn = $irc->newconn(%args);
 
     if (!defined $conn) {
-       &ERROR("irc: conn was not created!defined!!!");
+       &ERROR("internal: perl IRC connection object does not exist.");
        return 1;
     }
 
@@ -135,12 +136,15 @@ sub irc {
        $conn->add_handler('nick',      \&on_nick);
        $conn->add_handler('quit',      \&on_quit);
        $conn->add_handler('notice',    \&on_notice);
-       $conn->add_handler('whoisuser', \&on_whoisuser);
+       $conn->add_handler('whoischannels', \&on_whoischannels);
+       $conn->add_handler('useronchannel', \&on_useronchannel);
+       $conn->add_handler('whois',     \&on_whois);
        $conn->add_handler('other',     \&on_other);
        $conn->add_global_handler('disconnect', \&on_disconnect);
        $conn->add_global_handler([251,252,253,254,255], \&on_init);
 ###    $conn->add_global_handler([251,252,253,254,255,302], \&on_init);
        $conn->add_global_handler(315, \&on_endofwho);
+       $conn->add_global_handler(422, \&on_endofwho); # nomotd.
        $conn->add_global_handler(324, \&on_modeis);
        $conn->add_global_handler(333, \&on_topicinfo);
        $conn->add_global_handler(352, \&on_who);
@@ -154,6 +158,7 @@ sub irc {
        $conn->add_global_handler(473, \&on_inviteonly);
        $conn->add_global_handler(474, \&on_banned);
        $conn->add_global_handler(475, \&on_badchankey);
+       $conn->add_global_handler(443, \&on_useronchan);
 
     # end of handler stuff.
 
@@ -229,6 +234,13 @@ sub msg {
        return;
     }
 
+    if ($msgType =~ /chat/i) {
+       # todo: warn that we're using msg() to do DCC CHAT?
+       &dccsay($nick, $msg);
+       # todo: make dccsay deal with flood protection?
+       return;
+    }
+
     &status(">$nick< $msg");
 
     if (&whatInterface() =~ /IRC/) {
@@ -423,13 +435,14 @@ sub joinchan {
        $chan = lc $1;
     }
 
-    &status("joining $b_blue$chan$ob");
-
+    # hopefully validChan is right.
     if (&validChan($chan)) {
        &status("join: already on $chan");
     } else {
+       &status("joining $b_blue$chan$ob");
        if (!$conn->join($chan)) {
            &DEBUG("joinchan: join failed. trying connect!");
+           &clearIRCVars();
            $conn->connect();
        }
     }
@@ -442,6 +455,11 @@ sub part {
        next if ($chan eq "");
        $chan =~ tr/A-Z/a-z/;   # lowercase.
 
+       if ($chan !~ /^$mask{chan}$/) {
+           &WARN("part: chan is invalid ($chan)");
+           next;
+       }
+
        &status("parting $chan");
        if (!&validChan($chan)) {
            &WARN("part: not on $chan; doing anyway");
@@ -637,7 +655,7 @@ sub joinNextChan {
        my $rate        = sprintf("%.1f", $delta / @c);
        delete $cache{joinTime};
 
-       &DEBUG("time taken to join all chans: $timestr; rate: $rate sec/join");
+       &status("time taken to join all chans: $timestr; rate: $rate sec/join");
     }
 
     # chanserv check: global channels, in case we missed one.
@@ -700,14 +718,25 @@ sub IsNickInAnyChan {
 
 # Usage: &validChan($chan);
 sub validChan {
+    # todo: use $c instead?
     my ($chan) = @_;
 
+    if (!defined $chan or $chan =~ /^\s*$/) {
+       return 0;
+    }
+
     if (lc $chan ne $chan) {
        &WARN("validChan: lc chan != chan. ($chan); fixing.");
        $chan =~ tr/A-Z/a-z/;
     }
 
-    if (exists $channels{$chan}) {
+    # it's possible that this check creates the hash if empty.
+    if (defined $channels{$chan} or exists $channels{$chan}) {
+       if ($chan eq "_default") {
+#          &WARN("validC: chan cannot be _default! returning 0!");
+           return 0;
+       }
+
        return 1;
     } else {
        return 0;
@@ -737,7 +766,7 @@ sub clearChanVars {
 }
 
 sub clearIRCVars {
-#    &DEBUG("clearIRCVars() called!");
+    &DEBUG("clearIRCVars() called!");
     undef %channels;
     undef %floodjoin;
 
@@ -838,10 +867,15 @@ sub joinfloodCheck {
 
     ### Clean it up.
     my $delete = 0;
+    my $time = time();
     foreach $chan (keys %floodjoin) {
        foreach $who (keys %{ $floodjoin{$chan} }) {
-           my $time = time() - $floodjoin{$chan}{$who}{Time};
-           next unless ($time > 10);
+           my $t       = $floodjoin{$chan}{$who}{Time};
+           next unless (defined $t);
+
+           my $delta   = $time - $t;
+           next unless ($delta > 10);
+
            delete $floodjoin{$chan}{$who};
            $delete++;
        }
@@ -853,7 +887,12 @@ sub joinfloodCheck {
 sub getHostMask {
     my($n) = @_;
 
-    &FIXME("getHostMask($n) called...");
+    if (exists $nuh{$n}) {
+       return &makeHostMask($nuh{$n});
+    } else {
+       $cache{on_who_Hack} = 1;
+       &rawout("WHO $n");
+    }
 }
 
 1;