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 .");
### 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')");
# 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 "");
if (scalar @joinchan) { # remaining channels to join.
&joinNextChan();
+ } else {
+ &DEBUG("running ircCheck to get chanserv ops.");
+ &ircCheck();
}
return unless (&IsChanConf("chanServ_ops") > 0);
$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;
}
$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);
($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);
}
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.");
}
}
-
$msgtime = time();
$lastWho{$chan} = $nick;
### TODO: use $nick or lc $nick?
# 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);
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;
} 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
### 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) );
}
}