X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2FIRC%2FIrc.pl;h=a5a90cafe10754a6dca26c7ac29b1750ed0565c8;hb=22a73ba6205f6120785f2e6a17921a76774ec3f7;hp=d6f81b6cb1b1ec31a0a2bd6b5ef80c4997dd9d14;hpb=92c3870d1fd6aa5f063a57cfb690aea12ec77df7;p=infobot.git diff --git a/src/IRC/Irc.pl b/src/IRC/Irc.pl index d6f81b6..a5a90ca 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; } @@ -142,6 +143,7 @@ sub irc { $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(303, \&on_ison); # notify. $conn->add_global_handler(315, \&on_endofwho); $conn->add_global_handler(422, \&on_endofwho); # nomotd. $conn->add_global_handler(324, \&on_modeis); @@ -157,6 +159,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. @@ -275,16 +278,13 @@ sub action { return; } - my $rawout = "PRIVMSG $target :\001ACTION $txt\001"; - if (length $rawout > 510) { + if (length $txt > 480) { &status("action: txt too long; truncating."); - - chop($rawout) while (length($rawout) > 510); - $rawout .= "\001"; + chop($txt) while (length $txt > 480); } &status("* $ident/$target $txt"); - rawout($rawout); + $conn->me($target, $txt); } # Usage: ¬ice(nick || chan, txt); @@ -426,22 +426,23 @@ sub dcc_close { } sub joinchan { - my ($chankey) = @_; - my $chan = lc $chankey; + my ($chan) = @_; + my $key = &getChanConf("chankey", $chan) || ""; - if ($chankey =~ s/^($mask{chan}),\S+/ /) { - $chan = lc $1; - } + # forgot for about 2 years to implement channel keys when moving + # over to Net::IRC... # 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!"); - $conn->connect(); - } + + return if ($conn->join($chan, $key)); + + &DEBUG("joinchan: join failed. trying connect!"); + &clearIRCVars(); + $conn->connect(); } } @@ -463,7 +464,7 @@ sub part { # next; } - rawout("PART $chan"); + $conn->part($chan); # deletion of $channels{chan} is done in &entryEvt(). } } @@ -479,6 +480,7 @@ sub mode { &DEBUG("mode: MODE $chan $modes"); + # should move to use Net::IRC's $conn->mode()... but too lazy. rawout("MODE $chan $modes"); } @@ -509,21 +511,17 @@ sub kick { foreach $chan (@chans) { if (!&IsNickInChan($nick,$chan)) { - &status("Kick: $nick is not on $chan.") if (scalar @chans == 1); + &status("kick: $nick is not on $chan.") if (scalar @chans == 1); next; } if (!exists $channels{$chan}{o}{$ident}) { - &status("Kick: do not have ops on $chan :("); + &status("kick: do not have ops on $chan :("); next; } &status("Kicking $nick from $chan."); - if ($msg eq "") { - &rawout("KICK $chan $nick"); - } else { - &rawout("KICK $chan $nick :$msg"); - } + $conn->kick($chan, $nick, $msg); } } @@ -539,7 +537,7 @@ sub ban { foreach $chan (@chans) { if (!exists $channels{$chan}{o}{$ident}) { - &status("Ban: do not have ops on $chan :("); + &status("ban: do not have ops on $chan :("); next; } @@ -601,7 +599,8 @@ sub nick { if ($bad) { &WARN("Nick: not going to try and get my nick back. [". scalar(localtime). "]"); - return; +# hrm... over time we lose track of our own nick. +# return; } if ($nick =~ /^$mask{nick}$/) { @@ -609,6 +608,8 @@ sub nick { if (defined $ident) { &status("nick: Changing nick to $nick (from $ident)"); + # following shouldn't be here :( + $ident = $nick; } else { &DEBUG("first time nick change."); $ident = $nick; @@ -623,9 +624,10 @@ sub nick { sub invite { my($who, $chan) = @_; - rawout("INVITE $who $chan"); -} + # todo: check if $who or $chan are invalid. + $conn->invite($who, $chan); +} ########## # Channel related functions... @@ -652,7 +654,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. @@ -715,14 +717,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 =~ /^_?default$/) { +# &WARN("validC: chan cannot be _default! returning 0!"); + return 0; + } + return 1; } else { return 0; @@ -752,7 +765,7 @@ sub clearChanVars { } sub clearIRCVars { -# &DEBUG("clearIRCVars() called!"); + &DEBUG("clearIRCVars() called!"); undef %channels; undef %floodjoin; @@ -877,7 +890,7 @@ sub getHostMask { return &makeHostMask($nuh{$n}); } else { $cache{on_who_Hack} = 1; - &rawout("WHO $n"); + $conn->who($n); } }