X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2FIRC%2FIrc.pl;h=b6eb283c6b8fe8f49c38caca3d3389a6ff481815;hb=8a79d430aef83402420b5a8378e78cfa01051c93;hp=46bb68a3ce023fa28adca6829f1f29500fc0702b;hpb=34a4d11667b0a734343f82d2adbaac23f738ad18;p=infobot.git diff --git a/src/IRC/Irc.pl b/src/IRC/Irc.pl index 46bb68a..b6eb283 100644 --- a/src/IRC/Irc.pl +++ b/src/IRC/Irc.pl @@ -5,10 +5,16 @@ # NOTE: Based on code by Kevin Lenzo & Patrick Cole (c) 1997 # -if (&IsParam("useStrict")) { use strict; } +use strict; -use vars qw($nickserv); -$nickserv = 0; +use vars qw(%floodjoin %nuh %dcc %cache %channels %param %mask + %chanconf %orig %ircPort %ircstats %last %netsplit); +use vars qw($irc $nickserv $ident $conn $msgType $who $talkchannel + $addressed); +use vars qw($notcount $nottime $notsize $msgcount $msgtime $msgsize + $pubcount $pubtime $pubsize); +use vars qw($b_blue $ob); +use vars qw(@joinchan @ircServers); # static scalar variables. $mask{ip} = '(\d+)\.(\d+)\.(\d+)\.(\d+)'; @@ -19,6 +25,8 @@ my $isnick2 = '0-9\-'; $mask{nick} = "[$isnick1]{1}[$isnick1$isnick2]*"; $mask{nuh} = '\S*!\S*\@\S*'; +$nickserv = 0; + sub ircloop { my $error = 0; my $lastrun = 0; @@ -102,7 +110,7 @@ sub irc { $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; } @@ -143,6 +151,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); @@ -158,6 +167,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. @@ -276,16 +286,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); @@ -427,23 +434,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!"); - &clearIRCVars(); - $conn->connect(); - } + + return if ($conn->join($chan, $key)); + + &DEBUG("joinchan: join failed. trying connect!"); + &clearIRCVars(); + $conn->connect(); } } @@ -465,7 +472,7 @@ sub part { # next; } - rawout("PART $chan"); + $conn->part($chan); # deletion of $channels{chan} is done in &entryEvt(). } } @@ -481,6 +488,7 @@ sub mode { &DEBUG("mode: MODE $chan $modes"); + # should move to use Net::IRC's $conn->mode()... but too lazy. rawout("MODE $chan $modes"); } @@ -511,21 +519,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); } } @@ -541,7 +545,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; } @@ -603,7 +607,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}$/) { @@ -611,6 +616,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; @@ -625,9 +632,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... @@ -636,7 +644,7 @@ sub invite { # Usage: &joinNextChan(); sub joinNextChan { if (scalar @joinchan) { - $chan = shift @joinchan; + my $chan = shift @joinchan; &joinchan($chan); if (my $i = scalar @joinchan) { @@ -654,7 +662,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. @@ -707,6 +715,7 @@ sub IsNickInChan { sub IsNickInAnyChan { my ($nick) = @_; + my $chan; foreach $chan (keys %channels) { next unless (grep /^\Q$nick\E$/i, keys %{ $channels{$chan}{''} }); @@ -717,15 +726,21 @@ 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}) { - if ($chan eq "_default") { + # 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; } @@ -806,10 +821,12 @@ sub getJoinChans { sub closeDCC { # &DEBUG("closeDCC called."); + my $type; foreach $type (keys %dcc) { next if ($type ne uc($type)); + my $nick; foreach $nick (keys %{ $dcc{$type} }) { next unless (defined $nick); &status("DCC CHAT: closing DCC $type to $nick."); @@ -884,7 +901,7 @@ sub getHostMask { return &makeHostMask($nuh{$n}); } else { $cache{on_who_Hack} = 1; - &rawout("WHO $n"); + $conn->who($n); } }