Bot-Backbone
view release on metacpan or search on metacpan
lib/Bot/Backbone/Service/Role/SendPolicy.pm view on Meta::CPAN
with 'Bot::Backbone::Service::Role::Sender';
# ABSTRACT: Provides send policy framework to a service
has send_policy_name => (
is => 'ro',
isa => 'Str',
init_arg => 'send_policy',
predicate => 'has_send_policy',
);
has send_policy => (
is => 'ro',
does => 'Bot::Backbone::SendPolicy',
init_arg => undef,
lazy_build => 1,
# lazy_build implies (predicate => has_send_policy)
predicate => 'has_setup_the_send_policy',
);
sub _build_send_policy {
my $self = shift;
my $send_policy = $self->bot->meta->send_policies->{ $self->send_policy_name };
die "no such send policy as ", $self->send_policy_name, "\n"
unless defined $send_policy;
Bot::Backbone::SendPolicy::Aggregate->new(
bot => $self->bot,
config => $send_policy,
);
}
requires qw( send_message );
around send_message => sub {
my ($next, $self, $params) = @_;
my $send_policy_result = $params->{send_policy_result} // { allow => 1 };
my $send_policy = $params->{send_policy};
$send_policy_result->{after} //= 0;
_apply_send_policy($send_policy, $send_policy_result, $params)
if defined $send_policy;
_apply_send_policy($self->send_policy, $send_policy_result, $params)
if $self->has_send_policy;
return unless $send_policy_result->{allow};
# If this is a bare metal chat... then apply any required delay
if (($send_policy_result->{after} // 0) > 0
and $self->does('Bot::Backbone::Service::Role::BareMetalChat')) {
# Setting Timer
my $w = AnyEvent->timer(
after => $send_policy_result->{after},
cb => sub { $self->$next($params) },
);
$self->_enqueue_message($w);
return;
}
# Allowed and no delays... so GO!
$self->$next($params);
};
sub _apply_send_policy {
my ($send_policy, $send_policy_result, $options) = @_;
my $new_result = $send_policy->allow_send($options);
$send_policy_result->{allow} &&= $new_result->{allow};
$send_policy_result->{after} = $new_result->{after}
if ($new_result->{after} // 0) > $send_policy_result->{after};
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Bot::Backbone::Service::Role::SendPolicy - Provides send policy framework to a service
=head1 VERSION
version 0.161950
=head1 SYNOPSIS
package Bot::Backbone::Service::RandomGibberish;
use v5.14;
use Bot::Backbone::Service;
with qw(
Bot::Backbone::Service::Role::Service
Bot::Backbone::Service::Role::SendPolicy
);
use List::Util qw( shuffle );
# Post to a random chat
sub send_message {
my ($self, $params) = @_;
my @chats = grep { $_->does('Bot::Backbone::Service::Role::Chat') }
$self->bot->list_services;
( run in 1.376 second using v1.01-cache-2.11-cpan-e1769b4cff6 )