X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2FFactoids%2FCore.pl;h=e33685c91f712214a267652cb45f453f00a8f1a0;hb=d2831f6af012fb356e8b0f9b00bbb98e16eba940;hp=d8d559a0a8b2202a5afc1521f16f174314c1113b;hpb=b633b70da75877265fa2c75bd552b1b5cb4ec2c9;p=infobot.git diff --git a/src/Factoids/Core.pl b/src/Factoids/Core.pl index d8d559a..e33685c 100644 --- a/src/Factoids/Core.pl +++ b/src/Factoids/Core.pl @@ -5,7 +5,11 @@ # Created: 20010906 # -if (&IsParam("useStrict")) { use strict; } +# use strict; # TODO + +use vars qw(%param %cache %lang %cmdstats %bots); +use vars qw($message $who $addressed $chan $h $nuh $ident $msgType + $correction_plausable); # Usage: &validFactoid($lhs,$rhs); sub validFactoid { @@ -33,7 +37,6 @@ sub validFactoid { /^learn / and last; # teach. damn morons. /^tell (\S+) about / and last; # tell. /\=\~/ and last; # substituition. - /^\S+ to \S+ \S+/ and last; # babelfish. /^\=/ and last; # botnick = heh is. /wants you to know/ and last; @@ -145,89 +148,138 @@ sub FactoidStuff { $faqtoid =~ tr/A-Z/a-z/; my $result = &getFactoid($faqtoid); - if (defined $result) { - my $author = &getFactInfo($faqtoid, "created_by"); - my $count = &getFactInfo($faqtoid, "requested_count") || 0; - my $limit = &getChanConfDefault("factoidPreventForgetLimit", - 100, $chan); + # if it doesn't exist, well... it doesn't! + if (!defined $result) { + &performReply("i didn't have anything called '$faqtoid' to forget"); + return; + } - if (IsFlag("r") ne "r") { - &msg($who, "you don't have access to remove factoids"); - return; - } + # TODO: squeeze 3 getFactInfo calls into one? + my $author = &getFactInfo($faqtoid, "created_by"); + my $count = &getFactInfo($faqtoid, "requested_count") || 0; + # don't delete if requested $limit times + my $limit = &getChanConfDefault('factoidPreventForgetLimit', 100, $chan); + # don't delete if older than $limitage seconds (modified by requests below) + my $limitage = &getChanConfDefault('factoidPreventForgetLimitTime', 7 * 24 * 60 * 60, $chan); + my $t = &getFactInfo($faqtoid, "created_time") || 0; + my $age = time() - $t; + + # lets scale limitage from 1 (nearly 0) to $limit (full time). + $limitage = $limitage*($count+1)/$limit if ($count < $limit); + # isauthor and isop. + my $isau = (defined $author and &IsHostMatch($author) == 2) ? 1 : 0; + my $isop = (&IsFlag("o") eq "o") ? 1 : 0; + + if (IsFlag("r") ne "r" && !$isop) { + &msg($who, "you don't have access to remove factoids"); + return; + } - return 'locked factoid' if (&IsLocked($faqtoid) == 1); + return 'locked factoid' if (&IsLocked($faqtoid) == 1); - # factoidPreventForgetLimit: - if ($limit and $count > $limit and (&IsFlag("o") ne "o")) { - &msg($who, "will not delete '$faqtoid', count > limit ($count > $limit)"); - return; - } + ### + ### lets go do some checking. + ### - # prevent/minimize abuse. - my $faqauth = &getFactInfo($faqtoid, "created_by"); - if (&IsFlag("o") ne "o" and &IsHostMatch($faqauth) != 2) { - $cache{forget}{$h}++; + # factoidPreventForgetLimitTime: + if (!($isop or $isau) and $age/(60*60*24) > $limitage) { + &msg($who, "cannot remove factoid '$faqtoid', too old. (" . + $age/(60*60*24) . ">$limitage) use 'no,' instead"); + return; + } - # warn. - if ($cache{forget}{$h} > 3) { - &msg($who, "Stop abusing forget!"); - } + # factoidPreventForgetLimit: + if (!($isop or $isau) and $limit and $count > $limit) { + &msg($who, "will not delete '$faqtoid', count > limit ($count > $limit) use 'no, ' instead."); + return; + } - # ignore. - # todo: make forget limit configurable. - # todo: make forget ignore time configurable. - if ($cache{forget}{$h} > 5) { - &ignoreAdd(&makeHostMask($nuh), "*", 3*24*60*60, "abuse of forget"); - &msg($who, "forget: Suck it!"); - } + # this may eat some memory. + # prevent deletion if other factoids redirect to it. + # TODO: use hash instead of array. + my @list; + if (&getChanConf("factoidPreventForgetRedirect")) { + &status("Factoids/Core: forget: checking for redirect factoids"); + @list = &searchTable("factoids", "factoid_key", + "factoid_value", "^ see "); + } + + my $match = 0; + for (@list) { + my $f = $_; + my $v = &getFactInfo($f, "factoid_value"); + my $fsafe = quotemeta($faqtoid); + next unless ($v =~ /^ ?see( also)? $fsafe\.?$/i); + + &DEBUG("Factoids/Core: match! ($f || $faqtoid)"); + + $match++; + } + # TODO: warn for op aswell, but allow force delete. + if (!$isop and $match) { + &msg($who, "uhm, other (redirection) factoids depend on this one."); + return; + } + + # minimize abuse. + if (!$isop and &IsHostMatch($author) != 2) { + $cache{forget}{$h}++; + + # warn. + if ($cache{forget}{$h} > 3) { + &msg($who, "Stop abusing forget!"); } - # lets do it! + # ignore. + # TODO: make forget limit configurable. + # TODO: make forget ignore time configurable. + if ($cache{forget}{$h} > 5) { + &ignoreAdd(&makeHostMask($nuh), "*", 3*24*60, "abuse of forget"); + &msg($who, "forget: Ignoring you for abuse!"); + } + } - if (&IsParam("factoidDeleteDelay") or &IsChanConf("factoidDeleteDelay")) { - if ($faqtoid =~ / #DEL#$/ and !&IsFlag("o")) { - &msg($who, "cannot delete it ($faqtoid)."); - return; - } + # lets do it! - &status("forgot (safe delete): '$faqtoid' - ". scalar(localtime)); - ### TODO: check if the "backup" exists and overwrite it - my $check = &getFactoid("$faqtoid #DEL#"); + if (&IsParam("factoidDeleteDelay") or &IsChanConf("factoidDeleteDelay") > 0) { + if (!($isop or $isau) and $faqtoid =~ / #DEL#$/) { + &msg($who, "cannot delete it ($faqtoid)."); + return; + } - if (!defined $check or $check =~ /^\s*$/) { - if ($faqtoid !~ / #DEL#$/) { - my $new = $faqtoid." #DEL#"; + &status("forgot (safe delete): '$faqtoid' - ". scalar(gmtime)); + ### TODO: check if the "backup" exists and overwrite it + my $check = &getFactoid("$faqtoid #DEL#"); - my $backup = &getFactoid($new); - if ($backup) { - &DEBUG("forget: not overwriting backup: $faqtoid"); - } else { - &status("forget: backing up '$faqtoid'"); - &setFactInfo($faqtoid, "factoid_key", $new); - &setFactInfo($new, "modified_by", $who); - &setFactInfo($new, "modified_time", time()); - } + if (!defined $check or $check =~ /^\s*$/) { + if ($faqtoid !~ / #DEL#$/) { + my $new = $faqtoid." #DEL#"; + my $backup = &getFactoid($new); + if ($backup) { + &DEBUG("forget: not overwriting backup: $faqtoid"); } else { - &status("forget: not backing up $faqtoid."); + &status("forget: backing up '$faqtoid'"); + &setFactInfo($faqtoid, "factoid_key", $new); + &setFactInfo($new, "modified_by", $who); + &setFactInfo($new, "modified_time", time()); } } else { - &status("forget: not overwriting backup!"); + &status("forget: not backing up $faqtoid."); } - } - &status("forget: <$who> '$faqtoid' =is=> '$result'"); - &delFactoid($faqtoid); + } else { + &status("forget: not overwriting backup!"); + } + } - &performReply("i forgot $faqtoid"); + &status("forget: <$who> '$faqtoid' =is=> '$result'"); + &delFactoid($faqtoid); - $count{'Update'}++; + &performReply("i forgot $faqtoid"); - } else { - &performReply("i didn't have anything called '$faqtoid'"); - } + $count{'Update'}++; return; } @@ -238,7 +290,7 @@ sub FactoidStuff { my $i = 0; $i++ if (&IsParam("factoidDeleteDelay")); - $i++ if (&IsChanConf("factoidDeleteDelay")); + $i++ if (&IsChanConf("factoidDeleteDelay") > 0); if (!$i) { &performReply("safe delete has been disable so what is there to undelete?"); return; @@ -246,7 +298,7 @@ sub FactoidStuff { my $faqtoid = $message; if ($faqtoid eq "") { - &help("undelete"); + &help("unforget"); return; } @@ -254,25 +306,28 @@ sub FactoidStuff { my $result = &getFactoid($faqtoid." #DEL#"); my $check = &getFactoid($faqtoid); - if (!defined $result) { - &performReply("that factoid was not backedup :/"); - return; - } - if (defined $check) { &performReply("cannot undeleted '$faqtoid' because it already exists!"); return; } - &setFactInfo($faqtoid." #DEL#", "factoid_key", $faqtoid); - - ### delete info. modified_ isn't really used. - &setFactInfo($faqtoid, "modified_by", ""); - &setFactInfo($faqtoid, "modified_time", 0); + if (!defined $result) { + &performReply("that factoid was not backedup :/"); + return; + } - &performReply("Successfully recovered '$faqtoid'. Have fun now."); + &setFactInfo($faqtoid." #DEL#", "factoid_key", $faqtoid); +# &setFactInfo($faqtoid, "modified_by", ""); +# &setFactInfo($faqtoid, "modified_time", 0); - $count{'Undelete'}++; + $check = &getFactoid($faqtoid); + # TODO: check if $faqtoid." #DEL#" exists? + if (defined $check) { + &performReply("Successfully recovered '$faqtoid'. Have fun now."); + $count{'Undelete'}++; + } else { + &performReply("did not recover '$faqtoid'. What happened?"); + } return; } @@ -320,29 +375,29 @@ sub FactoidStuff { } if ($message =~ /^'(.*)'\s+'(.*)'$/) { - my($from,$to) = (lc $1, lc $2); + my ($from,$to) = (lc $1, lc $2); my $result = &getFactoid($from); - if (defined $result) { - my $author = &getFactInfo($from, "created_by"); + if (!defined $result) { + &performReply("i didn't have anything called '$from' to rename"); + return; + } - if (0 and !&IsFlag("m") or $author !~ /^\Q$who\E\!/i) { - &msg($who, "It's not yours to modify."); - return; - } + # who == nick!user@host. + if (&IsFlag("m") ne "m" and $author !~ /^\Q$who\E\!/i) { + &msg($who, "factoid '$from' is not yours to modify."); + return; + } - if ($_ = &getFactoid($to)) { - &performReply("destination factoid already exists."); - return; - } + if ($_ = &getFactoid($to)) { + &performReply("destination factoid already exists."); + return; + } - &setFactInfo($from,"factoid_key",$to); + &setFactInfo($from,"factoid_key",$to); - &status("rename: <$who> '$from' is now '$to'"); - &performReply("i renamed '$from' to '$to'"); - } else { - &performReply("i didn't have anything called '$from'"); - } + &status("rename: <$who> '$from' is now '$to'"); + &performReply("i renamed '$from' to '$to'"); } else { &msg($who,"error: wrong format. ask me about 'help rename'."); } @@ -372,11 +427,16 @@ sub FactoidStuff { &performReply("that's too long"); return; } + # empty + if (length $result == 0) { + &performReply("factoid would be empty. use forget?"); + return; + } # min length. my $faqauth = &getFactInfo($faqtoid, "created_by"); if ((length $result)*2 < length $was and &IsFlag("o") ne "o" and - &IsHostMask($faqauth) != 2 + &IsHostMatch($faqauth) != 2 ) { &performReply("too drastic change of factoid."); } @@ -388,7 +448,7 @@ sub FactoidStuff { &performReply("that doesn't contain '$op'"); } } else { - &performReply("i didn't have anything called '$faqtoid'"); + &performReply("i didn't have anything called '$faqtoid' to modify"); } return; @@ -437,8 +497,8 @@ sub FactoidStuff { if (defined $result and $result !~ /^0?$/) { # question. &status("question: <$who> $message"); $count{'Question'}++; - } elsif (&IsChanConf("perlMath") > 0 and $addressed) { # perl math. - &loadMyModule("perlMath"); + } elsif (&IsChanConf('Math') > 0 and $addressed) { # perl math. + &loadMyModule('Math'); my $newresult = &perlMath(); if (defined $newresult and $newresult ne "") { @@ -454,7 +514,7 @@ sub FactoidStuff { } # why would a friendly bot get passed here? - if (&IsParam("friendlyBots")) { + if (&IsParam('friendlyBots')) { return if (grep lc($_) eq lc($who), split(/\s+/, $param{'friendlyBots'})); } @@ -463,7 +523,7 @@ sub FactoidStuff { return; } - return unless ($addressed); + return unless ($addressed and !$addrchar); if (length $message > 64) { &status("unparseable-moron: $message");