]> git.donarmstrong.com Git - infobot.git/blobdiff - src/IRC/IrcHooks.pl
news: can make news compulsory (chanset +newsNotifyAll)
[infobot.git] / src / IRC / IrcHooks.pl
index db75aa5233b74d1a836146c4fb9fe4fce05cab43..d217fc5cfcd85549c841b17996e573e01057b9a2 100644 (file)
@@ -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 <pass> to get master access through DCC CHAT.");
+    }
+    # end of first time run.
 
     if (&IsChanConf("wingate")) {
        my $file = "$bot_base_dir/$param{'ircUser'}.wingate";
@@ -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;
@@ -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);
@@ -440,16 +460,13 @@ sub on_join {
        my $reason = "no reason";
        foreach ($chan, "*") {
            next unless (exists $bans{$_});
-           next unless (exists $bans{$_}{$mask});
+           next unless (exists $bans{$_}{$ban});
 
-           my @array   = @{ $bans{$_}{$mask} };
-           foreach (@array) {
-               &DEBUG("on_join: ban: array => '$_'");
-           }
-           $reason     ||= $array[4];
+           my @array   = @{ $bans{$_}{$ban} };
+
+           $reason     = $array[4] if ($array[4]);
            last;
        }
-       &DEBUG("on_join: ban: reason => '$reason'.");
 
        &ban($ban, $chan);
        &kick($who, $chan, $reason);
@@ -463,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);
 
@@ -538,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);
 }
@@ -707,7 +739,6 @@ sub on_public {
        }
     }
 
-
     $msgtime = time();
     $lastWho{$chan} = $nick;
     ### TODO: use $nick or lc $nick?
@@ -910,269 +941,4 @@ sub on_whoisuser {
     $nuh{lc $args[1]} = $args[1]."!".$args[2]."\@".$args[3];
 }
 
