X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2FIRC%2FIrcHooks.pl;h=461d9de730b69a5ba45c33c878bc8d6fc60d4b4e;hb=79ddec2f34e07300f6fdb0803b56746b8399c0f4;hp=ce436dff6369aa8af92ee24a714db86060e88b3a;hpb=b8c8a5a2c78931465f9987a5e8173a6b4f88afe2;p=infobot.git diff --git a/src/IRC/IrcHooks.pl b/src/IRC/IrcHooks.pl index ce436df..461d9de 100644 --- a/src/IRC/IrcHooks.pl +++ b/src/IRC/IrcHooks.pl @@ -39,7 +39,7 @@ sub on_chat { my ($self, $event) = @_; my $msg = ($event->args)[0]; my $sock = ($event->to)[0]; - my $nick = $event->nick(); + my $nick = lc $event->nick(); if (!exists $nuh{$nick}) { &DEBUG("chat: nuh{$nick} doesn't exist; trying WHOIS ."); @@ -65,10 +65,12 @@ sub on_chat { ### TODO: prevent users without CRYPT chatting. if (!defined $crypto) { - &DEBUG("chat: no pass required."); -### $success++; + &DEBUG("todo: dcc close chat"); + &msg($who, "nope, no guest logins allowed..."); + return; + } - } elsif (&ckpasswd($msg, $crypto)) { + if (&ckpasswd($msg, $crypto)) { # stolen from eggdrop. $self->privmsg($sock, "Connected to $ident"); $self->privmsg($sock, "Commands start with '.' (like '.quit' or '.help')"); @@ -133,6 +135,20 @@ sub on_endofmotd { # update IRCStats. $ircstats{'ConnectTime'} = time(); $ircstats{'ConnectCount'}++; + $ircstats{'OffTime'} += time() - $ircstats{'DisconnectTime'} + if (defined $ircstats{'DisconnectTime'}); + + # first time run. + if (!exists $users{_default}) { + &status("First time run... adding _default user."); + $users{_default}{FLAGS} = "mrt"; + $users{_default}{HOSTS} = "*!*@*"; + } + + if (scalar keys %users < 2) { + &status("Ok... now /msg $ident PASS to get master access through DCC CHAT."); + } + # end of first time run. if (&IsChanConf("wingate")) { my $file = "$bot_base_dir/$param{'ircUser'}.wingate"; @@ -167,12 +183,12 @@ sub on_endofmotd { sub on_dcc { my ($self, $event) = @_; my $type = uc( ($event->args)[1] ); - my $nick = $event->nick(); + my $nick = lc $event->nick(); # pity Net::IRC doesn't store nuh. Here's a hack :) if (!exists $nuh{lc $nick}) { $self->whois($nick); - $nuh{lc $nick} = "GETTING-NOW"; # trying. + $nuh{$nick} = "GETTING-NOW"; # trying. } $type ||= "???"; @@ -229,7 +245,7 @@ sub on_dcc_close { sub on_dcc_open { my ($self, $event) = @_; my $type = uc( ($event->args)[0] ); - my $nick = $event->nick(); + my $nick = lc $event->nick(); my $sock = ($event->to)[0]; $msgType = 'chat'; @@ -265,7 +281,7 @@ sub on_dcc_open { # really custom sub to get NUH since Net::IRC doesn't appear to support # it. sub on_dcc_open_chat { - my(undef, $nick,$sock) = @_; + my(undef, $nick, $sock) = @_; if ($nuh{$nick} eq "GETTING-NOW") { &DEBUG("getting nuh for $nick failed. FIXME."); @@ -301,6 +317,7 @@ sub on_disconnect { $ircstats{'DisconnectTime'} = time(); $ircstats{'DisconnectReason'} = $what; $ircstats{'DisconnectCount'}++; + $ircstats{'TotalTime'} += time() - $ircstats{'ConnectTime'}; # clear any variables on reconnection. $nickserv = 0; @@ -328,7 +345,7 @@ sub on_endofnames { my $txt; my @array; foreach ("o","v","") { - my $count = scalar(keys %{$channels{$chan}{$_}}); + my $count = scalar(keys %{ $channels{$chan}{$_} }); next unless ($count); $txt = "total" if ($_ eq ""); @@ -342,6 +359,9 @@ sub on_endofnames { if (scalar @joinchan) { # remaining channels to join. &joinNextChan(); + } else { + &DEBUG("running ircCheck to get chanserv ops."); + &ircCheck(); } return unless (&IsChanConf("chanServ_ops") > 0); @@ -422,19 +442,35 @@ sub on_join { $nuh{lc $who} = $nuh unless (exists $nuh{lc $who}); ### on-join bans. - my @bans = keys %{ $bans{$chan} }; - push(@bans, keys %{ $bans{"*"} }); + my @bans; + push(@bans, keys %{ $bans{$chan} }) if (exists $bans{$chan}); + push(@bans, keys %{ $bans{"*"} }) if (exists $bans{"*"}); foreach (@bans) { + my $ban = $_; + s/\?/./g; s/\*/\\S*/g; - next unless /^\Q$nuh\E$/i; + my $mask = $_; + next unless ($nuh =~ /^$mask$/i); ### TODO: check $channels{$chan}{'b'} if ban already exists. foreach (keys %{ $channels{$chan}{'b'} }) { &DEBUG(" bans_on_chan($chan) => $_"); } - ### TODO: kick - &ban( "*!*@".&makeHostMask($host), $chan); + my $reason = "no reason"; + foreach ($chan, "*") { + next unless (exists $bans{$_}); + next unless (exists $bans{$_}{$ban}); + + my @array = @{ $bans{$_}{$ban} }; + + $reason = $array[4] if ($array[4]); + last; + } + + &ban($ban, $chan); + &kick($who, $chan, $reason); + last; } @@ -444,6 +480,12 @@ sub on_join { $user =~ /^r(oo|ew|00)t$/i && $channels{$chan}{'o'}{$ident}); + ### NEWS: + if (&IsChanConf("news") && &IsChanConf("newsKeepRead")) { + # todo: what if it hasn't been loaded? + &News::latest($chan); + } + ### chanlimit check. &chanLimitVerify($chan); @@ -519,6 +561,15 @@ sub on_msg { ($user,$host) = split(/\@/, $event->userhost); $uh = $event->userhost(); $nuh = $nick."!".$uh; + $msgtime = time(); + + if ($nick eq $ident) { # hopefully ourselves. + if ($msg eq "TEST") { + &status("IRCTEST: Yes, we're alive."); + delete $cache{connect}; + return; + } + } &hookMsg('private', undef, $nick, $msg); } @@ -585,7 +636,11 @@ sub on_notice { if ($nick =~ /^NickServ$/i) { # nickserv. &status("NickServ: <== '$args'"); - if ($args =~ /^This nickname is registered/i) { + my $check = 0; + $check++ if ($args =~ /^This nickname is registered/i); + $check++ if ($args =~ /nickname.*owned/i); + + if ($check) { &status("nickserv told us to register; doing it."); if (&IsParam("nickServ_pass")) { &status("NickServ: ==> Identifying."); @@ -684,7 +739,6 @@ sub on_public { } } - $msgtime = time(); $lastWho{$chan} = $nick; ### TODO: use $nick or lc $nick? @@ -997,18 +1051,20 @@ sub hookMsg { # flood repeat protection. if ($addressed) { - my $time = $flood{$floodwho}{$message}; + my $time = $flood{$floodwho}{$message} || 0; - if (defined $time and (time - $time < $interval)) { + if ($msgType eq "public" and (time() - $time < $interval)) { ### public != personal who so the below is kind of pointless. my @who; foreach (keys %flood) { next if (/^\Q$floodwho\E$/); next if (defined $chan and /^\Q$chan\E$/); - push(@who, grep /^\Q$message\E$/i, keys %{$flood{$_}}); + push(@who, grep /^\Q$message\E$/i, keys %{ $flood{$_} }); } + return if ($lobotomized); + if (scalar @who) { &msg($who, "you already said what ". join(' ', @who)." have said."); @@ -1041,6 +1097,12 @@ sub hookMsg { } $flood{$floodwho}{$message} = time(); + } elsif ($msgType eq "public" and &IsChanConf("kickOnRepeat")) { + # unaddressed, public only. + + ### TODO: use a separate "short-time" hash. + my @data; + @data = keys %{ $flood{$floodwho} } if (exists $flood{$floodwho}); } $val = &getChanConfDefault("floodMessages", "5:30", $c); @@ -1070,7 +1132,7 @@ sub hookMsg { if ($msgType =~ /public/i) { # public. $talkchannel = $chan; &status("<$orig{who}/$chan> $orig{message}"); - @ignore = keys %{ $ignore{$chan} }; + push(@ignore, keys %{ $ignore{$chan} }) if (exists $ignore{$chan}); } elsif ($msgType =~ /private/i) { # private. &status("[$orig{who}] $orig{message}"); $talkchannel = undef; @@ -1078,7 +1140,7 @@ sub hookMsg { } else { &DEBUG("unknown msgType => $msgType."); } - push(@ignore, keys %{ $ignore{"*"} }); + push(@ignore, keys %{ $ignore{"*"} }) if (exists $ignore{"*"}); if ((!$skipmessage or &IsChanConf("seenStoreAll")) and &IsChanConf("seen") and @@ -1139,8 +1201,8 @@ sub chanLimitVerify { ### todo: check if we have ops. ### todo: if not, check if nickserv/chanserv is avail. ### todo: unify code with chanlimitcheck() - if ($delta > 3) { - &WARN("clc: nowl($nowl) > l($l) - 3"); + if ($delta > 5) { + &status("clc: big change in limit; changing."); &rawout("MODE $chan +l ".($nowl+$plus) ); } }