DoctorKarma/bin/doctor_karma.pl

185 lines
5.9 KiB
Perl
Executable File

#!/usr/bin/env perl
use v5.30.0;
use strict;
use warnings;
use Data::Dumper;
use JSON;
use Mojo::URL;
use DoctorKarma::Config;
use DoctorKarma::Telegram;
use DoctorKarma::Logger;
use DoctorKarma::DB;
use DoctorKarma::DAO::User;
use DoctorKarma::Model::User;
my $config = DoctorKarma::Config->new;
my $logger = DoctorKarma::Logger->new;
my $telegram =
DoctorKarma::Telegram->new( telegram_token => $config->telegram_token );
my $db = DoctorKarma::DB->dbh;
while (1) {
my $updates = $telegram->get_updates;
for my $update ( $updates->@* ) {
my $message = $update->{message};
if ( defined $message ) {
proccess_new_message($message);
}
}
}
sub proccess_new_message {
my $message = shift;
my $reply_to_message = $message->{reply_to_message};
update_user($message);
if ( defined $message->{text} ) {
process_message_with_text($message);
}
}
sub process_message_with_text {
my $message = shift;
my $text = $message->{text};
my $username = $message->{from}{username};
my $user_id = $message->{from}{id};
my $first_name = $message->{from}{first_name};
my $reply_to_message = $message->{reply_to_message};
my $log_username = defined $username ? "\@$username" : '';
$logger->log_info(
"'$message->{text}' received from $first_name:$log_username:$user_id");
if ( $text eq '+1' && defined $reply_to_message ) {
add_karma_to_replied_message_user($message);
}
if ($text eq '-1' && defined $reply_to_message) {
substract_karma_to_replied_message_user ($message);
}
}
sub substract_karma_to_replied_message_user {
my $message = shift;
my $chat_id = $message->{chat}{id};
my $reply_to_message = $message->{reply_to_message};
my $user_giving_id = $message->{from}{id};
my $user_receiving_id = $reply_to_message->{from}{id};
my $user_dao = DoctorKarma::DAO::User->new( dbh => $db );
my $sending_karma_user = $user_dao->recover_id( id => $user_giving_id );
if ( $user_giving_id == $user_receiving_id ) {
$logger->log_info(<<"EOF");
User @{[$sending_karma_user->first_name]}:@{[$sending_karma_user->username]}:@{[$sending_karma_user->id_user]} tried to substract karma to itself, refusing.
EOF
$telegram->send_message(
chat_id => $chat_id,
text => 'You cannot substract karma to yourself'
);
return;
}
my $receiving_karma_user =
$user_dao->recover_id( id => $user_receiving_id );
if ( !defined $receiving_karma_user ) {
update_user($reply_to_message);
$receiving_karma_user =
$user_dao->recover_id( id => $user_receiving_id );
}
$user_dao->substract_1_karma( user => $receiving_karma_user );
my $id_receptor = $receiving_karma_user->id_user;
my $receptor_telegram_url = Mojo::URL->new('tg://user');
$receptor_telegram_url->query( id => $id_receptor );
$telegram->send_message(
chat_id => $chat_id,
text =>
"[@{[$receiving_karma_user->first_name]}]($receptor_telegram_url) has now @{[$receiving_karma_user->karma]} of karma\\."
);
}
sub add_karma_to_replied_message_user {
my $message = shift;
my $chat_id = $message->{chat}{id};
my $reply_to_message = $message->{reply_to_message};
my $user_giving_id = $message->{from}{id};
my $user_receiving_id = $reply_to_message->{from}{id};
my $user_dao = DoctorKarma::DAO::User->new( dbh => $db );
my $sending_karma_user = $user_dao->recover_id( id => $user_giving_id );
if ( $user_giving_id == $user_receiving_id ) {
$logger->log_info(<<"EOF");
User @{[$sending_karma_user->first_name]}:@{[$sending_karma_user->username]}:@{[$sending_karma_user->id_user]} tried to give karma to itself, refusing.
EOF
$telegram->send_message(
chat_id => $chat_id,
text => 'You cannot give karma to yourself'
);
return;
}
my $receiving_karma_user =
$user_dao->recover_id( id => $user_receiving_id );
if ( !defined $receiving_karma_user ) {
update_user($reply_to_message);
$receiving_karma_user =
$user_dao->recover_id( id => $user_receiving_id );
}
$user_dao->add_1_karma( user => $receiving_karma_user );
my $id_receptor = $receiving_karma_user->id_user;
my $receptor_telegram_url = Mojo::URL->new('tg://user');
$receptor_telegram_url->query( id => $id_receptor );
$telegram->send_message(
chat_id => $chat_id,
text =>
"[@{[$receiving_karma_user->first_name]}]($receptor_telegram_url) has now @{[$receiving_karma_user->karma]} of karma\\."
);
}
sub update_user {
my $message = shift;
my $user_id = $message->{from}{id};
my $username = $message->{from}{username};
my $first_name = $message->{from}{first_name};
my $user_dao = DoctorKarma::DAO::User->new( dbh => $db );
my $user = $user_dao->recover_id( id => $user_id );
if ( !defined $user ) {
$user = DoctorKarma::Model::User->new(
id_user => $user_id,
( defined $username ) ? ( username => $username ) : (),
karma => 0
);
$user_dao->store( user => $user );
}
if ( ( $user->username // '' ) ne ( $username // '' ) ) {
if ( defined $username ) {
my $user_already_with_username =
$user_dao->recover_username( username => $username );
$user_dao->update_username(
user => $user_already_with_username,
username => undef,
) if defined $user_already_with_username;
}
$user_dao->update_username(
user => $user,
username => $username
);
}
if ( ( $user->first_name // '' ) ne $first_name ) {
$user_dao->update_firstname(
user => $user,
first_name => $first_name
);
}
}