]> git.donarmstrong.com Git - infobot.git/blobdiff - src/Factoids/Update.pl
* Correction to factoid updates to treat appending as a modification
[infobot.git] / src / Factoids / Update.pl
index df9a38854a8c5675f3756e99c9957de381ad219c..75714dad450beb74c2a8a12b3c4ebd17d945fb72 100644 (file)
@@ -6,7 +6,7 @@
 #   Created: 1997
 #
 
-if (&IsParam("useStrict")) { use strict; }
+# use strict;  # TODO
 
 sub update {
     my($lhs, $mhs, $rhs) = @_;
@@ -21,13 +21,13 @@ sub update {
     return if (&IsLocked($lhs) == 1);
 
     # profanity.
-    if (&IsParam("profanityCheck") and &hasProfanity($rhs)) {
+    if (&IsParam('profanityCheck') and &hasProfanity($rhs)) {
        &performReply("please, watch your language.");
        return 1;
     }
 
     # teaching.
-    if (&IsFlag("t") ne "t") {
+    if (&IsFlag('t') ne 't' && &IsFlag('o') ne 'o') {
        &msg($who, "permission denied.");
        &status("alert: $who wanted to teach me.");
        return 1;
@@ -49,17 +49,55 @@ sub update {
     }
 
     # also checking.
-    my $also    = ($rhs =~ s/^(-?)also //i);
-    &DEBUG("1=>$1");
+    my $also    = ($rhs =~ s/^-?also //i);
     my $also_or = ($also and $rhs =~ s/\s+(or|\|\|)\s+//);
 
-    # freshmeat
-    if (&IsChanConf("freshmeatForFactoid")) {
-       if (&dbGet("freshmeat", "name", $lhs, "name")) {
-           &msg($who, "permission denied. (freshmeat)");
-           &status("alert: $who wanted to teach me something that freshmeat already has info on.");
-           return 1;
+    if ($also or $also_or) {
+        my $author  = &getFactInfo($from, 'created_by');
+        $author =~ /^(.*)!/;
+        my $created_by = $1;
+
+        # Can they even modify factoids?
+        if (&IsFlag('m') ne 'm' and &IsFlag('M') ne 'M' and &IsFlag('o') ne 'o') {
+            &performReply("You do not have permission to modify factoids");
+            return 1;
+
+        # If they have +M but they didnt create the factoid
+        } elsif (&IsFlag('M') eq 'M' and
+                 $who !~ /^\Q$created_by\E$/i
+                 &IsFlag('m') ne 'm'
+                 &IsFlag('o') ne 'o') {
+            &performReply("factoid '$lhs' is not yours to modify.");
+            return 1;
+        }
+    }
+
+    # factoid arguments handler.
+    # must start with a non-variable
+    if (&IsChanConf('factoidArguments') > 0 and $lhs =~ /^[^\$]+.*\$/) {
+       &status("Update: Factoid Arguments found.");
+       &status("Update: orig lhs => '$lhs'.");
+       &status("Update: orig rhs => '$rhs'.");
+
+       my @list;
+       my $count = 0;
+       $lhs =~ s/^/cmd: /;
+       while ($lhs =~ s/\$(\S+)/(.*?)/) {
+           push(@list, "\$$1");
+           $count++;
+           last if ($count >= 10);
+       }
+
+       if ($count >= 10) {
+           &msg($who, "error: could not SAR properly.");
+           &DEBUG("error: lhs => '$lhs' rhs => '$rhs'.");
+           return;
        }
+
+       my $z = join(',',@list);
+       $rhs =~ s/^/($z): /;
+
+       &status("Update: new lhs => '$lhs' rhs => '$rhs'.");
     }
 
     # the fun begins.
@@ -68,21 +106,24 @@ sub update {
     if (!$exists) {
        # nice 'are' hack (or work-around).
        if ($mhs =~ /^are$/i and $rhs !~ /<\S+>/) {
-           &DEBUG("Update: 'are' hack detected.");
-           $mhs = "is";
+           &status("Update: 'are' hack detected.");
+           $mhs = 'is';
            $rhs = "<REPLY> are ". $rhs;
        }
 
        &status("enter: <$who> \'$lhs\' =$mhs=> \'$rhs\'");
        $count{'Update'}++;
 
-       &performAddressedReply("okay");
+       &performAddressedReply('okay');
 
-       &setFactInfo($lhs,"created_by", $nuh);
-       &setFactInfo($lhs,"created_time", time());
-       &setFactInfo($lhs,"factoid_value", $rhs);
+       &sqlInsert('factoids', {
+               created_by      => $nuh,
+               created_time    => time(),      # modified time.
+               factoid_key     => $lhs,
+               factoid_value   => $rhs,
+       } );
 
-       if (!defined $rhs or $rhs eq "") {
+       if (!defined $rhs or $rhs eq '') {
            &ERROR("Update: rhs1 == NULL.");
        }
 
@@ -91,13 +132,32 @@ sub update {
 
     # factoid exists.
     if ($exists eq $rhs) {
+       # this catches the following situation: (right or wrong?)
+       #    "test is test"
+       #    "test is also test"
        &performAddressedReply("i already had it that way");
        return 1;
     }
 
     if ($also) {                       # 'is also'.
-       if ($exists =~ /^<REPLY> see /i) {
-           &DEBUG("todo: append to linked factoid.");
+        my $redircount = 5;
+        my $origlhs = $lhs;
+        while ($exists =~ /^<REPLY> ?see (.*)/i) {
+            $redircount--;
+            unless ($redircount) {
+                &msg($who, "$origlhs has too many levels of redirection.");
+                return 1;
+            }
+
+            $lhs = $1;
+            $exists = &getFactoid($lhs);
+            unless( $exists ) {
+                &msg($who, "$1 is a dangling redirection.");
+                return 1;
+            }
+        }
+       if ($exists =~ /^<REPLY> ?see (.*)/i) {
+           &TODO("Update.pl: append to linked factoid.");
        }
 
        if ($also_or) {                 # 'is also ||'.
@@ -106,12 +166,16 @@ sub update {
 #          if ($exists =~ s/\,\s*$/,  /) {
            if ($exists =~ /\,\s*$/) {
                &DEBUG("current has trailing comma, just append as is");
+               &DEBUG("Up: exists => $exists");
+               &DEBUG("Up: rhs    => $rhs");
                # $rhs =~ s/^\s+//;
                # $rhs = $exists." ".$rhs;      # keep comma.
            }
 
            if ($exists =~ /\.\s*$/) {
                &DEBUG("current has trailing period, just append as is with 2 WS");
+               &DEBUG("Up: exists => $exists");
+               &DEBUG("Up: rhs    => $rhs");
                # $rhs =~ s/^\s+//;
                # use ucfirst();?
                # $rhs = $exists."  ".$rhs;     # keep comma.
@@ -146,44 +210,50 @@ sub update {
            }
        }
 
-       &performAddressedReply("okay");
+       &performAddressedReply('okay');
 
        $count{'Update'}++;
        &status("update: <$who> \'$lhs\' =$mhs=> \'$rhs\'; was \'$exists\'");
-       &AddModified($lhs,$nuh);
-       &setFactInfo($lhs, "factoid_value", $rhs);
+       &sqlSet('factoids', {'factoid_key' => $lhs}, {
+               modified_by     => $nuh,
+               modified_time   => time(),
+               factoid_value   => $rhs,
+       } );
 
-       if (!defined $rhs or $rhs eq "") {
+       if (!defined $rhs or $rhs eq '') {
            &ERROR("Update: rhs1 == NULL.");
        }
-    } else {                           # not "also"
+    } else {                           # not 'also'
 
        if (!$correction_plausible) {   # "no, blah is ..."
            if ($addressed) {
                &performStrictReply("...but \002$lhs\002 is already something else...");
                &status("FAILED update: <$who> \'$lhs\' =$mhs=> \'$rhs\'");
            }
-           return;
+           return 1;
        }
 
-       my $author = &getFactInfo($lhs, "created_by") || "";
+       my $author = &getFactInfo($lhs, 'created_by') || '';
 
-       if (IsFlag("m") ne "m" and $author !~ /^\Q$who\E\!/i) {
+       if (IsFlag('m') ne 'm' && IsFlag('o') ne 'o' &&
+           $author !~ /^\Q$who\E\!/i
+       ) {
            &msg($who, "you can't change that factoid.");
            return 1;
        }
 
-       &performAddressedReply("okay");
+       &performAddressedReply('okay');
 
        $count{'Update'}++;
        &status("update: <$who> \'$lhs\' =$mhs=> \'$rhs\'; was \'$exists\'");
 
-       &delFactoid($lhs);
-       &setFactInfo($lhs,"created_by", $nuh);
-       &setFactInfo($lhs,"created_time", time());
-       &setFactInfo($lhs,"factoid_value", $rhs);
+       &sqlSet('factoids', {'factoid_key' => $lhs}, {
+               modified_by     => $nuh,
+               modified_time   => time(),
+               factoid_value   => $rhs,
+       } );
 
-       if (!defined $rhs or $rhs eq "") {
+       if (!defined $rhs or $rhs eq '') {
            &ERROR("Update: rhs1 == NULL.");
        }
     }
@@ -192,3 +262,5 @@ sub update {
 }
 
 1;
+
+# vim:ts=4:sw=4:expandtab:tw=80