if (&IsParam("useStrict")) { use strict; }
sub help {
- my $topic = $_[0];
+ my $topic = shift;
my $file = $bot_misc_dir."/blootbot.help";
my %help = ();
+ # crude hack for pSReply() to work as expected.
+ $msgType = "private" if ($msgType eq "public");
+
if (!open(FILE, $file)) {
&ERROR("FAILED loadHelp ($file): $!");
return;
}
close FILE;
- if (!defined $topic) {
+ if (!defined $topic or $topic eq "") {
&msg($who, $help{'main'});
my $i = 0;
if (exists $help{$topic}) {
foreach (split /\n/, $help{$topic}) {
- &msg($who,$_);
+ &performStrictReply($_);
}
} else {
- &msg($who, "no help on $topic. Use 'help' without arguments.");
+ &pSReply("no help on $topic. Use 'help' without arguments.");
}
return '';
}
}
-sub gettimeofday {
- if ($no_syscall) { # fallback.
+sub timeget {
+ if ($no_timehires) { # fallback.
return time();
} else { # the real thing.
- my $time = pack("LL", 0);
+ return [gettimeofday()];
+ }
+}
- syscall(&SYS_gettimeofday, $time, 0);
- my @time = unpack("LL",$time);
+sub timedelta {
+ my($start_time) = shift;
- return sprintf("%d.%d", @time);
+ if ($no_timehires) { # fallback.
+ return time() - $start_time;
+ } else { # the real thing.
+ return tv_interval ($start_time);
}
}
my $time = shift;
my $retval;
- return("0s") if ($time !~ /\d+/ or $time <= 0);
+ return("NULL s") if (!defined $time or $time !~ /\d+/);
+
+ my $prefix = "";
+ if ($time < 0) {
+ $time = - $time;
+ $prefix = "- ";
+ }
my $s = int($time) % 60;
my $m = int($time / 60) % 60;
$retval .= sprintf(" \002%d\002m", $m) if ($m != 0);
$retval .= sprintf(" \002%d\002s", $s) if ($s != 0);
- return substr($retval, 1);
+ return $prefix.substr($retval, 1);
}
###
# sort the hash list appropriately.
foreach (sort keys %files) {
my $file = $_;
- my @keys = sort keys %{$files{$file}};
+ my @keys = sort keys %{ $files{$file} };
my $i = scalar(@keys);
if ($i > 1) {
s/\s+/ /g; # remove excessive whitespaces.
next unless (defined $level);
- s/[\cA-\c_]//ig # remove control characters.
+ if (s/[\cA-\c_]//ig) { # remove control characters.
+ &DEBUG("stripped control chars");
+ }
}
return $str;
sub fixPlural {
my ($str,$int) = @_;
+ if (!defined $str) {
+ &WARN("fixPlural: str == NULL.");
+ return;
+ }
+
+ if (!defined $int or $int =~ /^\D+$/) {
+ &WARN("fixPlural: int != defined or int");
+ return $str;
+ }
+
if ($str eq "has") {
$str = "have" if ($int > 1);
} elsif ($str eq "is") {
sub getRandomInt {
my $str = $_[0];
+ if (!defined $str) {
+ &WARN("gRI: str == NULL.");
+ return;
+ }
+
srand();
- if ($str =~ /^(\d+)$/) {
+ if ($str =~ /^(\d+(\.\d+)?)$/) {
my $i = $1;
my $fuzzy = int(rand 5);
if ($i < 10) {
# auth if 1) user and host match 2) user and nick match.
# this may change in the future.
- if ($this{'user'} =~ /^\Q$local{'user'}$/i) {
+ if ($this{'user'} =~ /^\Q$local{'user'}\E$/i) {
return 2 if ($this{'host'} eq $local{'host'});
return 1 if ($this{'nick'} eq $local{'nick'});
}
sub isStale {
my ($file, $age) = @_;
- &DEBUG("isStale: $file does not exist") unless ( -f $file);
+ if (!defined $age) {
+ &WARN("isStale: age == NULL.");
+ return 1;
+ }
+
+ if (!defined $file) {
+ &WARN("isStale: file == NULL.");
+ return 1;
+ }
+
return 1 unless ( -f $file);
- return 1 if (time() - (stat($file))[9] > $age*60*60*24);
- my $delta = time() - (stat($file))[9];
- my $hage = $age*60*60*24;
- &DEBUG("isStale: not stale! $delta < $hage");
+ if ($file =~ /idx/) {
+ my $age2 = time() - (stat($file))[9];
+ &DEBUG("stale: $age2. (". &Time2String($age2) .")");
+ }
+ $age *= 60*60*24 if ($age >= 0 and $age < 30);
+
+ return 1 if (time() - (stat($file))[9] > $age);
return 0;
}
/\=\~/ and last; # substituition.
/^\S+ to \S+ \S+/ and last; # babelfish.
+ /^\=/ and last; # botnick = heh is.
+ /wants you to know/ and last;
+
# symbols.
/(\"\*)/ and last;
/, / and last;
/\\\%/ and last;
/\\\_/ and last;
- # weird/special stuff. also old (stock) blootbot bugs.
+ # weird/special stuff. also old blootbot or stock infobot bugs.
$rhs =~ /( \Q$ident\E's|\Q$ident\E's )/i and last; # ownership.
# duplication.
sub hasParam {
my ($param) = @_;
- if (&IsParam($param)) {
+ if (&IsChanConf($param) or &IsParam($param)) {
return 1;
} else {
+ ### TODO: specific reason why it failed.
&msg($who, "unfortunately, \002$param\002 is disabled in my configuration") unless ($addrchar);
return 0;
}
&VERB("double fork detected; not forking.",2) if ($$ != $bot_pid);
if (&IsParam("forking") and $$ == $bot_pid) {
- return $noreply unless (&addForked($label));
+ return unless &addForked($label);
+
$SIG{CHLD} = 'IGNORE';
- $pid = eval { fork() }; # catch non-forking OSes and other errors
- return $noreply if $pid; # parent does nothing
- &status("fork starting for '$label', PID == $$.");
+ $pid = eval { fork() };
+ return if $pid; # parent does nothing
+
+ select(undef, undef, undef, 0.2);
+# &status("fork starting for '$label', PID == $$.");
+ &status("--- fork starting for '$label', PID == $$ ---");
+ &shmWrite($shm,"SET FORKPID $label $$");
+
+ sleep 1;
}
- if (!&loadMyModule($myModules{$label})) {
+ ### TODO: use AUTOLOAD
+ ### very lame hack.
+ if ($label !~ /-/ and !&loadMyModule($myModules{$label})) {
&DEBUG("Forker: failed?");
- return;
+ &delForked($label);
}
if (defined $code) {
&WARN("Forker: code not defined!");
}
- if (defined $pid) { # child.
- &delForked($label);
- &status("fork finished for '$label'.");
- exit 0;
- }
-}
-
-sub checkPing {
- &DEBUG("checkPing() called.");
- $conn->schedule(60, \&checkPing, "this is a test");
- $conn->sl("PING $server :".time());
+ &delForked($label);
}
sub closePID {
return 0 if ( -f $file{PID});
}
+sub mkcrypt {
+ my($str) = @_;
+ my $salt = join '',('.','/',0..9,'A'..'Z','a'..'z')[rand 64, rand 64];
+
+ return crypt($str, $salt);
+}
+
1;