Renaming to DoctorKarma.
This commit is contained in:
parent
7199804655
commit
1cc0432e97
@ -1,6 +1,6 @@
|
|||||||
use ExtUtils::MakeMaker;
|
use ExtUtils::MakeMaker;
|
||||||
WriteMakefile(
|
WriteMakefile(
|
||||||
NAME => 'DoctorAgustin',
|
NAME => 'DoctorKarma',
|
||||||
VERSION => '0.1',
|
VERSION => '0.1',
|
||||||
INST_SCRIPT => './bin',
|
INST_SCRIPT => './bin',
|
||||||
INST_BIN => './bin',
|
INST_BIN => './bin',
|
||||||
|
@ -8,14 +8,14 @@ use warnings;
|
|||||||
use Data::Dumper;
|
use Data::Dumper;
|
||||||
use JSON;
|
use JSON;
|
||||||
|
|
||||||
use DoctorAgustin::Config;
|
use DoctorKarma::Config;
|
||||||
use DoctorAgustin::Telegram;
|
use DoctorKarma::Telegram;
|
||||||
use DoctorAgustin::Logger;
|
use DoctorKarma::Logger;
|
||||||
|
|
||||||
my $config = DoctorAgustin::Config->new;
|
my $config = DoctorKarma::Config->new;
|
||||||
my $logger = DoctorAgustin::Logger->new;
|
my $logger = DoctorKarma::Logger->new;
|
||||||
my $telegram =
|
my $telegram =
|
||||||
DoctorAgustin::Telegram->new( telegram_token => $config->telegram_token );
|
DoctorKarma::Telegram->new( telegram_token => $config->telegram_token );
|
||||||
while (1) {
|
while (1) {
|
||||||
my $updates = $telegram->get_updates;
|
my $updates = $telegram->get_updates;
|
||||||
for my $update ($updates->@*) {
|
for my $update ($updates->@*) {
|
||||||
|
@ -1,88 +0,0 @@
|
|||||||
package DoctorAgustin::Config;
|
|
||||||
|
|
||||||
use v5.30.0;
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use warnings;
|
|
||||||
|
|
||||||
use Term::ReadLine;
|
|
||||||
|
|
||||||
use Const::Fast;
|
|
||||||
use JSON;
|
|
||||||
use Path::Tiny;
|
|
||||||
|
|
||||||
use DoctorAgustin::Logger;
|
|
||||||
|
|
||||||
sub HOME { $ENV{HOME} }
|
|
||||||
sub CONFIG_DIR { "@{[HOME]}/.config/doctoragustin" }
|
|
||||||
sub CONFIG_FILE { "@{[CONFIG_DIR]}/config.json" }
|
|
||||||
|
|
||||||
sub new {
|
|
||||||
my $class = shift;
|
|
||||||
my $self = bless {}, $class;
|
|
||||||
$self->_create_config_file_if_not_exists;
|
|
||||||
return $self;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub logger {
|
|
||||||
my $self = shift;
|
|
||||||
if ( !defined $self->{logger} ) {
|
|
||||||
my $logger = DoctorAgustin::Logger->new;
|
|
||||||
$self->{logger} = $logger;
|
|
||||||
}
|
|
||||||
return $self->{logger};
|
|
||||||
}
|
|
||||||
|
|
||||||
sub _config {
|
|
||||||
my $self = shift;
|
|
||||||
if ( !defined $self->{config} ) {
|
|
||||||
if ( !-f CONFIG_FILE ) {
|
|
||||||
$self->logger->log_error(
|
|
||||||
qq(@{[CONFIG_FILE]} is not a plain file, unable to read config.)
|
|
||||||
);
|
|
||||||
die;
|
|
||||||
}
|
|
||||||
my $config = decode_json( path(CONFIG_FILE)->slurp_utf8 );
|
|
||||||
$self->{config} = $config;
|
|
||||||
}
|
|
||||||
return $self->{config};
|
|
||||||
}
|
|
||||||
|
|
||||||
sub telegram_token {
|
|
||||||
my $self = shift;
|
|
||||||
if ( !defined $self->{telegram_token} ) {
|
|
||||||
my $config = $self->_config;
|
|
||||||
$self->{telegram_token} = $config->{telegram_token};
|
|
||||||
}
|
|
||||||
return $self->{telegram_token};
|
|
||||||
}
|
|
||||||
|
|
||||||
sub _create_config_file_if_not_exists {
|
|
||||||
my $self = shift;
|
|
||||||
if ( !-e CONFIG_FILE ) {
|
|
||||||
$self->logger->log_info(q(Config file not detected));
|
|
||||||
$self->_create_config_file;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
sub _create_config_file {
|
|
||||||
my $self = shift;
|
|
||||||
my $logger = $self->logger;
|
|
||||||
if ( !-e CONFIG_DIR ) {
|
|
||||||
$logger->log_info(qq(Creating @{[CONFIG_DIR]}));
|
|
||||||
eval { path(CONFIG_DIR)->mkpath; };
|
|
||||||
if ($@) {
|
|
||||||
$logger->log_error(
|
|
||||||
qq(Unable to create directory @{[CONFIG_DIR]}: $@));
|
|
||||||
die;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
my $term = Term::ReadLine->new('Doctor Agustín');
|
|
||||||
my $token = $term->readline('Telegram token:');
|
|
||||||
my $config_contents = { telegram_token => $token };
|
|
||||||
$config_contents = encode_json($config_contents);
|
|
||||||
|
|
||||||
path(CONFIG_FILE)->spew_utf8($config_contents);
|
|
||||||
}
|
|
||||||
1;
|
|
@ -1,39 +0,0 @@
|
|||||||
package DoctorAgustin::Logger;
|
|
||||||
|
|
||||||
use Carp;
|
|
||||||
use Sys::Syslog;
|
|
||||||
|
|
||||||
sub new {
|
|
||||||
my $class = shift;
|
|
||||||
my $self = bless {}, $class;
|
|
||||||
return $self;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub _log {
|
|
||||||
my $self = shift;
|
|
||||||
my $level = shift;
|
|
||||||
my $message = shift;
|
|
||||||
my $critical = shift;
|
|
||||||
|
|
||||||
openlog ('Doctor Agustín: ', $critical ? '': 'perror', 'user');
|
|
||||||
syslog ($level, $message);
|
|
||||||
closelog();
|
|
||||||
}
|
|
||||||
|
|
||||||
sub log_error {
|
|
||||||
my $self = shift;
|
|
||||||
$self->_log (LOG_ERR, shift);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub log_critical {
|
|
||||||
my $self = shift;
|
|
||||||
my $error = shift;
|
|
||||||
$self->_log (LOG_ERR, $error, 1);
|
|
||||||
confess $error;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub log_info {
|
|
||||||
my $self = shift;
|
|
||||||
$self->_log (LOG_INFO, shift);
|
|
||||||
}
|
|
||||||
1;
|
|
@ -1,130 +0,0 @@
|
|||||||
package DoctorAgustin::Telegram;
|
|
||||||
|
|
||||||
use v5.30.0;
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use warnings;
|
|
||||||
|
|
||||||
use Types::Standard qw/Str Int Ref/;
|
|
||||||
use Params::ValidationCompiler qw(validation_for);
|
|
||||||
|
|
||||||
use Mojo::UserAgent;
|
|
||||||
use JSON;
|
|
||||||
|
|
||||||
use DoctorAgustin::Logger;
|
|
||||||
|
|
||||||
{
|
|
||||||
my $validator = validation_for(
|
|
||||||
params => {
|
|
||||||
telegram_token => { type => Str },
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
sub new {
|
|
||||||
my $class = shift;
|
|
||||||
my $self = bless {}, $class;
|
|
||||||
my %params = $validator->(@_);
|
|
||||||
my $telegram_token = $params{telegram_token};
|
|
||||||
$self->{telegram_token} = $telegram_token;
|
|
||||||
return $self;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub _logger {
|
|
||||||
my $self = shift;
|
|
||||||
if (!defined $self->{logger}) {
|
|
||||||
$self->{logger} = DoctorAgustin::Logger->new;
|
|
||||||
}
|
|
||||||
return $self->{logger};
|
|
||||||
}
|
|
||||||
|
|
||||||
sub _user_agent {
|
|
||||||
my $self = shift;
|
|
||||||
if ( !defined $self->{user_agent} ) {
|
|
||||||
$self->{user_agent} = Mojo::UserAgent->new;
|
|
||||||
}
|
|
||||||
return $self->{user_agent};
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
my $validator = validation_for(
|
|
||||||
params => {
|
|
||||||
method => { type => Str },
|
|
||||||
body => { type => Ref },
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
sub _request {
|
|
||||||
my $self = shift;
|
|
||||||
my %params = $validator->(@_);
|
|
||||||
my $method = $params{method};
|
|
||||||
my $body = $params{body};
|
|
||||||
my $ua = $self->_user_agent;
|
|
||||||
my $logger = $self->_logger;
|
|
||||||
my $url = $self->_generate_url( method => $method );
|
|
||||||
my $response = decode_json(
|
|
||||||
$ua->post( $url => {} => json => $body )->result->body );
|
|
||||||
unless ($response->{ok}) {
|
|
||||||
$logger->log_critical($response->{description});
|
|
||||||
}
|
|
||||||
return $response;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub get_updates {
|
|
||||||
my $self = shift;
|
|
||||||
my $last_update = $self->_last_update;
|
|
||||||
if ( !defined $last_update ) {
|
|
||||||
$last_update = 0;
|
|
||||||
}
|
|
||||||
my $response = $self->_request(
|
|
||||||
method => q/getUpdates/,
|
|
||||||
body => { offset => $last_update + 1 }
|
|
||||||
);
|
|
||||||
if ( scalar $response->{result}->@* ) {
|
|
||||||
$last_update = $response->{result}[-1]{update_id};
|
|
||||||
$self->_set_last_update($last_update);
|
|
||||||
}
|
|
||||||
return $response->{result};
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
my $validator = validation_for(
|
|
||||||
params => {
|
|
||||||
method => { type => Str },
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
sub _generate_url {
|
|
||||||
my $self = shift;
|
|
||||||
my %params = $validator->(@_);
|
|
||||||
my $method = $params{method};
|
|
||||||
my $telegram_token = $self->_telegram_token;
|
|
||||||
my $url = qq(https://api.telegram.org/bot$telegram_token/$method);
|
|
||||||
return $url;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
my $validator = validation_for( params => [ { type => Int } ] );
|
|
||||||
|
|
||||||
sub _set_last_update {
|
|
||||||
my $self = shift;
|
|
||||||
my ($last_update) = $validator->(@_);
|
|
||||||
$self->{last_update} = $last_update;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub _last_update {
|
|
||||||
my $self = shift;
|
|
||||||
if ( !exists $self->{last_update} ) {
|
|
||||||
return undef;
|
|
||||||
}
|
|
||||||
return $self->{last_update};
|
|
||||||
}
|
|
||||||
|
|
||||||
sub _telegram_token {
|
|
||||||
my $self = shift;
|
|
||||||
return $self->{telegram_token};
|
|
||||||
}
|
|
||||||
1;
|
|
@ -14,14 +14,14 @@ use JSON;
|
|||||||
|
|
||||||
BEGIN {
|
BEGIN {
|
||||||
unshift @INC, 'lib';
|
unshift @INC, 'lib';
|
||||||
use_ok 'DoctorAgustin::Config';
|
use_ok 'DoctorKarma::Config';
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
## GIVEN
|
## GIVEN
|
||||||
my $result = 'hola';
|
my $result = 'hola';
|
||||||
my $readline_mockmodule = Test::MockModule->new('Term::ReadLine');
|
my $readline_mockmodule = Test::MockModule->new('Term::ReadLine');
|
||||||
my $logger_mockmodule = Test::MockModule->new('DoctorAgustin::Logger');
|
my $logger_mockmodule = Test::MockModule->new('DoctorKarma::Logger');
|
||||||
my $readline_mockobject = Test::MockObject->new;
|
my $readline_mockobject = Test::MockObject->new;
|
||||||
my $new_home = Path::Tiny->tempdir;
|
my $new_home = Path::Tiny->tempdir;
|
||||||
|
|
||||||
@ -41,7 +41,7 @@ BEGIN {
|
|||||||
|
|
||||||
## WHEN
|
## WHEN
|
||||||
lives_ok {
|
lives_ok {
|
||||||
my $config = DoctorAgustin::Config->new;
|
my $config = DoctorKarma::Config->new;
|
||||||
my $telegram_token = $config->telegram_token;
|
my $telegram_token = $config->telegram_token;
|
||||||
|
|
||||||
## THEN
|
## THEN
|
||||||
@ -55,10 +55,10 @@ BEGIN {
|
|||||||
## GIVEN
|
## GIVEN
|
||||||
my $result = 'hola';
|
my $result = 'hola';
|
||||||
my $readline_mockmodule = Test::MockModule->new('Term::ReadLine');
|
my $readline_mockmodule = Test::MockModule->new('Term::ReadLine');
|
||||||
my $logger_mockmodule = Test::MockModule->new('DoctorAgustin::Logger');
|
my $logger_mockmodule = Test::MockModule->new('DoctorKarma::Logger');
|
||||||
my $readline_mockobject = Test::MockObject->new;
|
my $readline_mockobject = Test::MockObject->new;
|
||||||
my $new_home = Path::Tiny->tempdir;
|
my $new_home = Path::Tiny->tempdir;
|
||||||
my $config_dir = qq($new_home/.config/doctoragustin);
|
my $config_dir = qq($new_home/.config/doctorkarma);
|
||||||
my $config_file = qq($config_dir/config.json);
|
my $config_file = qq($config_dir/config.json);
|
||||||
|
|
||||||
local $ENV{HOME} = qq($new_home);
|
local $ENV{HOME} = qq($new_home);
|
||||||
@ -71,7 +71,7 @@ BEGIN {
|
|||||||
lives_ok {
|
lives_ok {
|
||||||
## WHEN
|
## WHEN
|
||||||
|
|
||||||
my $config = DoctorAgustin::Config->new;
|
my $config = DoctorKarma::Config->new;
|
||||||
my $telegram_token = $config->telegram_token;
|
my $telegram_token = $config->telegram_token;
|
||||||
|
|
||||||
## THEN
|
## THEN
|
||||||
|
@ -11,12 +11,12 @@ use Test::MockObject;
|
|||||||
|
|
||||||
BEGIN {
|
BEGIN {
|
||||||
unshift @INC, 'lib';
|
unshift @INC, 'lib';
|
||||||
use_ok 'DoctorAgustin::Telegram';
|
use_ok 'DoctorKarma::Telegram';
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
my $result = 'hola';
|
my $result = 'hola';
|
||||||
my $telegram = DoctorAgustin::Telegram->new (telegram_token => $result);
|
my $telegram = DoctorKarma::Telegram->new (telegram_token => $result);
|
||||||
ok $telegram->isa('DoctorAgustin::Telegram'), 'Telegram object created successfully.';
|
ok $telegram->isa('DoctorKarma::Telegram'), 'Telegram object created successfully.';
|
||||||
is $telegram->_telegram_token, $result, 'Telegram token setup was successful.';
|
is $telegram->_telegram_token, $result, 'Telegram token setup was successful.';
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user