- if ($also) { # 'is also'.
- if ($exists =~ /^<REPLY> see /i) {
- &DEBUG("todo: append to linked factoid.");
- }
-
- 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 ($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.
- }
-
- 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;
- }
- }
-
- # 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.");
- }
- }
-
- &performAddressedReply("okay");
-
- $count{'Update'}++;
- &status("update: <$who> \'$lhs\' =$mhs=> \'$rhs\'; was \'$exists\'");
- &AddModified($lhs,$nuh);
- &setFactInfo($lhs, "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;
- }
-
- my $author = &getFactInfo($lhs, "created_by") || "";
-
- if (IsFlag("m") ne "m" and $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\'");
-
- &delFactoid($lhs);
- &setFactInfo($lhs,"created_by", $nuh);
- &setFactInfo($lhs,"created_time", time());
- &setFactInfo($lhs,"factoid_value", $rhs);
-
- if (!defined $rhs or $rhs eq "") {
- &ERROR("Update: rhs1 == NULL.");
- }
+ if ($also) { # 'is also'.
+ 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 ||'.
+ $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 ( $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.
+ }
+
+ 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;
+ }
+ }
+
+ # 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."
+ );
+ }
+ }
+
+ &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;
+ }
+
+ 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\'");
+
+ &sqlSet(
+ 'factoids',
+ { 'factoid_key' => $lhs },
+ {
+ modified_by => $nuh,
+ modified_time => time(),
+ factoid_value => $rhs,
+ }
+ );
+
+ if ( !defined $rhs or $rhs eq '' ) {
+ &ERROR("Update: rhs1 == NULL.");
+ }