3/5 Allow to enable mute-by-command not only to creator of chat

This commit is contained in:
eleksir
2023-01-02 19:08:02 +03:00
parent 1f3675de8f
commit 3dc75936ea
2 changed files with 221 additions and 121 deletions

View File

@@ -17,7 +17,8 @@ use BotLib::Conf qw (LoadConf);
use BotLib::Admin qw (@ForbiddenMessageTypes GetForbiddenTypes AddForbiddenType
DelForbiddenType ListForbidden FortuneToggle FortuneStatus
PluginToggle PluginStatus PluginEnabled ChanMsgToggle ChanMsgStatus
GreetMsgToggle GreetMsgStatus GoodbyeMsgToggle GoodbyeMsgStatus);
GreetMsgToggle GreetMsgStatus GoodbyeMsgToggle GoodbyeMsgStatus MuteByAdminToggle
MuteByAdminStatus MuteByAdminEnabled);
use BotLib::Util qw (trim Highlight);
use version; our $VERSION = qw (1.1);
@@ -198,16 +199,24 @@ ${csign}karma фраза | ${csign}карма фраза - посмотреть
MYHELP
$msg->replyMd ("$reply");
return;
# Если команда не найдена, но это команда admin
} elsif ($cmd =~ /^(admin|админ)$/u) {
my $member = $self->getChatMember ({ 'chat_id' => 0 + $msg->chat->id, 'user_id' => 0 + $msg->from->id });
# Если команда не найдена, но это команда admin :)
} elsif ($cmd =~ /^(admin|админ)(\s+|\s+.*)?$/u) {
my $send_args->{chat_id} = 0 + $chatid;
$send_args->{user_id} = 0 + $msg->from->id;
my $member = $self->getChatMember ($send_args);
if ($member->{error}) {
$log->error ("[ERROR] Unable to call getChatMember() BotAPI method: " . Dumper ($member));
return;
}
# Это должно показываться только админам чата
if (($member->status eq 'administrator') || ($member->status eq 'creator')) {
if (($member->status ne 'administrator') && ($member->status ne 'creator')) {
$log->debug ("[DEBUG] Non admin member called ${csign}admin command, " . $member->status);
return;
}
if ($cmd =~ /^(admin|админ)\s*$/u) {
$reply = << "MYADMIN";
```
${csign}admin censor type # - где 1 - вкл, 0 - выкл цензуры для означенного типа сообщений
@@ -230,31 +239,40 @@ ${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 года), доступно только создателю чата
${csign}admin admin mute - разрешено ли обычным админам мьютить участников чата через бота (если бот - админ), (создатель чата всегда может попросить бота-админа замьютить обычного участника чата)
${csign}admin admin mute # - где 1 - разрешено, 0 - не разрешено
```
Типы сообщений:
audio voice photo video animation sticker dice game poll document
MYADMIN
$msg->replyMd ($reply);
return;
} elsif ($cmd =~ /^admin\s+(admin\s+mute)(\s*|\s+0|\s+1)$/gu) {
my $arg;
$arg = trim $2 if (defined $2);
if (defined $arg && $arg !~ /^\s*$/) {
if ($arg == 1) {
$reply = MuteByAdminToggle ($chatid, 1);
} elsif ($arg == 0) {
$reply = MuteByAdminToggle ($chatid, 0);
}
} else {
$reply = MuteByAdminStatus ($chatid);
}
} elsif ($cmd =~ /^(admin|админ)\s+(ban|mute)\s+(\d+)\s+(\d+)$/gu) {
if ($member->status eq 'admin' && (! MuteByAdminEnabled ($chatid))) {
return 'Не буду я для тебя никого мьтить.';
}
return;
# Если строка не найдена, но это команда admin с параметрами
} elsif ($cmd =~ /^admin\s+.+$/u || $cmd =~ /^админ\s+.+$/u) {
my $member = $self->getChatMember ({ 'chat_id' => 0 + $msg->chat->id, 'user_id' => 0 + $msg->from->id });
if ($member->{error}) {
return;
}
# Банить через бота можно только создателю чятика
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 ();
if ($me->{error}) {
$log->error ("[ERROR] Unable to call getMe() BotAPI method: " . Dumper ($member));
return;
}
@@ -267,17 +285,21 @@ MYADMIN
$reply = 'Я не буду себя банить.';
}
} else {
$me = $self->getChatMember ({'chat_id' => $chatid, 'user_id' => $me->id});
$send_args->{user_id} = $me->id;
$me = $self->getChatMember ($send_args);
if ($me->{error}) {
$log->error ("[ERROR] Unable to call getChatMember() BotAPI method: " . Dumper ($me));
return;
}
if ($me->status eq 'administrator') {
# Проверим, что такой юзер есть в чятике
my $chatMember = $self->getChatMember ({'chat_id' => $chatid, 'user_id' => $user_id_to_prosecute});
$send_args->{user_id} = $user_id_to_prosecute;
my $chatMember = $self->getChatMember ($send_args);
if ($chatMember->{error}) {
$log->error ("[ERROR] Unable to call getChatMember() BotAPI method: " . Dumper ($chatMember));
return;
}
@@ -308,22 +330,13 @@ MYADMIN
} else {
my $result;
$send_args->{user_id} = 0 + $user_id_to_prosecute;
$send_args->{until_date} = $time + time ();
if ($action eq 'mute') {
$result = $self->muteChatMember (
{
'chat_id' => 0 + $chatid,
'user_id' => 0 + $user_id_to_prosecute,
'until_date' => $time + time (),
},
);
$result = $self->muteChatMember ($send_args);
} else {
$result = $self->banChatMember (
{
'chat_id' => 0 + $chatid,
'user_id' => 0 + $user_id_to_prosecute,
'until_date' => $time + time (),
},
);
$result = $self->banChatMember ($send_args);
}
if ($result->{error}) {
@@ -341,22 +354,14 @@ MYADMIN
$reply = 'Я так пока не умею, я здесь не админ.'
}
}
} elsif ($cmd =~ /^admin\s+(censor|ценз)\s*$/gu) {
$reply = ListForbidden ($chatid);
} elsif ($cmd =~ /^admin\s+(censor|ценз)\s+(type|тип)\s+(.+)$/gu) {
my $arg;
$arg = trim $3 if (defined $3);
# Это должно показываться только админам чата
} elsif (($member->status eq 'administrator') || ($member->status eq 'creator')) {
# Вынем субкоманду, это первый аргумент команды admin
$cmd =~ /^(admin|админ)\s+(.+)$/u;
my $command = trim ($2); ## no critic (RegularExpressions::ProhibitCaptureWithoutTest)
my ($subcmd, $args) = split /\s+/, $command, 2;
# Субкоманды не нашлось, ну и какбэ досвидонья
if ($subcmd eq '') {
return;
# Субкоманда censor...
} elsif ($subcmd eq 'censor' || $subcmd eq 'ценз') {
# Censor с аргументами
if (defined ($args) && ($args ne '')) {
my ($msgType, $toggle) = split /\s/, $args, 2;
if (defined $arg && $arg ne '') {
my ($msgType, $toggle) = split /\s/, $arg, 2;
if (defined $toggle) {
foreach (@ForbiddenMessageTypes) {
@@ -371,70 +376,80 @@ MYADMIN
}
}
}
# Censor без аргументов, выдаёт список типов сообщений и будут ли они автоматически удаляться
} else {
$reply = ListForbidden ($chatid);
}
# Хотим ли мы показывать фортунку с утра
} elsif ($subcmd eq 'fortune' || $subcmd eq 'фортунка') {
if (defined $args) {
if ($args == 1) {
} elsif ($cmd =~ /^admin\s+(fortune|фортунка)(\s*|\s+0|\s+1)$/gu) {
my $arg;
$arg = trim $2 if (defined $2);
if (defined $arg && $arg !~ /^\s*$/) {
if ($arg == 1) {
$reply = FortuneToggle ($chatid, 1);
} elsif ($args == 0) {
} elsif ($arg == 0) {
$reply = FortuneToggle ($chatid, 0);
}
} else {
$reply = FortuneStatus ($chatid);
}
# Хотим ли мы удалять "сообщения от каналов"
} elsif ($subcmd eq 'chan_msg') {
if (defined $args) {
if ($args == 1) {
} elsif ($cmd =~ /^admin\s+chan_msg(\s*|\s+0|\s+1)$/gu) {
my $arg = $1;
$arg = trim $1 if (defined $1);
if (defined $arg && $arg !~ /^\s*$/) {
if ($arg == 1) {
$reply = ChanMsgToggle ($chatid, 1);
} elsif ($args == 0) {
} elsif ($arg == 0) {
$reply = ChanMsgToggle ($chatid, 0);
}
} else {
$reply = ChanMsgStatus ($chatid);
}
# Приветствуем ли мы новых участников чата
} elsif ($subcmd eq 'greet' || $subcmd eq 'приветствие') {
if (defined $args) {
if ($args == 1) {
} elsif ($cmd =~ /^admin\s+(greet|приветствие)(\s*|\s+0|\s+1)$/gu) {
my $arg = $2;
$arg = trim $2 if (defined $2);
if (defined $arg && $arg !~ /^\s*$/) {
if ($arg == 1) {
$reply = GreetMsgToggle ($chatid, 1);
} elsif ($args == 0) {
} elsif ($arg == 0) {
$reply = GreetMsgToggle ($chatid, 0);
}
} else {
$reply = GreetMsgStatus ($chatid);
}
} elsif ($subcmd eq 'goodbye' || $subcmd eq 'прощание') {
if (defined $args) {
if ($args == 1) {
} elsif ($cmd =~ /^admin\s+(goodbye|прощание)(\s*|\s+0|\s+1)$/gu) {
my $arg = $2;
$arg = trim $2 if (defined $2);
if (defined $arg && $arg !~ /^\s*$/) {
if ($arg == 1) {
$reply = GoodbyeMsgToggle ($chatid, 1);
} elsif ($args == 0) {
} elsif ($arg == 0) {
$reply = GoodbyeMsgToggle ($chatid, 0);
}
} else {
$reply = GoodbyeMsgStatus ($chatid);
}
# Работает ли плагин oboobs в чатике
} elsif ($subcmd eq 'oboobs') {
if (defined $args) {
if ($args == 1) {
} elsif ($cmd =~ /^admin\s+oboobs(\s*|\s+0|\s+1)$/gu) {
my $arg = $1;
$arg = trim $1 if (defined $1);
if (defined $arg) {
if ($arg == 1) {
$reply = PluginToggle ($chatid, 'oboobs', 1);
} elsif ($args == 0) {
} elsif ($arg == 0) {
$reply = PluginToggle ($chatid, 'oboobs', 0);
}
} else {
$reply = PluginStatus ($chatid, 'oboobs');
}
# Работает ли плагин obutts в чатике
} elsif ($subcmd eq 'obutts') {
if (defined $args) {
if ($args == 1) {
} elsif ($cmd =~ /^admin\s+obutts(\s*|\s+0|\s+1)$/gu) {
my $arg = $1;
$arg = trim $1 if (defined $1);
if (defined $arg) {
if ($arg == 1) {
$reply = PluginToggle ($chatid, 'obutts', 1);
} elsif ($args == 0) {
} elsif ($arg == 0) {
$reply = PluginToggle ($chatid, 'obutts', 0);
}
} else {
@@ -442,7 +457,6 @@ MYADMIN
}
}
}
}
return $reply;
}

View File

@@ -18,8 +18,8 @@ our @ISA = qw / Exporter /; ## no critic (ClassHierarchies::ProhibitExplicitI
our @EXPORT_OK = qw (@ForbiddenMessageTypes @PluginList GetForbiddenTypes AddForbiddenType DelForbiddenType
ListForbidden FortuneToggle FortuneToggleList FortuneStatus PluginToggle PluginStatus
PluginEnabled ChanMsgToggle ChanMsgStatus ChanMsgEnabled GreetMsgToggle GreetMsgStatus
GreetMsgEnabled GoodbyeMsgToggle GoodbyeMsgStatus GoodbyeMsgEnabled MigrateSettingsToNewChatID
IsCensored);
GreetMsgEnabled GoodbyeMsgToggle GoodbyeMsgStatus GoodbyeMsgEnabled MuteByAdminToggle
MuteByAdminStatus MuteByAdminEnabled MigrateSettingsToNewChatID IsCensored);
my $c = LoadConf ();
my $cachedir = $c->{cachedir};
@@ -576,6 +576,92 @@ sub PluginToggle (@) {
return $phrase;
}
sub MuteByAdminToggle (@) {
my $chatid = shift;
my $action = shift // undef;
my $phrase = 'Мьют участников чата админами ';
my $cache = CHI->new (
driver => 'BerkeleyDB',
root_dir => $cachedir,
namespace => __PACKAGE__ . '_' . 'admin_mute',
);
my $state = $cache->get ($chatid);
if (defined $action) {
if ($action) {
$cache->set ($chatid, 1, 'never');
$phrase .= 'разрешён.';
} else {
$cache->set ($chatid, 0, 'never');
$phrase .= 'запрещён.';
}
} else {
if (defined $state){
if ($state) {
$cache->set ($chatid, 0, 'never');
$phrase .= 'запрещён.';
} else {
$cache->set ($chatid, 1, 'never');
$phrase .= 'разрешён.';
}
} else {
$cache->set ($chatid, 1, 'never');
$phrase .= 'разрешён.';
}
}
return $phrase;
}
sub MuteByAdminStatus ($) {
my $chatid = shift;
my $phrase = 'Мьют админами участников чата ';
my $cache = CHI->new (
driver => 'BerkeleyDB',
root_dir => $cachedir,
namespace => __PACKAGE__ . '_' . 'admin_mute',
);
my $state = $cache->get ($chatid);
if (defined $state) {
if ($state) {
$phrase .= 'разрешён.';
} else {
$phrase .= 'запрещён.';
}
} else {
$phrase .= 'запрещён.';
}
return $phrase;
}
sub MuteByAdminEnabled ($) {
my $chatid = shift;
my $cache = CHI->new (
driver => 'BerkeleyDB',
root_dir => $cachedir,
namespace => __PACKAGE__ . '_' . 'admin_mute',
);
my $state = $cache->get ($chatid);
if (defined $state) {
if ($state) {
return 1;
} else {
return 0;
}
} else {
return 0;
}
}
sub MigrateSettingsToNewChatID {
my $old_id = shift;
my $new_id = shift;