-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.
- if ($msgType =~ /public/i) { # public.
- $floodwho = lc $chan;
- } elsif ($msgType =~ /private/i) { # private.
- $floodwho = lc $who;
- } else { # dcc?
- &DEBUG("FIXME: floodwho = ???");
- }
-
- my ($count, $interval) = split(/:/, $param{'floodRepeat'} || "2:10");
-
- # flood repeat protection.
- if ($addressed) {
- my $time = $flood{$floodwho}{$message};
-
- if (defined $time and (time - $time < $interval)) {
- ### public != personal who so the below is kind of pointless.
- my @who;
- foreach (keys %flood) {
- next if (/^\Q$floodwho\E$/ or /^\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");
- } else {
- &status("$b_cyan$who$ob is addressing me");
- }
-
- $flood{$floodwho}{$message} = time();
- }
-
- ($count, $interval) = split(/:/, $param{'floodMessages'} || "5:30");
- # 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;
- $ignoreList{"*!$uh"} = time() + ($expire * 60);
- return;
- }
-
- $flood{$floodwho}{$message} = time();
- }
-
- # public.
- if ($msgType =~ /public/i) {
- $talkchannel = $chan;
- &status("<$orig{who}/$chan> $orig{message}");
- }
-
- # private.
- if ($msgType =~ /private/i) {
- &status("[$orig{who}] $orig{message}");
- }
-
- if ((!$skipmessage or &IsParam("seenStoreAll")) and
- &IsParam("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);
-
- local $ignore = 0;
- foreach (keys %ignoreList) {
- my $ignoreRE = $_;
- my @parts = split /\*/, "a${ignoreRE}a";
- my $recast = join '\S*', map quotemeta($_), @parts;
- $recast =~ s/^a(.*)a$/$1/;
- if ($nuh =~ /^$recast$/) {
- $ignore++;
- last;
- }
- }
-
- if (defined $nuh) {
- $userHandle = &verifyUser($who, $nuh);
- } else {
- &DEBUG("hookMsg: 'nuh' not defined?");
- }