App-RoboBot

 view release on metacpan or  search on metacpan

lib/App/RoboBot/Plugin/Bot/Autoreply.pm  view on Meta::CPAN


            $message->response->push(
                $reply->{'response'}->evaluate($check_message, {})
            );
        }
    }
}

sub autoreply_create {
    my ($self, $message, $command, $rpl, $name, $condition, $response) = @_;

    unless (defined $name && defined $condition && defined $response) {
        $message->response->raise('Must provide an autoreplier name, condition expression, and response expression.');
        return;
    }

    if (blessed($name) && $name->can('evaluate')) {
        $name = $name->evaluate($message, $rpl);

        if (ref($name)) {
            $message->response->raise('Autoreplier name expression must evaluate to a string.');
            return;
        }
    } else {
        $name = "$name";
    }

    if (ref($name) || $name !~ m{\w+}) {
        $message->response->raise('Must provide an autoreplier name.');
        return;
    }

    unless (blessed($condition) && $condition->can('evaluate')) {
        $message->response->raise('Must provide an expression for the autoreply condition.');
        return;
    }

    unless (blessed($response) && $response->can('evaluate')) {
        $message->response->raise('Must provide an expression for the autoreply response.');
        return;
    }

    $condition->quoted(0);
    $response->quoted(0);

    $self->log->debug(sprintf('Attempting to update autoreplier with name %s in %s on network %s.',
        $name, $message->channel->name, $message->network->name));

    my $res = $self->bot->config->db->do(q{
        update autoreply_autoreplies set ??? where channel_id = ? and name = ? returning *
    }, {
        condition  => $condition->flatten,
        response   => $response->flatten,
        created_by => $message->sender->id,
        created_at => 'now',
    }, $message->channel->id, $name);

    if ($res && $res->next) {
        $self->log->debug('Autoreplier update successful.');

        $message->response->push(sprintf('Autoreply %s has been updated.', $name));
    } else {
        $self->log->debug(sprintf('No existing autoreplier to update. Creating new record.'));

        $res = $self->bot->config->db->do(q{
            insert into autoreply_autoreplies ??? returning *
        }, {
            channel_id  => $message->channel->id,
            name        => lc($name),
            condition   => $condition->flatten,
            response    => $response->flatten,
            created_by  => $message->sender->id,
        });

        if ($res && $res->next) {
            $message->response->push(sprintf('Autoreply %s has been added.', $name));
        } else {
            $self->log->error(sprintf('Could not create autoreplier record: %s', $res->error));

            $message->response->raise('Could not create the autoresponse. Please check your arguments and try again.');
            return;
        }
    }

    $self->log->debug(sprintf('Caching new/updated autoreplier %s.', $name));

    $self->reply_cache->{$message->channel->id}{lc($name)} = {
        condition   => $condition,
        response    => $response,
    };

    return;
}

sub autoreply_list {
    my ($self, $message, $command, $rpl) = @_;

    unless ($message->has_channel) {
        $message->response->raise('Autoreplies may only be used in channels.');
        return;
    }

    my $res = $self->bot->config->db->do(q{
        select name from autoreply_autoreplies where channel_id = ? order by name asc
    }, $message->channel->id);

    my @replies;

    if ($res) {
        while ($res->next) {
            push(@replies, $res->[0]);
        }
    }

    if (@replies > 0) {
        return @replies;
    } else {
        $message->response->raise('There are no autoreplies configured for this channel. Use (autoreply) to create one.');
        return;
    }
}

sub autoreply_delete {
    my ($self, $message, $command, $rpl, $name) = @_;

    unless (defined $name && $name =~ m{\w+}) {
        $message->response->raise('Must provide the name of an autoreply to display.');
        return;
    }

    unless ($message->has_channel) {
        $message->response->raise('Autoreplies may only be used in channels.');
        return;
    }

    my $res = $self->bot->config->db->do(q{
        delete from autoreply_autoreplies where channel_id = ? and lower(name) = lower(?) returning *
    }, $message->channel->id, $name);

    if ($res && $res->next) {
        $message->response->push(sprintf('The autoreply %s has been deleted from this channel.', $name));
    } else {
        $message->response->raise('There was no autoreply named %s configured for this channel for me to delete.', $name);
    }



( run in 0.559 second using v1.01-cache-2.11-cpan-39bf76dae61 )