X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=blootbot%2Fsrc%2FFactoids%2FUpdate.pl;h=5df526a5fa53265e30db301c0e0d60b9d4573962;hb=80d3f25456496564ba3345f6e7085a44b436acac;hp=8f12e1dbbd874e943ca6fd04c0fc63e2a8f1f7d9;hpb=86c5e1973c974da7dfad9f2da4cea786b1c7c7a4;p=infobot.git diff --git a/blootbot/src/Factoids/Update.pl b/blootbot/src/Factoids/Update.pl index 8f12e1d..5df526a 100644 --- a/blootbot/src/Factoids/Update.pl +++ b/blootbot/src/Factoids/Update.pl @@ -11,142 +11,227 @@ if (&IsParam("useStrict")) { use strict; } 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") { &msg($who, "permission denied."); &status("alert: $who wanted to teach me."); - return $noreply; - } - - # nice 'are' hack (or work-around). - if ($mhs =~ /^are$/i and $rhs !~ /<\S+>/) { - $mhs = "is"; - $rhs = " are ". $rhs; + return 1; } # invalid verb. - if ($mhs !~ /^is$/i) { + if ($mhs !~ /^(is|are)$/i) { &ERROR("UNKNOWN verb: $mhs."); return; } # 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")) { + # freshmeat + if (&IsChanConf("freshmeatForFactoid")) { + # todo: "name" is invalid for fm ][ + if ( &dbGet("freshmeat", "name", "name=".&dbQuote($lhs)) ) { &msg($who, "permission denied. (freshmeat)"); &status("alert: $who wanted to teach me something that freshmeat already has info on."); - return $noreply; + return 1; } } - if (my $exists = &getFactoid($lhs)) { # factoid exists. - chomp $exists; + # factoid arguments handler. + if (&IsChanConf("factoidArguments") 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 ($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'."); + &DEBUG("error: rhs => '$rhs'."); + return; } - 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; - } - } + my $z = join(',',@list); + $rhs =~ s/^/($z): /; - # max length check again. - if (length($rhs) > $param{'maxDataSize'}) { - &performAddressedReply("that's too long"); - return $noreply; - } + &status("Update: new lhs => '$lhs'."); + &status("Update: new rhs => '$rhs'."); + } - &performAddressedReply("okay"); + # the fun begins. + my $exists = &getFactoid($lhs); - $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 (!$exists) { + # nice 'are' hack (or work-around). + if ($mhs =~ /^are$/i and $rhs !~ /<\S+>/) { + &status("Update: 'are' hack detected."); + $mhs = "is"; + $rhs = " are ". $rhs; + } - &DEBUG("Update: check: '$author' == '$who' ?"); + &status("enter: <$who> \'$lhs\' =$mhs=> \'$rhs\'"); + $count{'Update'}++; - if (IsFlag("m") ne "m" and $author !~ /^\Q$who\E\!/i) { - &msg($who, "you can't change that factoid."); - return $noreply; - } + &performAddressedReply("okay"); + + if (1) { # old + &setFactInfo($lhs,"factoid_value", $rhs); + &setFactInfo($lhs,"created_by", $nuh); + &setFactInfo($lhs,"created_time", time()); + } else { + ### BROKEN!!! + # I'd prefer to use dbReplace but it don't work. + &dbReplace("factoids", "factoid_key", ( + factoid_key => $lhs, + created_by => time(), + factoid_value => $rhs, + ) ); + } + + if (!defined $rhs or $rhs eq "") { + &ERROR("Update: rhs1 == NULL."); + } + + return 1; + } + + # factoid exists. + if ($exists eq $rhs) { + &performAddressedReply("i already had it that way"); + return 1; + } + + if ($also) { # 'is also'. + if ($exists =~ /^ see /i) { + &DEBUG("todo: append to linked factoid."); + } - &performAddressedReply("okay"); + 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. + } - $count{'Update'}++; - &status("update: <$who> \'$lhs\' =$mhs=> \'$rhs\'; was \'$exists\'"); + 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. + } - &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 ($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. - &status("enter: <$who> \'$lhs\' =$mhs=> \'$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 1; + } + + 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."); + } } - return "$lhs $mhs $rhs"; + return 1; } 1;