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 )