3/5 Allow to enable mute-by-command not only to creator of chat
This commit is contained in:
174
lib/BotLib.pm
174
lib/BotLib.pm
@@ -17,7 +17,8 @@ use BotLib::Conf qw (LoadConf);
|
|||||||
use BotLib::Admin qw (@ForbiddenMessageTypes GetForbiddenTypes AddForbiddenType
|
use BotLib::Admin qw (@ForbiddenMessageTypes GetForbiddenTypes AddForbiddenType
|
||||||
DelForbiddenType ListForbidden FortuneToggle FortuneStatus
|
DelForbiddenType ListForbidden FortuneToggle FortuneStatus
|
||||||
PluginToggle PluginStatus PluginEnabled ChanMsgToggle ChanMsgStatus
|
PluginToggle PluginStatus PluginEnabled ChanMsgToggle ChanMsgStatus
|
||||||
GreetMsgToggle GreetMsgStatus GoodbyeMsgToggle GoodbyeMsgStatus);
|
GreetMsgToggle GreetMsgStatus GoodbyeMsgToggle GoodbyeMsgStatus MuteByAdminToggle
|
||||||
|
MuteByAdminStatus MuteByAdminEnabled);
|
||||||
use BotLib::Util qw (trim Highlight);
|
use BotLib::Util qw (trim Highlight);
|
||||||
|
|
||||||
use version; our $VERSION = qw (1.1);
|
use version; our $VERSION = qw (1.1);
|
||||||
@@ -198,16 +199,24 @@ ${csign}karma фраза | ${csign}карма фраза - посмотреть
|
|||||||
MYHELP
|
MYHELP
|
||||||
$msg->replyMd ("$reply");
|
$msg->replyMd ("$reply");
|
||||||
return;
|
return;
|
||||||
# Если команда не найдена, но это команда admin
|
# Если команда не найдена, но это команда admin :)
|
||||||
} elsif ($cmd =~ /^(admin|админ)$/u) {
|
} elsif ($cmd =~ /^(admin|админ)(\s+|\s+.*)?$/u) {
|
||||||
my $member = $self->getChatMember ({ 'chat_id' => 0 + $msg->chat->id, 'user_id' => 0 + $msg->from->id });
|
my $send_args->{chat_id} = 0 + $chatid;
|
||||||
|
$send_args->{user_id} = 0 + $msg->from->id;
|
||||||
|
my $member = $self->getChatMember ($send_args);
|
||||||
|
|
||||||
if ($member->{error}) {
|
if ($member->{error}) {
|
||||||
|
$log->error ("[ERROR] Unable to call getChatMember() BotAPI method: " . Dumper ($member));
|
||||||
return;
|
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";
|
$reply = << "MYADMIN";
|
||||||
```
|
```
|
||||||
${csign}admin censor type # - где 1 - вкл, 0 - выкл цензуры для означенного типа сообщений
|
${csign}admin censor type # - где 1 - вкл, 0 - выкл цензуры для означенного типа сообщений
|
||||||
@@ -230,31 +239,40 @@ ${csign}admin chan_msg - оставляем ли сообщения пр
|
|||||||
${csign}admin chan_msg # - где 1 - оставляем, 0 - удаляем
|
${csign}admin chan_msg # - где 1 - оставляем, 0 - удаляем
|
||||||
${csign}admin ban userid sec - выдаём ban указанному user-у на указанное количество секунд (от 30 сек до 1 года), доступно только создателю чата
|
${csign}admin ban userid sec - выдаём ban указанному user-у на указанное количество секунд (от 30 сек до 1 года), доступно только создателю чата
|
||||||
${csign}admin mute userid sec - выдаём mute указанному 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
|
audio voice photo video animation sticker dice game poll document
|
||||||
MYADMIN
|
MYADMIN
|
||||||
|
|
||||||
$msg->replyMd ($reply);
|
$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 (undef, $action, $user_id_to_prosecute, $time) = split /\s+/, $cmd;
|
||||||
|
|
||||||
# Бот должен быть админом, чтобы банить юзеров
|
# Бот должен быть админом, чтобы банить юзеров
|
||||||
my $me = $self->getMe ();
|
my $me = $self->getMe ();
|
||||||
|
|
||||||
if ($me->{error}) {
|
if ($me->{error}) {
|
||||||
|
$log->error ("[ERROR] Unable to call getMe() BotAPI method: " . Dumper ($member));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -267,17 +285,21 @@ MYADMIN
|
|||||||
$reply = 'Я не буду себя банить.';
|
$reply = 'Я не буду себя банить.';
|
||||||
}
|
}
|
||||||
} else {
|
} 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}) {
|
if ($me->{error}) {
|
||||||
|
$log->error ("[ERROR] Unable to call getChatMember() BotAPI method: " . Dumper ($me));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($me->status eq 'administrator') {
|
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}) {
|
if ($chatMember->{error}) {
|
||||||
|
$log->error ("[ERROR] Unable to call getChatMember() BotAPI method: " . Dumper ($chatMember));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -308,22 +330,13 @@ MYADMIN
|
|||||||
} else {
|
} else {
|
||||||
my $result;
|
my $result;
|
||||||
|
|
||||||
|
$send_args->{user_id} = 0 + $user_id_to_prosecute;
|
||||||
|
$send_args->{until_date} = $time + time ();
|
||||||
|
|
||||||
if ($action eq 'mute') {
|
if ($action eq 'mute') {
|
||||||
$result = $self->muteChatMember (
|
$result = $self->muteChatMember ($send_args);
|
||||||
{
|
|
||||||
'chat_id' => 0 + $chatid,
|
|
||||||
'user_id' => 0 + $user_id_to_prosecute,
|
|
||||||
'until_date' => $time + time (),
|
|
||||||
},
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
$result = $self->banChatMember (
|
$result = $self->banChatMember ($send_args);
|
||||||
{
|
|
||||||
'chat_id' => 0 + $chatid,
|
|
||||||
'user_id' => 0 + $user_id_to_prosecute,
|
|
||||||
'until_date' => $time + time (),
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($result->{error}) {
|
if ($result->{error}) {
|
||||||
@@ -341,22 +354,14 @@ MYADMIN
|
|||||||
$reply = 'Я так пока не умею, я здесь не админ.'
|
$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);
|
||||||
|
|
||||||
# Это должно показываться только админам чата
|
if (defined $arg && $arg ne '') {
|
||||||
} elsif (($member->status eq 'administrator') || ($member->status eq 'creator')) {
|
my ($msgType, $toggle) = split /\s/, $arg, 2;
|
||||||
# Вынем субкоманду, это первый аргумент команды 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 $toggle) {
|
if (defined $toggle) {
|
||||||
foreach (@ForbiddenMessageTypes) {
|
foreach (@ForbiddenMessageTypes) {
|
||||||
@@ -371,70 +376,80 @@ MYADMIN
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
# Censor без аргументов, выдаёт список типов сообщений и будут ли они автоматически удаляться
|
|
||||||
} else {
|
|
||||||
$reply = ListForbidden ($chatid);
|
|
||||||
}
|
}
|
||||||
# Хотим ли мы показывать фортунку с утра
|
} elsif ($cmd =~ /^admin\s+(fortune|фортунка)(\s*|\s+0|\s+1)$/gu) {
|
||||||
} elsif ($subcmd eq 'fortune' || $subcmd eq 'фортунка') {
|
my $arg;
|
||||||
if (defined $args) {
|
$arg = trim $2 if (defined $2);
|
||||||
if ($args == 1) {
|
|
||||||
|
if (defined $arg && $arg !~ /^\s*$/) {
|
||||||
|
if ($arg == 1) {
|
||||||
$reply = FortuneToggle ($chatid, 1);
|
$reply = FortuneToggle ($chatid, 1);
|
||||||
} elsif ($args == 0) {
|
} elsif ($arg == 0) {
|
||||||
$reply = FortuneToggle ($chatid, 0);
|
$reply = FortuneToggle ($chatid, 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$reply = FortuneStatus ($chatid);
|
$reply = FortuneStatus ($chatid);
|
||||||
}
|
}
|
||||||
# Хотим ли мы удалять "сообщения от каналов"
|
} elsif ($cmd =~ /^admin\s+chan_msg(\s*|\s+0|\s+1)$/gu) {
|
||||||
} elsif ($subcmd eq 'chan_msg') {
|
my $arg = $1;
|
||||||
if (defined $args) {
|
$arg = trim $1 if (defined $1);
|
||||||
if ($args == 1) {
|
|
||||||
|
if (defined $arg && $arg !~ /^\s*$/) {
|
||||||
|
if ($arg == 1) {
|
||||||
$reply = ChanMsgToggle ($chatid, 1);
|
$reply = ChanMsgToggle ($chatid, 1);
|
||||||
} elsif ($args == 0) {
|
} elsif ($arg == 0) {
|
||||||
$reply = ChanMsgToggle ($chatid, 0);
|
$reply = ChanMsgToggle ($chatid, 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$reply = ChanMsgStatus ($chatid);
|
$reply = ChanMsgStatus ($chatid);
|
||||||
}
|
}
|
||||||
# Приветствуем ли мы новых участников чата
|
} elsif ($cmd =~ /^admin\s+(greet|приветствие)(\s*|\s+0|\s+1)$/gu) {
|
||||||
} elsif ($subcmd eq 'greet' || $subcmd eq 'приветствие') {
|
my $arg = $2;
|
||||||
if (defined $args) {
|
$arg = trim $2 if (defined $2);
|
||||||
if ($args == 1) {
|
|
||||||
|
if (defined $arg && $arg !~ /^\s*$/) {
|
||||||
|
if ($arg == 1) {
|
||||||
$reply = GreetMsgToggle ($chatid, 1);
|
$reply = GreetMsgToggle ($chatid, 1);
|
||||||
} elsif ($args == 0) {
|
} elsif ($arg == 0) {
|
||||||
$reply = GreetMsgToggle ($chatid, 0);
|
$reply = GreetMsgToggle ($chatid, 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$reply = GreetMsgStatus ($chatid);
|
$reply = GreetMsgStatus ($chatid);
|
||||||
}
|
}
|
||||||
} elsif ($subcmd eq 'goodbye' || $subcmd eq 'прощание') {
|
} elsif ($cmd =~ /^admin\s+(goodbye|прощание)(\s*|\s+0|\s+1)$/gu) {
|
||||||
if (defined $args) {
|
my $arg = $2;
|
||||||
if ($args == 1) {
|
$arg = trim $2 if (defined $2);
|
||||||
|
|
||||||
|
if (defined $arg && $arg !~ /^\s*$/) {
|
||||||
|
if ($arg == 1) {
|
||||||
$reply = GoodbyeMsgToggle ($chatid, 1);
|
$reply = GoodbyeMsgToggle ($chatid, 1);
|
||||||
} elsif ($args == 0) {
|
} elsif ($arg == 0) {
|
||||||
$reply = GoodbyeMsgToggle ($chatid, 0);
|
$reply = GoodbyeMsgToggle ($chatid, 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$reply = GoodbyeMsgStatus ($chatid);
|
$reply = GoodbyeMsgStatus ($chatid);
|
||||||
}
|
}
|
||||||
# Работает ли плагин oboobs в чатике
|
} elsif ($cmd =~ /^admin\s+oboobs(\s*|\s+0|\s+1)$/gu) {
|
||||||
} elsif ($subcmd eq 'oboobs') {
|
my $arg = $1;
|
||||||
if (defined $args) {
|
$arg = trim $1 if (defined $1);
|
||||||
if ($args == 1) {
|
|
||||||
|
if (defined $arg) {
|
||||||
|
if ($arg == 1) {
|
||||||
$reply = PluginToggle ($chatid, 'oboobs', 1);
|
$reply = PluginToggle ($chatid, 'oboobs', 1);
|
||||||
} elsif ($args == 0) {
|
} elsif ($arg == 0) {
|
||||||
$reply = PluginToggle ($chatid, 'oboobs', 0);
|
$reply = PluginToggle ($chatid, 'oboobs', 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$reply = PluginStatus ($chatid, 'oboobs');
|
$reply = PluginStatus ($chatid, 'oboobs');
|
||||||
}
|
}
|
||||||
# Работает ли плагин obutts в чатике
|
} elsif ($cmd =~ /^admin\s+obutts(\s*|\s+0|\s+1)$/gu) {
|
||||||
} elsif ($subcmd eq 'obutts') {
|
my $arg = $1;
|
||||||
if (defined $args) {
|
$arg = trim $1 if (defined $1);
|
||||||
if ($args == 1) {
|
|
||||||
|
if (defined $arg) {
|
||||||
|
if ($arg == 1) {
|
||||||
$reply = PluginToggle ($chatid, 'obutts', 1);
|
$reply = PluginToggle ($chatid, 'obutts', 1);
|
||||||
} elsif ($args == 0) {
|
} elsif ($arg == 0) {
|
||||||
$reply = PluginToggle ($chatid, 'obutts', 0);
|
$reply = PluginToggle ($chatid, 'obutts', 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -442,7 +457,6 @@ MYADMIN
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return $reply;
|
return $reply;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ our @ISA = qw / Exporter /; ## no critic (ClassHierarchies::ProhibitExplicitI
|
|||||||
our @EXPORT_OK = qw (@ForbiddenMessageTypes @PluginList GetForbiddenTypes AddForbiddenType DelForbiddenType
|
our @EXPORT_OK = qw (@ForbiddenMessageTypes @PluginList GetForbiddenTypes AddForbiddenType DelForbiddenType
|
||||||
ListForbidden FortuneToggle FortuneToggleList FortuneStatus PluginToggle PluginStatus
|
ListForbidden FortuneToggle FortuneToggleList FortuneStatus PluginToggle PluginStatus
|
||||||
PluginEnabled ChanMsgToggle ChanMsgStatus ChanMsgEnabled GreetMsgToggle GreetMsgStatus
|
PluginEnabled ChanMsgToggle ChanMsgStatus ChanMsgEnabled GreetMsgToggle GreetMsgStatus
|
||||||
GreetMsgEnabled GoodbyeMsgToggle GoodbyeMsgStatus GoodbyeMsgEnabled MigrateSettingsToNewChatID
|
GreetMsgEnabled GoodbyeMsgToggle GoodbyeMsgStatus GoodbyeMsgEnabled MuteByAdminToggle
|
||||||
IsCensored);
|
MuteByAdminStatus MuteByAdminEnabled MigrateSettingsToNewChatID IsCensored);
|
||||||
|
|
||||||
my $c = LoadConf ();
|
my $c = LoadConf ();
|
||||||
my $cachedir = $c->{cachedir};
|
my $cachedir = $c->{cachedir};
|
||||||
@@ -576,6 +576,92 @@ sub PluginToggle (@) {
|
|||||||
return $phrase;
|
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 {
|
sub MigrateSettingsToNewChatID {
|
||||||
my $old_id = shift;
|
my $old_id = shift;
|
||||||
my $new_id = shift;
|
my $new_id = shift;
|
||||||
|
|||||||
Reference in New Issue
Block a user