+ if ($also) { # 'is also'.
+ my $redircount = 5;
+ my $origlhs = $lhs;
+ my $origlhs_utf8 = $lhs_utf8;
+ while ( $exists_utf8 =~ /^<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;
+ }
+ $exists_utf8 = decode_utf8($exists);
+ }
+
+ if ($also_or) { # 'is also ||'.
+ $rhs_utf8 = $exists . ' || ' . $rhs_utf8;
+ $rhs = encode_utf8($rhs_utf8);
+ $lhs = encode_utf8($lhs_utf8);
+ }
+ else {
+
+ # if ($exists =~ s/\,\s*$/, /) {
+ if ( $exists_utf8 =~ /\,\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_utf8 =~ /\.\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_utf8 =~ /^[A-Z]/ ) {
+ if ( $rhs_utf8 =~ /\w+\s*$/ ) {
+ &status("auto insert period to factoid.");
+ $rhs_utf8 = $exists_utf8 . ". " . $rhs_utf8;
+ }
+ else { # '?' or '.' assumed at end.
+ &status(
+"orig factoid already had trailing symbol; not adding period."
+ );
+ $rhs_utf8 = $exists_utf8 . " " . $rhs_utf8;
+ }
+ }
+ elsif ( $exists =~ /[\,\.\-]\s*$/ ) {
+ &VERB(
+"U: current has trailing symbols; inserting whitespace + new.",
+ 2
+ );
+ $rhs_utf8 = $exists_utf8 . " " . $rhs_utf8;
+ }
+ elsif ( $rhs_utf8 =~ /^\./ ) {
+ &VERB( "U: new text starts with period; appending directly", 2 );
+ $rhs_utf8 = $exists_utf8 . $rhs_utf8;
+ }
+ else {
+ $rhs_utf8 = $exists_utf8 . ', or ' . $rhs_utf8;
+ }
+ $rhs = encode_utf8($rhs_utf8);
+ }
+
+ # max length check again.
+ if ( length $rhs > $param{'maxDataSize'} ) {
+ if ( length $rhs_utf8 > length $exists_utf8 ) {
+ &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."
+ );
+ }
+ }
+ $rhs = encode_utf8($rhs_utf8);
+ $lhs = encode_utf8($lhs_utf8);
+ $exists = encode_utf8($exists_utf8);
+
+ &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.");
+ }