X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=blootbot%2Fsrc%2FFactoids%2FUpdate.pl;h=400012e52387e126765c803dba173bf3966c8f82;hb=a98bcf5bb54a8890a03dee50b58a5de175db4d84;hp=de6cfa78848f1ca756ff65e8fb4ce1811e12f3b9;hpb=491b7ff0155d5c214b19fb594d6cb7624c91aa62;p=infobot.git diff --git a/blootbot/src/Factoids/Update.pl b/blootbot/src/Factoids/Update.pl index de6cfa7..400012e 100644 --- a/blootbot/src/Factoids/Update.pl +++ b/blootbot/src/Factoids/Update.pl @@ -6,29 +6,31 @@ # 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; + &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. @@ -38,115 +40,191 @@ sub update { } # 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 ($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'."); } - if (my $exists = &getFactoid($lhs)) { # factoid exists. - if ($exists eq $rhs) { - &performAddressedReply("i already had it that way"); - return $noreply; + # the fun begins. + my $exists = &getFactoid($lhs); + + if (!$exists) { + # nice 'are' hack (or work-around). + if ($mhs =~ /^are$/i and $rhs !~ /<\S+>/) { + &status("Update: 'are' hack detected."); + $mhs = "is"; + $rhs = " are ". $rhs; } - if ($also) { # 'is also'. - if ($also_or) { # 'is also ||'. - $rhs = $exists.' || '.$rhs; - } else { - 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*$/) { - $rhs = $exists." ".$rhs; - } elsif ($rhs =~ /^\./) { - $rhs = $exists.$rhs; - } else { - $rhs = $exists.', or '.$rhs; - } - } + &status("enter: <$who> \'$lhs\' =$mhs=> \'$rhs\'"); + $count{'Update'}++; - # max length check again. - if (length($rhs) > $param{'maxDataSize'}) { - &performAddressedReply("that's too long"); - return $noreply; - } + &performAddressedReply("okay"); - &performAddressedReply("okay"); + &sqlReplace("factoids", { + created_by => $nuh, + created_time => time(), # modified time. + factoid_key => $lhs, + factoid_value => $rhs, + } ); - $count{'Update'}++; - &status("update: <$who> \'$lhs\' =$mhs=> \'$rhs\'; was \'$exists\'"); - &AddModified($lhs,$nuh); - &setFactInfo($lhs, "factoid_value", $rhs); - } else { # not "also" - if ($correction_plausible) { # "no, blah is ..." - my $author = &getFactInfo($lhs, "created_by"); + if (!defined $rhs or $rhs eq "") { + &ERROR("Update: rhs1 == NULL."); + } - &DEBUG("Update: check: '$author' == '$who' ?"); + return 1; + } - if (IsFlag("m") ne "m" and $author !~ /^\Q$who\E\!/i) { - &msg($who, "you can't change that factoid."); - return $noreply; - } + # 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; + } - &performAddressedReply("okay"); + if ($also) { # 'is also'. + if ($exists =~ /^ see /i) { + &TODO("Update.pl: append to linked factoid."); + } - $count{'Update'}++; - &status("update: <$who> \'$lhs\' =$mhs=> \'$rhs\'; was \'$exists\'"); + 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. + } - &delFactoid($lhs); - &setFactInfo($lhs,"created_by", $nuh); - &setFactInfo($lhs,"created_time", time()); - &setFactInfo($lhs,"factoid_value", $rhs); - } else { # "blah is ..." - if ($addressed) { - &performStrictReply("...but \002$lhs\002 is already something else..."); - &status("FAILED update: <$who> \'$lhs\' =$mhs=> \'$rhs\'"); + 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; } - 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 = " 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\'"); + &sqlReplace("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"); - &setFactInfo($lhs,"created_by", $nuh); - &setFactInfo($lhs,"created_time", time()); - &setFactInfo($lhs,"factoid_value", $rhs); + $count{'Update'}++; + &status("update: <$who> \'$lhs\' =$mhs=> \'$rhs\'; was \'$exists\'"); + + &sqlReplace("factoids", { + factoid_key => $lhs, + modified_by => $nuh, + modified_time => time(), + factoid_value => $rhs, + } ); + + if (!defined $rhs or $rhs eq "") { + &ERROR("Update: rhs1 == NULL."); + } } - return "$lhs $mhs $rhs"; + return 1; } 1;