# rhs - factoid message.
##
-if (&IsParam("useStrict")) { use strict; }
+# use strict; # TODO
+use POSIX qw(strftime);
use vars qw($msgType $uh $lastWho $ident);
use vars qw(%lang %lastWho);
sub getReply {
my($message) = @_;
my($lhs,$mhs,$rhs);
- my($result,$reply);
+ my($reply, $count, $fauthor, $result, $factoid, $search, @searches);
$orig{message} = $message;
if (!defined $message or $message =~ /^\s*$/) {
$message =~ tr/A-Z/a-z/;
- if ($result = &getFactoid($message)) {
+ @searches = split(/\s+/, &getChanConfDefault('factoidSearch', '_default', $chan));
+ &::DEBUG("factoidSearch: $chan is: " . join(':', @searches));
+ # requesting the _default one, ignore factoidSearch
+ if ($message =~ /^_default\s+/) {
+ @searches = ('_default');
+ $message =~ s/^_default\s+//;
+ }
+
+ # check for factoids with each prefix
+ foreach $search (@searches) {
+ if ($search eq '$chan') {
+ $factoid = "$chan $message";
+ } elsif ($search eq '_default') {
+ $factoid = $message;
+ } else {
+ $factoid = "$search $message";
+ }
+ ($count, $fauthor, $result) = &sqlSelect('factoids',
+ "requested_count,created_by,factoid_value",
+ { factoid_key => $factoid }
+ );
+ last if ($result);
+ }
+
+ if ($result) {
$lhs = $message;
- $mhs = "is";
+ $mhs = 'is';
$rhs = $result;
- return "$lhs $mhs $rhs" if ($literal);
+ return "\"$factoid\" $mhs \"$rhs\"" if ($literal);
} else {
return '';
}
$result =~ s/^\s*//;
}
- my $fauthor = &dbGet("factoids", "created_by", "factoid_key=".&dbQuote($message) );
$result = &SARit($result);
$reply = $result;
- if ($result ne "") {
+ if ($result ne '') {
### AT LAST, REPEAT PREVENTION CODE REMOVED IN FAVOUR OF GLOBAL
### FLOOD REPETION AND PROTECTION. -20000124
# stats code.
- ### FIXME: old mysql doesn't support
+ ### FIXME: old mysql/sqlite doesn't support
### "requested_count=requested_count+1".
- my $count = &getFactInfo($lhs,"requested_count") || 0;
$count++;
- ### BROKEN!!!
- if (1) { # old code.
- &setFactInfo($lhs,"requested_by", $nuh);
- &setFactInfo($lhs,"requested_time", time());
- &setFactInfo($lhs,"requested_count", $count);
- } else {
- &dbReplace("factoids", (
- factoid_key => $lhs,
+ &sqlSet('factoids', {'factoid_key' => $factoid}, {
requested_by => $nuh,
requested_time => time(),
requested_count => $count
- ) );
- }
+ } );
- # todo: rename $real to something else!
+ # TODO: rename $real to something else!
my $real = 0;
-# my $author = &getFactInfo($lhs,"created_by") || '';
+# my $author = &getFactInfo($lhs,'created_by') || '';
# $real++ if ($author =~ /^\Q$who\E\!/);
-# $real++ if (&IsFlag("n"));
+# $real++ if (&IsFlag('n'));
$real = 0 if ($msgType =~ /public/);
### fix up the reply.
### bot->person reply.
# result is random if separated by '||'.
# rhs is full factoid with '||'.
- if ($mhs eq "is") {
+ if ($mhs eq 'is') {
$reply = &getRandom(keys %{ $lang{'factoid'} });
$reply =~ s/##KEY/$lhs/;
$reply =~ s/##VALUE/$result/;
}
}
- return $reply if ($literal);
-
# remove excessive beginning and end whitespaces.
$reply =~ s/^\s+|\s+$//g;
### $ SUBSTITUTION.
###
-# &DEBUG("Reply: reply => $reply");
- $reply = &substVars($reply,1);
-# &DEBUG("Reply: reply => $reply");
+ # don't evaluate if it has factoid arguments.
+# if ($message =~ /^cmd:/i) {
+# &status("Reply: not doing substVars (eval dollar vars)");
+# } else {
+ $reply = &substVars($reply,1);
+# }
$reply;
}
foreach (split //, $string) {
if ($_ eq "(") {
-### print "( l=>$l, r=>$r\n";
-
if (!$l and !$r) {
-# print "STARTING at $i\n";
$s = $i;
$t = $i;
}
}
if ($_ eq ")") {
-### print ") l=>$l, r=>$r\n";
-
$r++;
$l--;
if (!$l and !$r) {
my $substr = substr($old,$s,$i-$s+1);
-# print "STOP at $i $substr\n";
push(@rand, substr($old,$t+1,$i-$t-1) );
my $rand = $rand[rand @rand];
- &status("SARing '$substr' to '$rand'.");
+# &status("SARing '$substr' to '$rand'.");
$string =~ s/\Q$substr\E/$rand/;
undef @rand;
}
}
if ($_ eq "|" and $l+$r== 0 and $l==1) {
-# print "| at $i (l=>$l,r=>$r)\n";
push(@rand, substr($old,$t+1,$i-$t-1) );
$t = $i;
}
}
&status("Reply.pl: $done SARs done.") if ($done);
+ # <URL></URL> type
+ #
+ while ($txt =~ /<URL>(.*)<\/URL>/){
+ &status("we have to norm this <URL></URL> stuff, SARing");
+ my $foobar = $1;
+ if ($foobar =~ m/(http:\/\/[^?]+)\?(.*)/){
+ my ($pig1,$pig2) = ($1,$2);
+ &status("SARing using URLencode");
+ $pig2=~s/([^\w])/sprintf("%%%02x",ord($1))/gie;
+ $foobar=$pig1."?".$pig2;
+ }
+ $txt =~ s/<URL>(.*)<\/URL>/$foobar/;
+ }
return $txt;
}
sub substVars {
my($reply,$flag) = @_;
- # $date, $time.
- my $date = scalar(localtime());
- $date =~ s/\:\d+(\s+\w+)\s+\d+$/$1/;
+ # $date, $time, $day.
+ # TODO: support localtime.
+ my $date = strftime("%Y.%m.%d", gmtime());
$reply =~ s/\$date/$date/gi;
- $date =~ s/\w+\s+\w+\s+\d+\s+//;
- $reply =~ s/\$time/$date/gi;
+ my $time = strftime("%k:%M:%S", gmtime());
+ $reply =~ s/\$time/$time/gi;
+ my $day = strftime("%A", gmtime());
+ $reply =~ s/\$day/$day/gi;
+
+ # support $ident when I have multiple nicks
+ my $mynick = $conn->nick() if $conn;
# dollar variables.
if ($flag) {
if ($reply =~ /\$rand/) {
my $rand = rand();
- my $randp = int($rand*100);
- $reply =~ s/\$randpercentage/$randp/g; # ???
- # randnick.
+
+ # $randnick.
if ($reply =~ /\$randnick/) {
my @nicks = keys %{ $channels{$chan}{''} };
my $randnick = $nicks[ int($rand*$#nicks) ];
- s/\$randnick/$randnick/;
+ $reply =~ s/\$randnick/$randnick/g;
}
- ### TODO: number of digits. 'x.y'
- if ($reply =~ /\$rand(\d+)/) {
- # will this work as it does in C?
- $rand = sprintf("%*f", $1, $rand);
+ # eg: $rand100.3
+ if ($reply =~ /\$rand(\d+)(\.(\d+))?/) {
+ my $max = $1;
+ my $dot = $3 || 0;
+ my $orig = $&;
+ #&DEBUG("dot => $dot, max => $max, rand=>$rand");
+ $rand = sprintf("%.*f", $dot, $rand*$max);
+
+ &DEBUG("swapping $orig to $rand");
+ $reply =~ s/\Q$orig\E/$rand/eg;
+ } else {
+ $reply =~ s/\$rand/$rand/g;
}
- $reply =~ s/\$rand/$rand/g;
}
- $reply =~ s/\$ident/$ident/g;
+ $reply =~ s/\$ident/$mynick/g;
if ($reply =~ /\$startTime/) {
- my $time = scalar(localtime $^T);
+ my $time = scalar(gmtime $^T);
$reply =~ s/\$startTime/$time/;
}
}
if ($reply =~ /\$factoids/) {
- my $count = &countKeys("factoids");
+ my $factoids = &countKeys('factoids');
$reply =~ s/\$factoids/$factoids/;
}
if ($reply =~ /\$Fupdate/) {
my $x = "\002$count{'Update'}\002 ".
- &fixPlural("modification", $count{'Update'});
+ &fixPlural('modification', $count{'Update'});
$reply =~ s/\$Fupdate/$x/;
}
if ($reply =~ /\$Fquestion/) {
my $x = "\002$count{'Question'}\002 ".
- &fixPlural("question", $count{'Question'});
+ &fixPlural('question', $count{'Question'});
$reply =~ s/\$Fquestion/$x/;
}
if ($reply =~ /\$Fdunno/) {
my $x = "\002$count{'Dunno'}\002 ".
- &fixPlural("dunno", $count{'Dunno'});
+ &fixPlural('dunno', $count{'Dunno'});
$reply =~ s/\$Fdunno/$x/;
}