]> git.donarmstrong.com Git - infobot.git/blobdiff - src/Misc.pl
take a few more things literally
[infobot.git] / src / Misc.pl
index 358515467576b10dedebb1a9bac7906a406fe79d..47cbd36666692a08f091a4332ecb52bba4b702d1 100644 (file)
@@ -5,15 +5,19 @@
 #      NOTE: Based on code by Kevin Lenzo & Patrick Cole  (c) 1997
 #
 
-#use strict;
+use strict;
+
+use vars qw(%file %mask %param %cmdstats %myModules);
+use vars qw($msgType $who $bot_pid $nuh $shm $force_public_reply
+       $no_timehires $bot_data_dir $addrchar);
 
 sub help {
     my $topic = shift;
     my $file  = $bot_data_dir."/blootbot.help";
     my %help  = ();
 
-    # crude hack for pSReply() to work as expected.
-    $msgType = "private" if ($msgType eq "public");
+    # crude hack for performStrictReply() to work as expected.
+    $msgType = 'private' if ($msgType eq 'public');
 
     if (!open(FILE, $file)) {
        &ERROR("Failed reading help file ($file): $!");
@@ -35,12 +39,12 @@ sub help {
        $val =~ s/__/\037/g;
        $val =~ s/==/        /;
 
-       $help{$key}  = ""                if (!exists $help{$key});
+       $help{$key}  = ''                if (!exists $help{$key});
        $help{$key} .= $val."\n";
     }
     close FILE;
 
-    if (!defined $topic or $topic eq "") {
+    if (!defined $topic or $topic eq '') {
        &msg($who, $help{'main'});
 
        my $i = 0;
@@ -69,7 +73,7 @@ sub help {
            &performStrictReply($_);
        }
     } else {
-       &pSReply("no help on $topic.  Use 'help' without arguments.");
+       &performStrictReply("no help on $topic.  Use 'help' without arguments.");
     }
 
     return '';
@@ -92,7 +96,7 @@ sub timeget {
     } else {                   # the real thing.
        return [gettimeofday()];
     }
-}    
+}
 
 sub timedelta {
     my($start_time) = shift;
@@ -113,10 +117,13 @@ sub timedelta {
 sub formListReply {
     my($rand, $prefix, @list) = @_;
     my $total  = scalar @list;
-    my $maxshow = $param{'maxListReplyCount'}  || 10;
-    my $maxlen = $param{'maxListReplyLength'} || 400;
+    my $maxshow = &getChanConfDefault('maxListReplyCount', 15, $chan);
+    my $maxlen = &getChanConfDefault('maxListReplyLength', 400, $chan);
     my $reply;
 
+    # remove irc overhead
+    $maxlen -= 30;
+
     # no results.
     return $prefix ."returned no results." unless ($total);
 
@@ -127,7 +134,11 @@ sub formListReply {
            push(@rand, $list[$_]);
            last if (scalar @rand == $maxshow);
        }
-       @list = @rand;
+       if ($total > $maxshow) {
+           @list = sort @rand;
+       } else {
+           @list = @rand;
+       }
     } elsif ($total > $maxshow) {
        &status("formListReply: truncating list.");
 
@@ -135,10 +146,11 @@ sub formListReply {
     }
 
     # form the reply.
+    # FIXME: should grow and exit when full, not discard any that are oversize
     while () {
-       $reply  = $prefix ."(\002". scalar(@list). "\002 shown";
-       $reply .= "; \002$total\002 total" if ($total != scalar @list);
-       $reply .= "): ". join(" \002;;\002 ",@list) .".";
+       $reply  = $prefix ."(\002". scalar(@list). "\002";
+       $reply .= " of \002$total\002" if ($total != scalar @list);
+       $reply .= "): " . join(" \002;;\002 ", @list) .".";
 
        last if (length($reply) < $maxlen and scalar(@list) <= $maxshow);
        last if (scalar(@list) == 1);
@@ -153,7 +165,7 @@ sub formListReply {
 # Usage: &IJoin(@array);
 sub IJoin {
     if (!scalar @_) {
-       return "NULL";
+       return 'NULL';
     } elsif (scalar @_ == 1) {
        return $_[0];
     } else {
@@ -164,29 +176,31 @@ sub IJoin {
 #####
 # Usage: &Time2String(seconds);
 sub Time2String {
-    my $time = shift;
-    my $retval;
+    my ($time) = @_;
+    my $prefix = '';
+    my (@s, @t);
 
-    return("NULL s") if (!defined $time or $time !~ /\d+/);
+    return 'NULL' if (!defined $time);
+    return $time  if ($time !~ /\d+/);
 
-    my $prefix = "";
     if ($time < 0) {
        $time   = - $time;
        $prefix = "- ";
     }
 
-    my $s = int($time) % 60;
-    my $m = int($time / 60) % 60;
-    my $h = int($time / 3600) % 24;
-    my $d = int($time / 86400);
+    $t[0] = int($time) % 60;
+    $t[1] = int($time / 60) % 60;
+    $t[2] = int($time / 3600) % 24;
+    $t[3] = int($time / 86400);
 
-    my @data;
-    push(@data, sprintf("\002%d\002d", $d)) if ($d != 0);
-    push(@data, sprintf("\002%d\002h", $h)) if ($h != 0);
-    push(@data, sprintf("\002%d\002m", $m)) if ($m != 0);
-    push(@data, sprintf("\002%d\002s", $s)) if ($s != 0 or !@data);
+    push(@s, "$t[3]d") if ($t[3] != 0);
+    push(@s, "$t[2]h") if ($t[2] != 0);
+    push(@s, "$t[1]m") if ($t[1] != 0);
+    push(@s, "$t[0]s") if ($t[0] != 0 or !@s);
 
-    return $prefix.join(' ', @data);
+    my $retval = $prefix.join(' ', @s);
+    $retval =~ s/(\d+)/\002$1\002/g;
+    return $retval;
 }
 
 ###
@@ -200,9 +214,9 @@ sub fixFileList {
 
     # generate a hash list.
     foreach (@files) {
-       if (/^(.*\/)(.*?)$/) {
-           $files{$1}{$2} = 1;
-       }
+       next unless /^(.*\/)(.*?)$/;
+
+       $files{$1}{$2} = 1;
     }
     @files = ();       # reuse the array.
 
@@ -265,24 +279,24 @@ sub fixPlural {
        return $str;
     }
 
-    if ($str eq "has") {
-       $str = "have"   if ($int > 1);
-    } elsif ($str eq "is") {
-       $str = "are"    if ($int > 1);
-    } elsif ($str eq "was") {
-       $str = "were"   if ($int > 1);
-    } elsif ($str eq "this") {
-       $str = "these"  if ($int > 1);
+    if ($str eq 'has') {
+       $str = 'have'   if ($int > 1);
+    } elsif ($str eq 'is') {
+       $str = 'are'    if ($int > 1);
+    } elsif ($str eq 'was') {
+       $str = 'were'   if ($int > 1);
+    } elsif ($str eq 'this') {
+       $str = 'these'  if ($int > 1);
     } elsif ($str =~ /y$/) {
        if ($int > 1) {
            if ($str =~ /ey$/) {
-               $str .= "s";    # eg: "money" => "moneys".
+               $str .= 's';    # eg: 'money' => 'moneys'.
            } else {
                $str =~ s/y$/ies/;
            }
        }
     } else {
-       $str .= "s"     if ($int != 1);
+       $str .= 's'     if ($int != 1);
     }
 
     return $str;
@@ -368,7 +382,7 @@ sub getRandomInt {
        my $i = $1;
        my $fuzzy = int(rand 5);
        if ($i < 10) {
-           return $i*60;
+           return $i;
        }
        if (rand > 0.5) {
            return ($i - $fuzzy)*60;
@@ -422,7 +436,7 @@ sub IsHostMatch {
        $this{'host'} = &makeHostMask(lc $3);
     } else {
        &WARN("IHM: thisnuh is invalid '$thisnuh'.");
-       return 1 if ($thisnuh eq "");
+       return 1 if ($thisnuh eq '');
        return 0;
     }
 
@@ -464,6 +478,22 @@ sub isStale {
     return 0;
 }
 
+sub isFileUpdated {
+    my ($file, $time) = @_;
+
+    if (! -f $file) {
+       return 1;
+    }
+
+    my $time_file = (stat $file)[9];
+
+    if ($time <= $time_file) {
+       return 0;
+    } else {
+       return 1;
+    }
+}
+
 ##########
 ### make commands.
 ###
@@ -471,7 +501,7 @@ sub isStale {
 # Usage: &makeHostMask($host);
 sub makeHostMask {
     my ($host) = @_;
-    my $nu     = "";
+    my $nu     = '';
 
     if ($host =~ s/^(\S+!\S+\@)//) {
        &DEBUG("mHM: detected nick!user\@ for host arg; fixing");
@@ -518,7 +548,7 @@ sub makeRandom {
 
 sub checkMsgType {
     my ($reply) = @_;
-    return unless (&IsParam("minLengthBeforePrivate"));
+    return unless (&IsParam('minLengthBeforePrivate'));
     return if ($force_public_reply);
 
     if (length $reply > $param{'minLengthBeforePrivate'}) {
@@ -535,7 +565,7 @@ sub checkMsgType {
 sub validExec {
     my ($str) = @_;
 
-    if ($str =~ /[\'\"\|]/) {  # invalid.
+    if ($str =~ /[\`\'\"\|]/) {        # invalid.
        return 0;
     } else {                   # valid.
        return 1;
@@ -550,7 +580,7 @@ sub hasProfanity {
     for (lc $string) {
        /fuck/ and last;
        /dick|dildo/ and last;
-       /shit|turd|crap/ and last;
+       /shit/ and last;
        /pussy|[ck]unt/ and last;
        /wh[0o]re|bitch|slut/ and last;
 
@@ -560,10 +590,10 @@ sub hasProfanity {
     return $profanity;
 }
 
-sub hasParam {
+sub IsChanConfOrWarn {
     my ($param) = @_;
 
-    if (&IsChanConf($param) or &IsParam($param)) {
+    if (&IsChanConf($param) > 0) {
        return 1;
     } else {
        ### TODO: specific reason why it failed.
@@ -579,7 +609,7 @@ sub Forker {
     &shmFlush();
     &VERB("double fork detected; not forking.",2) if ($$ != $bot_pid);
 
-    if (&IsParam("forking") and $$ == $bot_pid) {
+    if (&IsParam('forking') and $$ == $bot_pid) {
        return unless &addForked($label);
 
        $SIG{CHLD} = 'IGNORE';
@@ -588,7 +618,7 @@ sub Forker {
 
        select(undef, undef, undef, 0.2);
 #      &status("fork starting for '$label', PID == $$.");
-       &status("--- fork starting for '$label', PID == $$ ---");
+       &status("--- fork starting for '$label', PID == $$, bot_pid == $bot_pid ---");
        &shmWrite($shm,"SET FORKPID $label $$");
 
        sleep 1;
@@ -596,7 +626,7 @@ sub Forker {
 
     ### TODO: use AUTOLOAD
     ### very lame hack.
-    if ($label !~ /-/ and !&loadMyModule($myModules{$label})) {
+    if ($label !~ /-/ and !&loadMyModule($label)) {
        &DEBUG("Forker: failed?");
        &delForked($label);
     }
@@ -625,25 +655,25 @@ sub mkcrypt {
 }
 
 sub closeStats {
-    return unless (&getChanConfList("ircTextCounters"));
+    return unless (&getChanConfList('ircTextCounters'));
 
     foreach (keys %cmdstats) {
        my $type        = $_;
-       my $i   = &dbGet("stats", "counter", "nick=".&dbQuote($type).
-                       " AND type='cmdstats'");
+       my $i   = &sqlSelect('stats', 'counter', {
+               nick    => $type,
+               type    => 'cmdstats',
+       } );
        my $z   = 0;
        $z++ unless ($i);
 
        $i      += $cmdstats{$type};
 
-       my %hash = (
-               nick => $type,
-               type => "cmdstats",
-               counter => $i
-       );              
-       $hash{time} = time() if ($z);
 
-       &dbReplace("stats", "nick", %hash);
+       &sqlSet('stats', {'nick' => $type}, {
+           type        => 'cmdstats',
+           'time'      => time(),
+           counter     => $i,
+       } );
     }
 }