]> git.donarmstrong.com Git - infobot.git/blobdiff - src/Misc.pl
- IsHostMatch: check for NULL.
[infobot.git] / src / Misc.pl
index ddda582e314fbb4a58ad42362fababcc99ab6e27..9379d7b10dae4e2fda048cfd3e6d580d213a63fc 100644 (file)
@@ -9,9 +9,12 @@ if (&IsParam("useStrict")) { use strict; }
 
 sub help {
     my $topic = shift;
-    my $file  = $bot_misc_dir."/blootbot.help";
+    my $file  = $bot_data_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;
@@ -164,20 +167,26 @@ sub Time2String {
     my $time = shift;
     my $retval;
 
-    return("0s")
-               if (!defined $time or $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;
     my $h = int($time / 3600) % 24;
     my $d = int($time / 86400);
 
-    $retval .= sprintf(" \002%d\002d", $d) if ($d != 0);
-    $retval .= sprintf(" \002%d\002h", $h) if ($h != 0);
-    $retval .= sprintf(" \002%d\002m", $m) if ($m != 0);
-    $retval .= sprintf(" \002%d\002s", $s) if ($s != 0);
+    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);
 
-    return substr($retval, 1);
+    return $prefix.join(' ', @data);
 }
 
 ###
@@ -200,9 +209,14 @@ sub fixFileList {
     # 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 (scalar @keys > 3) {
+           pop @keys while (scalar @keys > 3);
+           push(@keys, "...");
+       }
+
        if ($i > 1) {
            $file .= "\002{\002". join("\002|\002", @keys) ."\002}\002";
        } else {
@@ -246,6 +260,11 @@ sub fixPlural {
        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") {
@@ -269,8 +288,6 @@ sub fixPlural {
     return $str;
 }
 
-
-
 ##########
 ### get commands.
 ###
@@ -350,7 +367,7 @@ sub getRandomInt {
 
     srand();
 
-    if ($str =~ /^(\d+)$/) {
+    if ($str =~ /^(\d+(\.\d+)?)$/) {
        my $i = $1;
        my $fuzzy = int(rand 5);
        if ($i < 10) {
@@ -399,7 +416,10 @@ sub IsHostMatch {
        $local{'host'} = &makeHostMask(lc $3);
     }
 
-    if ($thisnuh =~ /^(\S+)!(\S+)@(\S+)/) {
+    if (!defined $thisnuh) {
+       &WARN("IHM: thisnuh == NULL.");
+       return 0;
+    } elsif ($thisnuh =~ /^(\S+)!(\S+)@(\S+)/) {
        $this{'nick'} = lc $1;
        $this{'user'} = lc $2;
        $this{'host'} = &makeHostMask(lc $3);
@@ -424,10 +444,26 @@ 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;
+    }
+
+    &DEBUG("!exist $file") if (! -f $file);
+
     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;
+    if ($file =~ /idx/) {
+       my $age2 = time() - (stat($file))[9];
+       &VERB("stale: $age2. (". &Time2String($age2) .")",2);
+    }
+    $age *= 60*60*24 if ($age >= 0 and $age < 30);
+
+    return 1 if (time() - (stat($file))[9] > $age);
     return 0;
 }
 
@@ -437,15 +473,22 @@ sub isStale {
 
 # Usage: &makeHostMask($host);
 sub makeHostMask {
-    my ($host) = @_;
+    my ($host) = @_;
+    my $nu     = "";
+
+    if ($host =~ s/^(\S+!\S+\@)//) {
+       &DEBUG("mHM: detected nick!user\@ for host arg; fixing");
+       &DEBUG("nu => $nu");
+       $nu = $1;
+    }
 
     if ($host =~ /^$mask{ip}$/) {
-       return "$1.$2.$3.*";
+       return $nu."$1.$2.$3.*";
     }
 
     my @array = split(/\./, $host);
-    return $host if (scalar @array <= 3);
-    return "*.".join('.',@{array}[1..$#array]);
+    return $nu.$host if (scalar @array <= 3);
+    return $nu."*.".join('.',@{array}[1..$#array]);
 }
 
 # Usage: &makeRandom(int);
@@ -502,85 +545,6 @@ sub validExec {
     }
 }
 
-# Usage: &validFactoid($lhs,$rhs);
-sub validFactoid {
-    my ($lhs,$rhs) = @_;
-    my $valid = 0;
-
-    for (lc $lhs) {
-       # allow the following only if they have been made on purpose.
-       if ($rhs ne "" and $rhs !~ /^</) {
-           / \Q$ident$/i and last;     # someone said i'm something.
-           /^i('m)? / and last;
-           /^(it|that|there|what)('s)?(\s+|$)/ and last;
-           /^you('re)?(\s+|$)/ and last;
-
-           /^(where|who|why|when|how)(\s+|$)/ and last;
-           /^(this|that|these|those|they)(\s+|$)/ and last;
-           /^(every(one|body)|we) / and last;
-
-           /^say / and last;
-       }
-
-       # uncaught commands.
-       /^add topic / and last;         # topic management.
-       /( add$| add |^add )/ and last; # borked teach statement.
-       /^learn / and last;             # teach. damn morons.
-       /^tell (\S+) about / and last;  # tell.
-       /\=\~/ 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;
-
-       # delimiters.
-       /\=\>/ and last;                # '=>'.
-       /\;\;/ and last;                # ';;'.
-       /\|\|/ and last;                # '||'.
-
-       /^\Q$ident\E[\'\,\: ]/ and last;# dupe addressed.
-       /^[\-\, ]/ and last;
-       /\\$/ and last;                 # forgot shift for '?'.
-       /^all / and last;
-       /^also / and last;
-       / also$/ and last;
-       / and$/ and last;
-       /^because / and last;
-       /^gives / and last;
-       /^h(is|er) / and last;
-       /^if / and last;
-       / is,/ and last;
-       / it$/ and last;
-       / says$/ and last;
-       /^should / and last;
-       /^so / and last;
-       /^supposedly/ and last;
-       /^to / and last;
-       /^was / and last;
-       / which$/ and last;
-
-       # nasty bug I introduced _somehow_, probably by fixMySQLBug().
-       /\\\%/ and last;
-       /\\\_/ and last;
-
-       # weird/special stuff. also old blootbot or stock infobot bugs.
-       $rhs =~ /( \Q$ident\E's|\Q$ident\E's )/i and last; # ownership.
-
-       # duplication.
-       $rhs =~ /^\Q$lhs /i and last;
-       last if ($rhs =~ /^is /i and / is$/);
-
-       $valid++;
-    }
-
-    return $valid;
-}
-
 # Usage: &hasProfanity($string);
 sub hasProfanity {
     my ($string) = @_;
@@ -599,14 +563,13 @@ sub hasProfanity {
     return $profanity;
 }
 
-### rename to hasChanConf() ?
 sub hasParam {
     my ($param) = @_;
 
-    ### TODO: specific reason why it failed.
-    if (&IsChanConf($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;
     }
@@ -657,4 +620,34 @@ 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);
+}
+
+sub closeStats {
+    return unless (&getChanConfList("ircTextCounters"));
+
+    foreach (keys %cmdstats) {
+       my $type        = $_;
+       my $i   = &dbGet("stats", "counter", "nick=".&dbQuote($type).
+                       " AND 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);
+    }
+}
+
 1;