diff --git a/Makefile.PL b/Makefile.PL index f34418a..eb934ed 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -1,6 +1,6 @@ use ExtUtils::MakeMaker; WriteMakefile( - NAME => 'DoctorAgustin', + NAME => 'DoctorKarma', VERSION => '0.1', INST_SCRIPT => './bin', INST_BIN => './bin', diff --git a/bin/doctor_agustin.pl b/bin/doctor_agustin.pl index 76d2f80..e956c7c 100755 --- a/bin/doctor_agustin.pl +++ b/bin/doctor_agustin.pl @@ -8,14 +8,14 @@ use warnings; use Data::Dumper; use JSON; -use DoctorAgustin::Config; -use DoctorAgustin::Telegram; -use DoctorAgustin::Logger; +use DoctorKarma::Config; +use DoctorKarma::Telegram; +use DoctorKarma::Logger; -my $config = DoctorAgustin::Config->new; -my $logger = DoctorAgustin::Logger->new; +my $config = DoctorKarma::Config->new; +my $logger = DoctorKarma::Logger->new; my $telegram = - DoctorAgustin::Telegram->new( telegram_token => $config->telegram_token ); + DoctorKarma::Telegram->new( telegram_token => $config->telegram_token ); while (1) { my $updates = $telegram->get_updates; for my $update ($updates->@*) { diff --git a/lib/DoctorAgustin/Config.pm b/lib/DoctorAgustin/Config.pm deleted file mode 100644 index a511cee..0000000 --- a/lib/DoctorAgustin/Config.pm +++ /dev/null @@ -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; diff --git a/lib/DoctorAgustin/Logger.pm b/lib/DoctorAgustin/Logger.pm deleted file mode 100644 index 03be91a..0000000 --- a/lib/DoctorAgustin/Logger.pm +++ /dev/null @@ -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; diff --git a/lib/DoctorAgustin/Telegram.pm b/lib/DoctorAgustin/Telegram.pm deleted file mode 100644 index 521f8c2..0000000 --- a/lib/DoctorAgustin/Telegram.pm +++ /dev/null @@ -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; diff --git a/t/00001-config.t b/t/00001-config.t index 2c7be13..c737167 100644 --- a/t/00001-config.t +++ b/t/00001-config.t @@ -14,14 +14,14 @@ use JSON; BEGIN { unshift @INC, 'lib'; - use_ok 'DoctorAgustin::Config'; + use_ok 'DoctorKarma::Config'; } { ## GIVEN my $result = 'hola'; 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 $new_home = Path::Tiny->tempdir; @@ -41,7 +41,7 @@ BEGIN { ## WHEN lives_ok { - my $config = DoctorAgustin::Config->new; + my $config = DoctorKarma::Config->new; my $telegram_token = $config->telegram_token; ## THEN @@ -55,10 +55,10 @@ BEGIN { ## GIVEN my $result = 'hola'; 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 $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); local $ENV{HOME} = qq($new_home); @@ -71,7 +71,7 @@ BEGIN { lives_ok { ## WHEN - my $config = DoctorAgustin::Config->new; + my $config = DoctorKarma::Config->new; my $telegram_token = $config->telegram_token; ## THEN diff --git a/t/00002-telegram.t b/t/00002-telegram.t index 42b64f1..5459373 100644 --- a/t/00002-telegram.t +++ b/t/00002-telegram.t @@ -11,12 +11,12 @@ use Test::MockObject; BEGIN { unshift @INC, 'lib'; - use_ok 'DoctorAgustin::Telegram'; + use_ok 'DoctorKarma::Telegram'; } { my $result = 'hola'; - my $telegram = DoctorAgustin::Telegram->new (telegram_token => $result); - ok $telegram->isa('DoctorAgustin::Telegram'), 'Telegram object created successfully.'; + my $telegram = DoctorKarma::Telegram->new (telegram_token => $result); + ok $telegram->isa('DoctorKarma::Telegram'), 'Telegram object created successfully.'; is $telegram->_telegram_token, $result, 'Telegram token setup was successful.'; }