mirror of
https://github.com/perlbot/perlbuut
synced 2025-06-07 11:55:42 -04:00
add new factgrep command for factoids
This commit is contained in:
parent
6a029a042b
commit
1e5ef77011
2 changed files with 91 additions and 1 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -17,3 +17,4 @@ langs/
|
||||||
*.swp
|
*.swp
|
||||||
*.LOG
|
*.LOG
|
||||||
*.bak
|
*.bak
|
||||||
|
bigshit.sh
|
||||||
|
|
|
@ -9,6 +9,7 @@ use IRC::Utils qw/lc_irc strip_color strip_formatting/;
|
||||||
use Text::Metaphone;
|
use Text::Metaphone;
|
||||||
use strict;
|
use strict;
|
||||||
use Encode qw/decode/;
|
use Encode qw/decode/;
|
||||||
|
use JSON::MaybeXS qw/encode_json/;
|
||||||
|
|
||||||
use Data::Dumper;
|
use Data::Dumper;
|
||||||
use List::Util qw/min max/;
|
use List::Util qw/min max/;
|
||||||
|
@ -52,6 +53,8 @@ my %commandhash = (
|
||||||
"protect" => \&get_fact_protect,
|
"protect" => \&get_fact_protect,
|
||||||
"unprotect" => \&get_fact_unprotect,
|
"unprotect" => \&get_fact_unprotect,
|
||||||
"substitute" => \&get_fact_substitute,
|
"substitute" => \&get_fact_substitute,
|
||||||
|
"nchain" => \&get_fact_namespace_chain,
|
||||||
|
"factgrep" => \&get_fact_grep,
|
||||||
);
|
);
|
||||||
|
|
||||||
my $commands_re = join '|', keys %commandhash;
|
my $commands_re = join '|', keys %commandhash;
|
||||||
|
@ -188,7 +191,7 @@ sub sub_command ($self, $said, $pm) {
|
||||||
|
|
||||||
my $fact_string; # used to capture return values
|
my $fact_string; # used to capture return values
|
||||||
|
|
||||||
if (!$call_only && $subject =~ s/^\s*($commands_re)\s+//) {
|
if (!$call_only && $subject =~ s/^\s*($commands_re)\s*//) {
|
||||||
$fact_string =
|
$fact_string =
|
||||||
$commandhash{$1}->($self, $subject, $said->{name}, $said);
|
$commandhash{$1}->($self, $subject, $said->{name}, $said);
|
||||||
} elsif (($subject =~ m{\w\s*=~\s*s /.+ / .* /[gi]*\s*$}ix)
|
} elsif (($subject =~ m{\w\s*=~\s*s /.+ / .* /[gi]*\s*$}ix)
|
||||||
|
@ -703,6 +706,91 @@ SELECT ts_rank(full_document_tsvector, websearch_to_tsquery('factoid', ?)) AS ra
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub get_fact_namespace_chain ($self, $body, $name, $said) {
|
||||||
|
local $said->{channel} = $said->{channel};
|
||||||
|
if ($body) {
|
||||||
|
$said->{channel} = $body;
|
||||||
|
}
|
||||||
|
|
||||||
|
my ($server, $namespace) = $self->get_namespace($said);
|
||||||
|
print STDERR "XXX: $body $said->{channel} $server $namespace\n";
|
||||||
|
|
||||||
|
#XXX: need to also search contents of factoids TODO
|
||||||
|
my $results = $self->dbh->selectall_arrayref("
|
||||||
|
WITH RECURSIVE factoid_lookup_order_inner (depth, namespace, server, alias_namespace, alias_server, parent_namespace, parent_server, recursive, gen_server, gen_namespace) AS (
|
||||||
|
SELECT 0 AS depth, namespace, server, alias_namespace, alias_server, parent_namespace, parent_server, recursive, generated_server, generated_namespace
|
||||||
|
FROM factoid_config
|
||||||
|
WHERE namespace = ? AND server = ?
|
||||||
|
UNION ALL
|
||||||
|
SELECT p.depth+1 AS depth, m.namespace, m.server, m.alias_namespace, m.alias_server, m.parent_namespace, m.parent_server, m.recursive, m.generated_server, m.generated_namespace
|
||||||
|
FROM factoid_config m
|
||||||
|
INNER JOIN factoid_lookup_order_inner p
|
||||||
|
ON m.namespace = p.parent_namespace AND m.server = p.parent_server AND p.recursive
|
||||||
|
)
|
||||||
|
SELECT depth, namespace, server FROM factoid_lookup_order_inner
|
||||||
|
", { Slice => {} }, $namespace, $server);
|
||||||
|
|
||||||
|
print STDERR "XXX: $body $said->{channel} $server $namespace\n";
|
||||||
|
print STDERR Dumper($results);
|
||||||
|
|
||||||
|
my $return = join ' -> ', map {sprintf "%d. <%s:%s>", $_->{depth}+1, $_->{server}||"*", $_->{namespace}||"##NULL"} $results->@*;
|
||||||
|
|
||||||
|
$return ||= "<$server:$namespace>"; # default namespace display
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_fact_grep ($self, $body, $name, $said) {
|
||||||
|
my ($aliasserver, $aliasnamespace) = $self->get_alias_namespace($said);
|
||||||
|
my ($server, $namespace) = $self->get_namespace($said);
|
||||||
|
|
||||||
|
my $results;
|
||||||
|
|
||||||
|
my $value_only = $body =~ s/\s*--val\s+//;
|
||||||
|
|
||||||
|
#XXX: need to also search contents of factoids TODO
|
||||||
|
$results = $self->dbh->selectall_arrayref("
|
||||||
|
WITH RECURSIVE factoid_lookup_order_inner (depth, namespace, server, alias_namespace, alias_server, parent_namespace, parent_server, recursive, gen_server, gen_namespace) AS (
|
||||||
|
SELECT 0 AS depth, namespace, server, alias_namespace, alias_server, parent_namespace, parent_server, recursive, generated_server, generated_namespace
|
||||||
|
FROM factoid_config
|
||||||
|
WHERE namespace = ? AND server = ?
|
||||||
|
UNION ALL
|
||||||
|
SELECT p.depth+1 AS depth, m.namespace, m.server, m.alias_namespace, m.alias_server, m.parent_namespace, m.parent_server, m.recursive, m.generated_server, m.generated_namespace
|
||||||
|
FROM factoid_config m
|
||||||
|
INNER JOIN factoid_lookup_order_inner p
|
||||||
|
ON m.namespace = p.parent_namespace AND m.server = p.parent_server AND p.recursive
|
||||||
|
),
|
||||||
|
factoid_lookup_order (depth, namespace, server, alias_namespace, alias_server, parent_namespace, parent_server, recursive, gen_server, gen_namespace) AS (
|
||||||
|
SELECT * FROM factoid_lookup_order_inner
|
||||||
|
UNION ALL
|
||||||
|
SELECT 0, '', '', NULL, NULL, NULL, NULL, false, '', '' WHERE NOT EXISTS (table factoid_lookup_order_inner)
|
||||||
|
),
|
||||||
|
get_latest_factoid (depth, factoid_id, subject, copula, predicate, author, modified_time, compose_macro, protected, original_subject, deleted, server, namespace) AS (
|
||||||
|
SELECT lo.depth, factoid_id, subject, copula, predicate, author, modified_time, compose_macro, protected, original_subject, f.deleted, f.server, f.namespace
|
||||||
|
FROM factoid f
|
||||||
|
INNER JOIN factoid_lookup_order lo
|
||||||
|
ON f.generated_server = lo.gen_server
|
||||||
|
AND f.generated_namespace = lo.gen_namespace
|
||||||
|
WHERE original_subject ~* ?
|
||||||
|
ORDER BY depth ASC, factoid_id DESC
|
||||||
|
)
|
||||||
|
SELECT DISTINCT ON(original_subject) original_subject, predicate FROM get_latest_factoid WHERE NOT deleted ORDER BY original_subject ASC, depth ASC, factoid_id DESC",
|
||||||
|
{ Slice => {} },
|
||||||
|
$namespace, $server,
|
||||||
|
$body,
|
||||||
|
);
|
||||||
|
|
||||||
|
print STDERR "Got results: ".Dumper($results);
|
||||||
|
|
||||||
|
if ($results and @$results) {
|
||||||
|
my $ret_string = encode_json([map {$value_only ? $_->{predicate} : $_->{original_subject}} @$results]);
|
||||||
|
|
||||||
|
return $ret_string;
|
||||||
|
} else {
|
||||||
|
return "[]";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
sub get_fact_oldsearch ($self, $body, $name, $said) {
|
sub get_fact_oldsearch ($self, $body, $name, $said) {
|
||||||
my ($aliasserver, $aliasnamespace) = $self->get_alias_namespace($said);
|
my ($aliasserver, $aliasnamespace) = $self->get_alias_namespace($said);
|
||||||
my ($server, $namespace) = $self->get_namespace($said);
|
my ($server, $namespace) = $self->get_namespace($said);
|
||||||
|
@ -1038,6 +1126,7 @@ sub set_last_rendered($self, $fact, $ret) {
|
||||||
# TODO trigger FTS update?
|
# TODO trigger FTS update?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
no warnings 'void';
|
no warnings 'void';
|
||||||
"Bot::BB3::Plugin::Factoids";
|
"Bot::BB3::Plugin::Factoids";
|
||||||
__DATA__
|
__DATA__
|
||||||
|
|
Loading…
Add table
Reference in a new issue