From f9658ac5e84224c457f4d8b4c22fb1042c440ea2 Mon Sep 17 00:00:00 2001 From: eleksir Date: Sun, 9 Oct 2022 02:06:54 +0300 Subject: [PATCH] Actually add admin mute command --- lib/BotLib.pm | 65 +++++++++++++++++++++++++++++++---------- lib/Teapot/Bot/Brain.pm | 50 +++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 16 deletions(-) diff --git a/lib/BotLib.pm b/lib/BotLib.pm index c607e3e..7e776a0 100644 --- a/lib/BotLib.pm +++ b/lib/BotLib.pm @@ -218,6 +218,7 @@ ${csign}admin obutts - показываем ли попки по про ${csign}admin chan_msg - оставляем ли сообщения присланные от имени (других) каналов ${csign}admin chan_msg # - где 1 - оставляем, 0 - удаляем ${csign}admin ban userid sec - выдаём ban указанному user-у на указанное количество секунд (от 30 сек до 1 года), доступно только создателю чата +${csign}admin mute userid sec - выдаём mute указанному user-у на указанное количество секунд (от 30 сек до 1 года), доступно только создателю чата ``` Типы сообщений: audio voice photo video animation sticker dice game poll document @@ -236,8 +237,8 @@ MYADMIN } # Банить через бота можно только создателю чятика - if (($member->status eq 'creator') && $cmd =~ /^(admin|админ)\s+ban\s+(\d+)\s+(\d+)$/gu) { - my (undef, undef, $user_id_to_ban, $time) = split /\s+/, $cmd; + if (($member->status eq 'creator') && $cmd =~ /^(admin|админ)\s+(ban|mute)\s+(\d+)\s+(\d+)$/gu) { + my (undef, $action, $user_id_to_prosecute, $time) = split /\s+/, $cmd; # Бот должен быть админом, чтобы банить юзеров my $me = $self->getMe (); @@ -248,8 +249,12 @@ MYADMIN my $myId = $me->id; - if ($myId == $user_id_to_ban) { - $reply = 'Я не буду себя мьютить.'; + if ($myId == $user_id_to_prosecute) { + if ($action eq 'mute') { + $reply = 'Я не буду себя мьютить.'; + } else { + $reply = 'Я не буду себя банить.'; + } } else { $me = $self->getChatMember ({'chat_id' => $chatid, 'user_id' => $me->id}); @@ -259,7 +264,7 @@ MYADMIN if ($me->status eq 'administrator') { # Проверим, что такой юзер есть в чятике - my $chatMember = $self->getChatMember ({'chat_id' => $chatid, 'user_id' => $user_id_to_ban}); + my $chatMember = $self->getChatMember ({'chat_id' => $chatid, 'user_id' => $user_id_to_prosecute}); if ($chatMember->{error}) { return; @@ -269,25 +274,53 @@ MYADMIN my $memberStatus = $chatMember->status; if ($memberStatus eq 'creator') { - $reply = 'Ты поехал себя банить?'; + if ($action eq 'mute') { + $reply = 'Ты поехал себя мьютить?'; + } else { + $reply = 'Ты поехал себя банить?'; + } } elsif ($memberStatus eq 'administrator') { - $reply = 'Админов банить не буду.'; + if ($action eq 'mute') { + $reply = 'Админов мьютить не буду.'; + } else { + $reply = 'Админов банить не буду.'; + } } else { if ($time < 30) { $reply = 'Ты слишком добр.'; } elsif ($time > (60 * 60 * 24 * 366)) { - $reply = 'Бан более чем на 366 дней - перманентный, ты слишком жесток, я так не играю.'; + if ($action eq 'mute') { + $reply = 'Мьют более чем на 366 дней - перманентный, ты слишком жесток, я так не играю.'; + } else { + $reply = 'Бан более чем на 366 дней - перманентный, ты слишком жесток, я так не играю.'; + } } else { - my $result = $self->banChatMember ( - { - 'chat_id' => 0 + $chatid, - 'user_id' => 0 + $user_id_to_ban, - 'until_date' => $time + time (), - }, - ); + my $result; + + if ($action eq 'mute') { + $result = $self->muteChatMember ( + { + 'chat_id' => 0 + $chatid, + 'user_id' => 0 + $user_id_to_prosecute, + 'until_date' => $time + time (), + }, + ); + } else { + $result = $self->banChatMember ( + { + 'chat_id' => 0 + $chatid, + 'user_id' => 0 + $user_id_to_prosecute, + 'until_date' => $time + time (), + }, + ); + } if ($result->{error}) { - $reply = 'Что-то пошло не так, не получается забанить.'; + if ($action eq 'mute') { + $reply = 'Что-то пошло не так, не получается замьютить.'; + } else { + $reply = 'Что-то пошло не так, не получается забанить.'; + } } else { $reply = 'Готово.'; } diff --git a/lib/Teapot/Bot/Brain.pm b/lib/Teapot/Bot/Brain.pm index 47078f6..d6e3df8 100644 --- a/lib/Teapot/Bot/Brain.pm +++ b/lib/Teapot/Bot/Brain.pm @@ -11,6 +11,7 @@ use utf8; use English qw ( -no_match_vars ); use Mojo::IOLoop (); +use Mojo::JSON qw (true false); use Mojo::UserAgent (); use Carp qw/croak cluck confess/; # use croak where we return error up to app that supply something wrong # use cluck where we want to say that something bad but non-critical happen in @@ -169,6 +170,7 @@ sub banChatMember { return; } + sub unbanChatMember { my $self = shift; my $args = shift || {}; @@ -197,6 +199,43 @@ sub unbanChatMember { } +sub muteChatMember { + my $self = shift; + my $args = shift || {}; + + my $token = $self->token || croak 'No token supplied to muteChatMember?'; + my $send_args = {}; + + unless ($args->{chat_id}) { + cluck 'No chat_id supplied to muteChatMember()'; + return {'error' => 1}; + } + + unless ($args->{user_id}) { + cluck 'No user_id supplied to muteChatMember()'; + return {'error' => 1}; + } + + $send_args->{chat_id} = $args->{chat_id}; + $send_args->{user_id} = $args->{user_id}; + $send_args->{until_date} = $args->{until_date} if exists $args->{until_date}; + # Revoke all known for API v6.2 permissions + $send_args->{permissions}->{can_send_messages} = false; + $send_args->{permissions}->{can_send_media_messages} = false; + $send_args->{permissions}->{can_send_polls} = false; + $send_args->{permissions}->{can_send_other_messages} = false; + $send_args->{permissions}->{can_add_web_page_previews} = false; + $send_args->{permissions}->{can_change_info} = false; + $send_args->{permissions}->{can_invite_users} = false; + $send_args->{permissions}->{can_pin_messages} = false; + + my $url = "https://api.telegram.org/bot${token}/restrictChatMember"; + my $api_response = $self->_post_request($url, $send_args); + + return; +} + + sub getChat { my $self = shift; my $args = shift || {}; @@ -829,6 +868,17 @@ Takes chat_id, and user_id as arguments. And optionally only_if_banned. Returns nothing, it's send-only method (Telegram API returns true on success) +=head2 muteChatMember + +This is the wrapper around the C API method. See +L. + +Takes chat_id, and user_id as arguments. And optionally until_date. + +Shorthand for revoking all perminnsions for member being muted. + +Returns nothing, it's send-only method (Telegram API returns true on success) + =head2 getChat This is the wrapper around the C API method. See