-#######################################################################
-####### IRC HOOK HELPERS   IRC HOOK HELPERS   IRC HOOK HELPERS ########
-#######################################################################
-
-#####
-# Usage: &hookMode($chan, $modes, @targets);
-sub hookMode {
-    my ($chan, $modes, @targets) = @_;
-    my $parity = 0;
-
-    $chan = lc $chan;          # !!!.
-
-    my $mode;
-    foreach $mode (split(//, $modes)) {
-       # sign.
-       if ($mode =~ /[-+]/) {
-           $parity = 1         if ($mode eq "+");
-           $parity = 0         if ($mode eq "-");
-           next;
-       }
-
-       # mode with target.
-       if ($mode =~ /[bklov]/) {
-           my $target = shift @targets;
-
-           if ($parity) {
-               $chanstats{$chan}{'Op'}++    if ($mode eq "o");
-               $chanstats{$chan}{'Ban'}++   if ($mode eq "b");
-           } else {
-               $chanstats{$chan}{'Deop'}++  if ($mode eq "o");
-               $chanstats{$chan}{'Unban'}++ if ($mode eq "b");
-           }
-
-           # modes w/ target affecting nick => cache it.
-           if ($mode =~ /[bov]/) {
-               $channels{$chan}{$mode}{$target}++      if  $parity;
-               delete $channels{$chan}{$mode}{$target} if !$parity;
-           }
-
-           if ($mode =~ /[l]/) {
-               $channels{$chan}{$mode} = $target       if  $parity;
-               delete $channels{$chan}{$mode}          if !$parity;
-           }
-       }
-
-       # important channel modes, targetless.
-       if ($mode =~ /[mt]/) {
-           $channels{$chan}{$mode}++                   if  $parity;
-           delete $channels{$chan}{$mode}              if !$parity;
-       }
-    }
-}
-
-sub hookMsg {
-    ($msgType, $chan, $who, $message) = @_;
-    my $skipmessage    = 0;
-    $addressed         = 0;
-    $addressedother    = 0;
-    $orig{message}     = $message;
-    $orig{who}         = $who;
-    $addrchar          = 0;
-
-    $message   =~ s/[\cA-\c_]//ig;     # strip control characters
-    $message   =~ s/^\s+//;            # initial whitespaces.
-    $who       =~ tr/A-Z/a-z/;         # lowercase.
-
-    &showProc();
-
-    # addressing.
-    if ($msgType =~ /private/) {
-       # private messages.
-       $addressed = 1;
-    } else {
-       # public messages.
-       # addressing revamped by the xk.
-       ### below needs to be fixed...
-       if (&IsParam("addressCharacter")) {
-           if ($message =~ s/^$param{'addressCharacter'}//) {
-               $addrchar  = 1;
-               $addressed = 1;
-           }
-       }
-
-       if ($message =~ /^($mask{nick})([\;\:\>\, ]+) */) {
-           my $newmessage = $';
-           if ($1 =~ /^\Q$ident\E$/i) {
-               $message   = $newmessage;
-               $addressed = 1;
-           } else {
-               # ignore messages addressed to other people or unaddressed.
-               $skipmessage++ if ($2 ne "" and $2 !~ /^ /);
-           }
-       }
-    }
-
-    # Determine floodwho.
-    my $c      = "_default";
-    if ($msgType =~ /public/i) {               # public.
-       $floodwho = $c = lc $chan;
-    } elsif ($msgType =~ /private/i) { # private.
-       $floodwho = lc $who;
-    } else {                           # dcc?
-       &DEBUG("FIXME: floodwho = ???");
-    }
-
-    my $val = &getChanConfDefault("floodRepeat", "2:10", $c);
-    my ($count, $interval) = split /:/, $val;
-
-    # flood repeat protection.
-    if ($addressed) {
-       my $time = $flood{$floodwho}{$message} || 0;
-
-       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{$_} });
-           }
-
-           if (scalar @who) {
-               &msg($who, "you already said what ".
-                               join(' ', @who)." have said.");
-           } else {
-               &msg($who,"Someone already said that ". (time - $time) ." seconds ago" );
-           }
-
-           ### TODO: delete old floodwarn{} keys.
-           my $floodwarn = 0;
-           if (!exists $floodwarn{$floodwho}) {
-               $floodwarn++;
-           } else {
-               $floodwarn++ if (time() - $floodwarn{$floodwho} > $interval);
-           }
-
-           if ($floodwarn) {
-               &status("FLOOD repetition detected from $floodwho.");
-               $floodwarn{$floodwho} = time();
-           }
-
-           return;
-       }
-
-       if ($addrchar) {
-           &status("$b_cyan$who$ob is short-addressing me");
-       } elsif ($msgType eq "private") {       # private.
-           &status("$b_cyan$who$ob is /msg'ing me");
-       } else {                                # public?
-           &status("$b_cyan$who$ob is addressing me");
-       }
-
-       $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);
-    ($count, $interval) = split /:/, $val;
-
-    # flood overflow protection.
-    if ($addressed) {
-       foreach (keys %{$flood{$floodwho}}) {
-           next unless (time() - $flood{$floodwho}{$_} > $interval);
-           delete $flood{$floodwho}{$_};
-       }
-
-       my $i = scalar keys %{$flood{$floodwho}};
-       if ($i > $count) {
-           &msg($who,"overflow of messages ($i > $count)");
-           &status("FLOOD overflow detected from $floodwho; ignoring");
-
-           my $expire = $param{'ignoreAutoExpire'} || 5;
-           &ignoreAdd("*!$uh", $chan, $expire, "flood overflow auto-detected.");
-           return;
-       }
-
-       $flood{$floodwho}{$message} = time();
-    }
-
-    my @ignore;
-    if ($msgType =~ /public/i) {                   # public.
-       $talkchannel    = $chan;
-       &status("<$orig{who}/$chan> $orig{message}");
-       push(@ignore, keys %{ $ignore{$chan} }) if (exists $ignore{$chan});
-    } elsif ($msgType =~ /private/i) {            # private.
-       &status("[$orig{who}] $orig{message}");
-       $talkchannel    = undef;
-       $chan           = "_default";
-    } else {
-       &DEBUG("unknown msgType => $msgType.");
-    }
-    push(@ignore, keys %{ $ignore{"*"} }) if (exists $ignore{"*"});
-
-    if ((!$skipmessage or &IsChanConf("seenStoreAll")) and
-       &IsChanConf("seen") and
-       $msgType =~ /public/
-    ) {
-       $seencache{$who}{'time'} = time();
-       $seencache{$who}{'nick'} = $orig{who};
-       $seencache{$who}{'host'} = $uh;
-       $seencache{$who}{'chan'} = $talkchannel;
-       $seencache{$who}{'msg'}  = $orig{message};
-       $seencache{$who}{'msgcount'}++;
-    }
-
-    return if ($skipmessage);
-    return unless (&IsParam("minVolunteerLength") or $addressed);
-
-    foreach (@ignore) {
-       s/\*/\\S*/g;
-
-       next unless (eval { $nuh =~ /^$_$/i });
-
-       &status("IGNORE <$who> $message");
-       return;
-    }
-
-    if (defined $nuh) {
-       if (!defined $userHandle) {
-           &DEBUG("line 1074: need verifyUser?");
-           &verifyUser($who, $nuh);
-       }
-    } else {
-       &DEBUG("hookMsg: 'nuh' not defined?");
-    }
-
-### For extra debugging purposes...
-    if ($_ = &process()) {
-#      &DEBUG("IrcHooks: process returned '$_'.");
-    }
-
-    return;
-}
-
-sub chanLimitVerify {
-    my($chan)  = @_;
-    my $l      = $channels{$chan}{'l'};
-
-    # only change it if it's not set.
-    if (defined $l and &IsChanConf("chanlimitcheck")) {
-       my $plus = &getChanConfDefault("chanlimitcheckPlus", 5, $chan);
-       my $nowl = scalar(keys %{ $channels{$chan}{''} });
-       my $delta       = $nowl - $l;
-       $delta          =~ s/^\-//;
-
-       if ($plus <= 3) {
-           &WARN("clc: stupid to have plus at $plus, fix it!");
-       }
-
-       ### 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");
-           &rawout("MODE $chan +l ".($nowl+$plus) );
-       }
-    }
-}
-
 1;