X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=src%2FMisc.pl;h=be5e034a0343c3c6e715591e36101bfd52f71efb;hb=bba2f29485314c78c2eb5e547a31f5b0a6dfc61e;hp=e0a67fec7d322df54d8cc810dcde7c62a2208706;hpb=f0a00b56d1497c3b3f0d33e0d57e5d31a0161a55;p=infobot.git diff --git a/src/Misc.pl b/src/Misc.pl index e0a67fe..be5e034 100644 --- a/src/Misc.pl +++ b/src/Misc.pl @@ -8,10 +8,13 @@ if (&IsParam("useStrict")) { use strict; } sub help { - my $topic = $_[0]; - my $file = $bot_misc_dir."/blootbotbot.help"; + 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; @@ -37,7 +40,7 @@ sub help { } close FILE; - if (!defined $topic) { + if (!defined $topic or $topic eq "") { &msg($who, $help{'main'}); my $i = 0; @@ -63,25 +66,41 @@ sub help { 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 getPath { + my ($pathnfile) = @_; + + ### TODO: gotta hate an if statement. + if ($pathnfile =~ /(.*)\/(.*?)$/) { + return $1; + } else { + return "."; + } +} + +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); } } @@ -148,7 +167,13 @@ sub Time2String { 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; @@ -160,7 +185,7 @@ sub Time2String { $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); } ### @@ -212,7 +237,9 @@ sub fixString { 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; @@ -222,6 +249,16 @@ sub fixString { 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") { @@ -319,9 +356,14 @@ sub getRandom { 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) { @@ -383,7 +425,7 @@ sub IsHostMatch { # 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'}); } @@ -395,11 +437,24 @@ sub IsHostMatch { sub isStale { my ($file, $age) = @_; + 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))[8] > $age*60*60*24); - my $delta = time() - (stat($file))[8]; - my $hage = $age*60*60*24; - &DEBUG("isStale: not stale! $delta < $hage ($age) ?"); + 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; } @@ -502,6 +557,9 @@ sub validFactoid { /\=\~/ 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; @@ -537,7 +595,7 @@ sub validFactoid { /\\\%/ 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. @@ -571,9 +629,10 @@ sub hasProfanity { 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; } @@ -584,19 +643,28 @@ sub Forker { my $pid; &shmFlush(); - &status("double fork detected; not forking.") if ($$ != $bot_pid); + &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) { @@ -605,17 +673,7 @@ sub Forker { &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 { @@ -624,4 +682,12 @@ sub closePID { return 1 if (unlink $file{PID}); 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;