#!/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 ); } }