#####
# Usage: &hookMode($nick, $modes, @targets);
sub hookMode {
- my ($nick, $modes, @targets) = @_;
- my $parity = 0;
-
- if ($chan =~ tr/A-Z/a-z/) {
- &VERB("hookMode: cased $chan.",2);
- }
+ my ( $nick, $modes, @targets ) = @_;
+ my $parity = 0;
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;
-
- # lets do some custom stuff.
- if ($mode eq "o" and $parity) {
- if ($nick eq "ChanServ" and $target =~ /^\Q$ident\E$/i) {
- &VERB("hookmode: chanserv deopped us! asking",2);
- &chanServCheck($chan);
- }
-
- &chanLimitVerify($chan);
- }
- }
-
- 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;
- }
+ foreach $mode ( split( //, $modes ) ) {
+
+ # sign. tmp parity needed to store current state
+ 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{ lc $chan }{'Op'}++ if ( $mode eq 'o' );
+ $chanstats{ lc $chan }{'Ban'}++ if ( $mode eq 'b' );
+ } else {
+ $chanstats{ lc $chan }{'Deop'}++ if ( $mode eq 'o' );
+ $chanstats{ lc $chan }{'Unban'}++ if ( $mode eq 'b' );
+ }
+
+ # modes w/ target affecting nick => cache it.
+ if ( $mode =~ /[bov]/ ) {
+ $channels{ lc $chan }{$mode}{$target}++ if $parity;
+ delete $channels{ lc $chan }{$mode}{$target} if !$parity;
+
+ # lets do some custom stuff.
+ if ( $mode =~ /o/ and not $parity ) {
+ if ( $target =~ /^\Q$ident\E$/i ) {
+ &VERB( "hookmode: someone deopped us!", 2 );
+ &chanServCheck($chan);
+ }
+
+ &chanLimitVerify($chan);
+ }
+ }
+
+ if ( $mode =~ /[l]/ ) {
+ $channels{ lc $chan }{$mode} = $target if $parity;
+ delete $channels{ lc $chan }{$mode} if !$parity;
+ }
+ }
+
+ # important channel modes, targetless.
+ if ( $mode =~ /[mt]/ ) {
+ $channels{ lc $chan }{$mode}++ if $parity;
+ delete $channels{ lc $chan }{$mode} if !$parity;
+ }
}
}
$message =~ s/[\cA-\c_]//ig; # strip control characters
$message =~ s/^\s+//; # initial whitespaces.
$who =~ tr/A-Z/a-z/; # lowercase.
+ my $mynick = $conn->nick();
&showProc();
if ($msgType =~ /private/) {
# private messages.
$addressed = 1;
+ if (&IsChanConf('addressCharacter') > 0) {
+ $addressCharacter = getChanConf('addressCharacter');
+ if ($message =~ s/^\Q$addressCharacter\E//) {
+ &msg($who, "The addressCharacter \"$addressCharacter\" is to get my attention in a normal channel. Please leave it off when messaging me directly.");
+ }
+ }
} else {
# public messages.
# addressing revamped by the xk.
### below needs to be fixed...
- if (&IsParam("addressCharacter")) {
- if ($message =~ s/^\Q$param{'addressCharacter'}\E//) {
+ if (&IsChanConf('addressCharacter') > 0) {
+ $addressCharacter = getChanConf('addressCharacter');
+ if ($message =~ s/^\Q$addressCharacter\E//) {
$addrchar = 1;
$addressed = 1;
}
if ($message =~ /^($mask{nick})([\;\:\>\, ]+) */) {
my $newmessage = $';
- if ($1 =~ /^\Q$ident\E$/i) {
+ if ($1 =~ /^\Q$mynick\E$/i) {
$message = $newmessage;
$addressed = 1;
} else {
# ignore messages addressed to other people or unaddressed.
- $skipmessage++ if ($2 ne "" and $2 !~ /^ /);
+ $skipmessage++ if ($2 ne '' and $2 !~ /^ /);
}
}
}
# Determine floodwho.
- my $c = "_default";
+ my $c = '_default';
if ($msgType =~ /public/i) {
# public.
$floodwho = $c = lc $chan;
&FIXME("floodwho = ???");
}
- my $val = &getChanConfDefault("floodRepeat", "2:5", $c);
+ my $val = &getChanConfDefault('floodRepeat', "2:5", $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)) {
+ if (!&IsFlag('o') and $msgType eq 'public' and (time() - $time < $interval)) {
### public != personal who so the below is kind of pointless.
my @who;
foreach (keys %flood) {
return if ($lobotomized);
if (!scalar @who) {
- push(@who,"Someone");
+ push(@who,'Someone');
}
&msg($who,join(' ', @who)." already said that ". (time - $time) ." seconds ago" );
}
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");
+ &status("$b_cyan$who$ob is short-addressing $mynick");
+ } elsif ($msgType eq 'private') { # private.
+ &status("$b_cyan$who$ob is /msg'ing $mynick");
} else { # public?
- &status("$b_cyan$who$ob is addressing me");
+ &status("$b_cyan$who$ob is addressing $mynick");
}
$flood{$floodwho}{$message} = time();
- } elsif ($msgType eq "public" and &IsChanConf("kickOnRepeat")) {
+ } elsif ($msgType eq 'public' and &IsChanConf('kickOnRepeat') > 0) {
# unaddressed, public only.
### TODO: use a separate "short-time" hash.
@data = keys %{ $flood{$floodwho} } if (exists $flood{$floodwho});
}
- $val = &getChanConfDefault("floodMessages", "5:30", $c);
+ $val = &getChanConfDefault('floodMessages', "5:30", $c);
($count, $interval) = split /:/, $val;
# flood overflow protection.
} elsif ($msgType =~ /private/i) { # private.
&status("[$orig{who}] $orig{message}");
$talkchannel = undef;
- $chan = "_default";
+ $chan = '_default';
} else {
&DEBUG("unknown msgType => $msgType.");
}
- push(@ignore, keys %{ $ignore{"*"} }) if (exists $ignore{"*"});
-
- if ((!$skipmessage or &IsChanConf("seenStoreAll") > 0) and
- &IsChanConf("seen") > 0 and
- $msgType =~ /public/
- ) {
+ push(@ignore, keys %{ $ignore{'*'} }) if (exists $ignore{'*'});
+
+ if ((!$skipmessage or &IsChanConf('seenStoreAll') > 0) and
+ &IsChanConf('sed') > 0 and &IsChanConf('seen') > 0 and
+ $msgType =~ /public/ and
+ $orig{message} =~ /^s\/([^;\/]*)\/([^;\/]*)\/([g]*)$/) {
+ my $sedmsg = $seencache{$who}{'msg'};
+ eval "\$sedmsg =~ s/\Q$1\E/\Q$2\E/$3;";
+ $sedmsg =~ s/^(.{255}).*$/$1.../; # 255 char max to prevent flood
+
+ if ($sedmsg ne $seencache{$who}{'msg'}) {
+ &DEBUG("sed \"" . $orig{message} . "\" \"" .
+ $seencache{$who}{'msg'} . "\" \"" . $sedmsg. "\"");
+ &msg($talkchannel, "$orig{who} meant: $sedmsg");
+ }
+ } elsif ((!$skipmessage or &IsChanConf('seenStoreAll') > 0) and
+ &IsChanConf('seen') > 0 and $msgType =~ /public/) {
$seencache{$who}{'time'} = time();
$seencache{$who}{'nick'} = $orig{who};
$seencache{$who}{'host'} = $uh;
$seencache{$who}{'msg'} = $orig{message};
$seencache{$who}{'msgcount'}++;
}
-
+ if (&IsChanConf('minVolunteerLength') > 0) {
+ # FIXME hack to treat unaddressed as if using addrchar
+ $addrchar = 1;
+ }
return if ($skipmessage);
- return unless (&IsParam("minVolunteerLength") or $addressed);
+ return unless ($addrchar or $addressed);
foreach (@ignore) {
s/\*/\\S*/g;
$chan = $c;
my $l = $channels{$chan}{'l'};
- return unless (&IsChanConf("chanlimitcheck"));
+ return unless (&IsChanConf('chanlimitcheck') > 0);
if (scalar keys %netsplit) {
&WARN("clV: netsplit active (1, chan = $chan); skipping.");
}
# only change it if it's not set.
- my $plus = &getChanConfDefault("chanlimitcheckPlus", 5, $chan);
+ my $plus = &getChanConfDefault('chanlimitcheckPlus', 5, $chan);
my $count = scalar(keys %{ $channels{$chan}{''} });
- my $int = &getChanConfDefault("chanlimitcheckInterval", 10, $chan);
+ my $int = &getChanConfDefault('chanlimitcheckInterval', 10, $chan);
my $delta = $count + $plus - $l;
# $delta =~ s/^\-//;
return 0;
}
- if ($chan =~ tr/A-Z/a-z/) {
- &DEBUG("chanServCheck: lowercased chan ($chan)");
- }
-
- if (! &IsChanConf("chanServ_ops") ) {
- return 0;
- }
+ return unless (&IsChanConf('chanServCheck') > 0);
&VERB("chanServCheck($chan) called.",2);
- if ( &IsParam("nickServ_pass") and !$nickserv) {
- $conn->who("NickServ");
+ if ( &IsParam('nickServ_pass') and !$nickserv) {
+ $conn->who('NickServ');
return 0;
}
# check for first hash then for next hash.
# TODO: a function for &ischanop()? &isvoice()?
- if (exists $channels{$chan} and exists $channels{$chan}{'o'}{$ident}) {
+ if (exists $channels{lc $chan} and exists $channels{lc $chan}{'o'}{$ident}) {
return 0;
}
&status("ChanServ ==> Requesting ops for $chan. (chanServCheck)");
- &rawout("PRIVMSG ChanServ :OP $chan $ident");
+ &msg('ChanServ', "OP $chan");
return 1;
}
1;
+
+# vim:ts=4:sw=4:expandtab:tw=80