App-RoboBot
view release on metacpan or search on metacpan
lib/App/RoboBot/Plugin/Fun/Factoid.pm view on Meta::CPAN
return unless $message->raw =~ m{^\s*${bot_name}[:,]?\s+(?:what|who|where|when|why|how|is|are)\s+(.+)\?\s*$}i;
my $query = lc($1);
my $res = $self->bot->config->db->do(q{
select id, name, factoid, ts_rank_cd(terms, query) as rank
from factoids,
plainto_tsquery(?) query
where network_id = ?
and query @@ terms
order by rank desc
}, $query, $message->network->id);
# Silently return the pre-hook if there wasn't at least one matching factoid.
return unless $res && $res->next;
$message->response->push(
sprintf('*%s*:', $res->{'name'}),
$res->{'factoid'},
);
my @extras;
# If there were other factoids that matches, gather up their names and IDs
# to display after the highest ranked factoid.
while ($res->next) {
push(@extras, { id => $res->{'id'}, name => $res->{'name'} });
}
if (@extras > 0) {
$message->response->push(sprintf('Additional factoids matched: %s',
join(', ', map { sprintf('%s', $_->{'name'}) } @extras),
));
}
return;
}
sub add_factoid {
my ($self, $message, $command, $rpl, $name, @factoids) = @_;
return unless defined $name && @factoids && @factoids > 0;
$name = $self->_normalize_name($name);
return unless defined $name && length($name) > 0;
my $fact_body = join("\n", @factoids);
my $res = $self->bot->config->db->do(q{
select *
from factoids
where network_id = ? and lower(name) = lower(?)
}, $message->network->id, $name);
if ($res && $res->next) {
$res = $self->bot->config->db->do(q{
update factoids
set name = ?,
factoid = ?,
terms = setweight(to_tsvector(?), 'A') || setweight(to_tsvector(?), 'B'),
updated_by = ?,
updated_at = now()
where id = ?
returning *
}, $name, $fact_body, $name, $fact_body, $message->sender->id, $res->{'id'});
if ($res && $res->next) {
$message->response->push(sprintf('Factoid %s (%d) updated.', $res->{'name'}, $res->{'id'}));
} else {
$message->response->raise('Could not update existing factoid. Please try again.');
}
} else {
$res = $self->bot->config->db->do(q{
insert into factoids (network_id, name, factoid, created_by, terms) values
(?, ?, ?, ?, setweight(to_tsvector(?), 'A') || setweight(to_tsvector(?), 'B'))
returning *
}, $message->network->id, $name, $fact_body, $message->sender->id, $name, $fact_body);
if ($res && $res->next) {
$message->response->push(sprintf('Factoid %s (%d) has been saved.', $res->{'name'}, $res->{'id'}));
} else {
$message->response->raise('Could not create factoid. Please try again.');
}
}
return;
}
sub remove_factoid {
my ($self, $message, $command, $rpl, $name) = @_;
return unless defined $name;
$name = $self->_normalize_name($name);
return unless defined $name && length($name) > 0;
my $res = $self->bot->config->db->do(q{
delete from factoids where network_id = ? and lower(name) = lower(?)
}, $message->network->id, $name);
if ($res && $res->count > 0) {
$message->response->push(sprintf('Factoid %s has been deleted.', $name));
} else {
$message->response->raise('Could not delete requested factoid. Please check the factoid name and try again.');
}
return;
}
sub _normalize_name {
my ($self, $name) = @_;
return unless defined $name && $name =~ m{\w+};
$name =~ s{(^\s+|\s+$)}{}gs;
$name =~ s{\s+}{ }gs;
return lc($name);
}
__PACKAGE__->meta->make_immutable;
1;
( run in 1.837 second using v1.01-cache-2.11-cpan-39bf76dae61 )