X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2FIRC%2FIrc.pl;h=49d0438ef576933c861ad69d40632a6ff4f812d5;hb=130fc9d79663d571b32c8a625e3487e7b42c10da;hp=00269c07a9bbfd5acb2f99fb7d2e41a3fa5d4375;hpb=750f1890feb95bd1afc2df0bb06e3099dcc48e3f;p=infobot.git diff --git a/src/IRC/Irc.pl b/src/IRC/Irc.pl index 00269c0..49d0438 100644 --- a/src/IRC/Irc.pl +++ b/src/IRC/Irc.pl @@ -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. @@ -260,12 +265,7 @@ sub msg { $msgsize = length $msg; } - if ($msgType =~ /private/i) { # hack. - $conn->privmsg($nick, $msg); - - } else { - &DEBUG("msg: msgType is unknown!"); - } + $conn->privmsg($nick, $msg); } } @@ -435,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(); } } @@ -454,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"); @@ -649,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. @@ -712,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; @@ -749,7 +766,7 @@ sub clearChanVars { } sub clearIRCVars { -# &DEBUG("clearIRCVars() called!"); + &DEBUG("clearIRCVars() called!"); undef %channels; undef %floodjoin; @@ -850,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++; }