# Created: 1997
#
-if (&IsParam("useStrict")) { use strict; }
+# use strict; # TODO
sub update {
my($lhs, $mhs, $rhs) = @_;
- $lhs =~ s/^i (heard|think) //i;
- $lhs =~ s/^some(one|1|body) said //i;
- $lhs =~ s/\s+/ /g;
+ for ($lhs) {
+ s/^i (heard|think) //i;
+ s/^some(one|1|body) said //i;
+ s/\s+/ /g;
+ }
# locked.
- return $noreply if (&IsLocked($lhs) == 1);
+ return if (&IsLocked($lhs) == 1);
# profanity.
- if (&IsParam("profanityCheck") and &hasProfanity($rhs)) {
- &msg($who, "please, watch your language.");
- return $noreply;
+ 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 $noreply;
+ return 1;
}
# invalid verb.
}
# check if the arguments are too long to be stored in our table.
- if (length($lhs) > $param{'maxKeySize'} or
- length($rhs) > $param{'maxDataSize'})
- {
+ my $toolong = 0;
+ $toolong++ if (length $lhs > $param{'maxKeySize'});
+ $toolong++ if (length $rhs > $param{'maxDataSize'});
+ if ($toolong) {
&performAddressedReply("that's too long");
- return $noreply;
+ return 1;
}
- #
- # lets do it...
- #
-
- my $also = ($rhs =~ s/^also //i);
+ # also checking.
+ my $also = ($rhs =~ s/^-?also //i);
my $also_or = ($also and $rhs =~ s/\s+(or|\|\|)\s+//);
- if (&IsParam("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 $noreply;
+ # 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 (my $exists = &getFactoid($lhs)) { # factoid exists.
- if ($exists eq $rhs) {
- &performAddressedReply("i already had it that way");
- return $noreply;
+ if ($count >= 10) {
+ &msg($who, "error: could not SAR properly.");
+ &DEBUG("error: lhs => '$lhs' rhs => '$rhs'.");
+ return;
}
- if ($also) { # 'is also'.
- if ($also_or) { # 'is also ||'.
- $rhs = $exists.' || '.$rhs;
- } else {
-# if ($exists =~ s/\,\s*$/, /) {
- if ($exists =~ /\,\s*$/) {
- &DEBUG("current has trailing comma, just append as is");
- # $rhs =~ s/^\s+//;
- # $rhs = $exists." ".$rhs; # keep comma.
- }
+ my $z = join(',',@list);
+ $rhs =~ s/^/($z): /;
- if ($exists =~ /\.\s*$/) {
- &DEBUG("current has trailing period, just append as is with 2 WS");
- # $rhs =~ s/^\s+//;
- # use ucfirst();?
- # $rhs = $exists." ".$rhs; # keep comma.
- }
+ &status("Update: new lhs => '$lhs' rhs => '$rhs'.");
+ }
- if ($rhs =~ /^[A-Z]/) {
- if ($rhs =~ /\w+\s*$/) {
- &status("auto insert period to factoid.");
- $rhs = $exists.". ".$rhs;
- } else { # '?' or '.' assumed at end.
- &status("orig factoid already had trailing symbol; not adding period.");
- $rhs = $exists." ".$rhs;
- }
- } elsif ($exists =~ /[\,\.\-]\s*$/) {
- &VERB("U: current has trailing symbols; inserting whitespace + new.",2);
- $rhs = $exists." ".$rhs;
- } elsif ($rhs =~ /^\./) {
- &VERB("U: new text has ^.; appending directly",2);
- $rhs = $exists.$rhs;
- } else {
- $rhs = $exists.', or '.$rhs;
- }
- }
+ # the fun begins.
+ my $exists = &getFactoid($lhs);
- # max length check again.
- if (length($rhs) > $param{'maxDataSize'}) {
- if (length($rhs) > length($exists)) {
- &performAddressedReply("that's too long");
- return $noreply;
- } else {
- &status("Update: new length is still longer than maxDataSize but less than before, we'll let it go.");
- }
- }
+ if (!$exists) {
+ # nice 'are' hack (or work-around).
+ if ($mhs =~ /^are$/i and $rhs !~ /<\S+>/) {
+ &status("Update: 'are' hack detected.");
+ $mhs = 'is';
+ $rhs = "<REPLY> are ". $rhs;
+ }
- &performAddressedReply("okay");
+ &status("enter: <$who> \'$lhs\' =$mhs=> \'$rhs\'");
+ $count{'Update'}++;
- $count{'Update'}++;
- &status("update: <$who> \'$lhs\' =$mhs=> \'$rhs\'; was \'$exists\'");
- &AddModified($lhs,$nuh);
- &setFactInfo($lhs, "factoid_value", $rhs);
+ &performAddressedReply('okay');
- if (!defined $rhs or $rhs eq "") {
- &ERROR("Update: rhs1 == NULL.");
- }
- } else { # not "also"
- if ($correction_plausible) { # "no, blah is ..."
- my $author = &getFactInfo($lhs, "created_by") || "";
+ &sqlInsert('factoids', {
+ created_by => $nuh,
+ created_time => time(), # modified time.
+ factoid_key => $lhs,
+ factoid_value => $rhs,
+ } );
- if (IsFlag("m") ne "m" and $author !~ /^\Q$who\E\!/i) {
- &msg($who, "you can't change that factoid.");
- return $noreply;
- }
+ if (!defined $rhs or $rhs eq '') {
+ &ERROR("Update: rhs1 == NULL.");
+ }
+
+ return 1;
+ }
- &performAddressedReply("okay");
+ # 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;
+ }
- $count{'Update'}++;
- &status("update: <$who> \'$lhs\' =$mhs=> \'$rhs\'; was \'$exists\'");
+ if ($also) { # 'is also'.
+ if ($exists =~ /^<REPLY> see /i) {
+ &TODO("Update.pl: append to linked factoid.");
+ }
- &delFactoid($lhs);
- &setFactInfo($lhs,"created_by", $nuh);
- &setFactInfo($lhs,"created_time", time());
- &setFactInfo($lhs,"factoid_value", $rhs);
+ if ($also_or) { # 'is also ||'.
+ $rhs = $exists.' || '.$rhs;
+ } else {
+# 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 (!defined $rhs or $rhs eq "") {
- &ERROR("Update: rhs1 == NULL.");
- }
+ 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.
+ }
- } else { # "blah is ..."
- if ($addressed) {
- &performStrictReply("...but \002$lhs\002 is already something else...");
- &status("FAILED update: <$who> \'$lhs\' =$mhs=> \'$rhs\'");
+ if ($rhs =~ /^[A-Z]/) {
+ if ($rhs =~ /\w+\s*$/) {
+ &status("auto insert period to factoid.");
+ $rhs = $exists.". ".$rhs;
+ } else { # '?' or '.' assumed at end.
+ &status("orig factoid already had trailing symbol; not adding period.");
+ $rhs = $exists." ".$rhs;
}
- return $noreply;
+ } elsif ($exists =~ /[\,\.\-]\s*$/) {
+ &VERB("U: current has trailing symbols; inserting whitespace + new.",2);
+ $rhs = $exists." ".$rhs;
+ } elsif ($rhs =~ /^\./) {
+ &VERB("U: new text has ^.; appending directly",2);
+ $rhs = $exists.$rhs;
+ } else {
+ $rhs = $exists.', or '.$rhs;
}
}
- } else { # not exists.
- # nice 'are' hack (or work-around).
- if ($mhs =~ /^are$/i and $rhs !~ /<\S+>/) {
- &DEBUG("Update: 'are' hack detected.");
- $mhs = "is";
- $rhs = "<REPLY> are ". $rhs;
+ # max length check again.
+ if (length $rhs > $param{'maxDataSize'}) {
+ if (length $rhs > length $exists) {
+ &performAddressedReply("that's too long");
+ return 1;
+ } else {
+ &status("Update: new length is still longer than maxDataSize but less than before, we'll let it go.");
+ }
}
- &status("enter: <$who> \'$lhs\' =$mhs=> \'$rhs\'");
+ &performAddressedReply('okay');
+
$count{'Update'}++;
+ &status("update: <$who> \'$lhs\' =$mhs=> \'$rhs\'; was \'$exists\'");
+ &sqlSet('factoids', {'factoid_key' => $lhs}, {
+ modified_by => $nuh,
+ modified_time => time(),
+ factoid_value => $rhs,
+ } );
+
+ if (!defined $rhs or $rhs eq '') {
+ &ERROR("Update: rhs1 == NULL.");
+ }
+ } 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 1;
+ }
- &performAddressedReply("okay");
+ my $author = &getFactInfo($lhs, 'created_by') || '';
+
+ 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');
+
+ $count{'Update'}++;
+ &status("update: <$who> \'$lhs\' =$mhs=> \'$rhs\'; was \'$exists\'");
- &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.");
}
}
- return "$lhs $mhs $rhs";
+ return 1;
}
1;