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 .");
# 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";
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 ||= "???";
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';
# 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.");
$ircstats{'DisconnectTime'} = time();
$ircstats{'DisconnectReason'} = $what;
$ircstats{'DisconnectCount'}++;
+ $ircstats{'TotalTime'} += time() - $ircstats{'ConnectTime'};
# clear any variables on reconnection.
$nickserv = 0;
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 "");
&status(">>> join/$b_blue$chan$ob $b_cyan$who$ob $b_yellow($ob$user\@$host$b_yellow)$ob$netsplitstr");
$channels{$chan}{''}{$who}++;
- $nuh{lc $who} = $who."!".$user."\@".$host unless (exists $nuh{lc $who});
+ $nuh = $who."!".$user."\@".$host;
+ $nuh{lc $who} = $nuh unless (exists $nuh{lc $who});
+
+ ### on-join 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;
+ 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) => $_");
+ }
- ### on-join ban. (TODO: kick)
- if (exists $bans{$chan}) {
- ### TODO: need to do $chan and _default
- foreach (keys %{ $bans{$chan} }) {
- s/\*/\\S*/g;
- next unless /^\Q$nuh\E$/i;
+ my $reason = "no reason";
+ foreach ($chan, "*") {
+ next unless (exists $bans{$_});
+ next unless (exists $bans{$_}{$ban});
- foreach (keys %{ $channels{$chan}{'b'} }) {
- &DEBUG(" bans_on_chan($chan) => $_");
- }
+ my @array = @{ $bans{$_}{$ban} };
- ### TODO: check $channels{$chan}{'b'} if ban already exists.
- &ban( "*!*@".&makeHostMask($host), $chan);
+ $reason = $array[4] if ($array[4]);
last;
}
+
+ &ban($ban, $chan);
+ &kick($who, $chan, $reason);
+
+ last;
}
### ROOTWARN:
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.");
my $nick = $event->nick();
my($me,$chan,$why) = $event->args();
+ ### TODO: incomplete.
### .* wait (\d+) second/) {
- &status("X1 $msg");
+ &status("on_ttf: X1 $msg") if (defined $msg);
my $sleep = 5;
&status("going to sleep for $sleep...");
sleep $sleep;
# 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.");
}
$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);
$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;
} else {
&DEBUG("unknown msgType => $msgType.");
}
+ push(@ignore, keys %{ $ignore{"*"} }) if (exists $ignore{"*"});
if ((!$skipmessage or &IsChanConf("seenStoreAll")) and
&IsChanConf("seen") and
return if ($skipmessage);
return unless (&IsParam("minVolunteerLength") or $addressed);
- local $ignore = 0;
- if (exists $ignore{lc $chan}) {
- foreach (keys %{ $ignore{lc $chan} }) {
- s/\*/\\S*/g;
+ foreach (@ignore) {
+ s/\*/\\S*/g;
- next unless ($nuh =~ /^\Q$_\E$/i);
- $ignore++;
- last;
- }
+ next unless (eval { $nuh =~ /^$_$/i });
+
+ &status("IGNORE <$who> $message");
+ return;
}
if (defined $nuh) {