From 2209872a7ba87274d9d1035ebefe98af3b985b77 Mon Sep 17 00:00:00 2001 From: eleksir Date: Sun, 3 Apr 2022 17:33:14 +0300 Subject: [PATCH] Fix admin command, use regex for complex command detection --- .perlcriticrc | 3 +++ lib/BotLib.pm | 34 ++++++++++++++++------------------ 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/.perlcriticrc b/.perlcriticrc index e1152ab..913c052 100644 --- a/.perlcriticrc +++ b/.perlcriticrc @@ -144,3 +144,6 @@ max_length = 200 # This is problematic [-Miscellanea::ProhibitUnrestrictedNoCritic] + +[-RegularExpressions::ProhibitFixedStringMatches] +# no, just no. I'm too lazy to everytime check string length before substr \ No newline at end of file diff --git a/lib/BotLib.pm b/lib/BotLib.pm index 21acbf3..b5bc606 100644 --- a/lib/BotLib.pm +++ b/lib/BotLib.pm @@ -94,8 +94,7 @@ sub Command { } # Поиск "сложных" команд во входящем сообщении - if (($cmd =~ /^w\s/u) || ($cmd =~ /^п\s/u) || ($cmd =~ /^weather\s/u) || ($cmd =~ /^погода\s/u) || - ($cmd =~ /^погодка\s/u) || ($cmd =~ /^погадка\s/u) || ($cmd =~ /^karma\s/u) || ($cmd =~ /карма\s/u)) { + if ($cmd =~ /^(w|п|weather|погода|погодка|погадка|karma|карма)\s+/) { ## no critic (RegularExpressions::ProhibitComplexRegexes) $bingo = 1; } @@ -143,7 +142,7 @@ sub Command { $c->{'redis_router_channel'} => $rmsg, ); # Если команда не найдена, но строка подозрительно напоминает команду help - } elsif (substr ($text, length ('help')) eq 'help' || substr ($text, length ('помощь')) eq 'помощь') { + } elsif ($cmd =~ /^(help|помощь)$/u) { $reply = << "MYHELP"; ``` ${csign}help | ${csign}помощь - список команд @@ -184,8 +183,8 @@ ${csign}karma фраза | ${csign}карма фраза - посмотреть MYHELP $msg->replyMd ($reply); return; - # Если строка не найдена, но это команда admin - } elsif (substr ($text, length ($csign)) eq 'admin' || substr ($text, length ($csign)) eq 'админ') { + # Если команда не найдена, но это команда admin + } elsif ($cmd =~ /^(admin|админ)$/u) { my $member = $self->getChatMember ({ 'chat_id' => $msg->chat->id, 'user_id' => $msg->from->id }); # Это должно показываться только админам чата @@ -220,22 +219,21 @@ MYADMIN return; # Если строка не найдена, но это команда admin с параметрами - } elsif ((substr ($text, length ($csign), length ('admin')) eq 'admin' || substr ($text, length ($csign), length ('админ')) eq 'админ') && (length ($text) >= 8)) { + } elsif ($cmd =~ /^admin\s+.+$/u || $cmd =~ /^админ\s+.+$/u) { my $member = $self->getChatMember ({ 'chat_id' => $msg->chat->id, 'user_id' => $msg->from->id }); # Это должно показываться только админам чата if (($member->status eq 'administrator') || ($member->status eq 'creator')) { # Вынем субкоманду, это первый аргумент команды admin - my $command = trim (substr $text, 7); - $cmd = undef; - my $args; - ($cmd, $args) = split /\s+/, $command, 2; + $cmd =~ /^(admin|админ)\s+(.+)$/u; + my $command = trim ($2); ## no critic (RegularExpressions::ProhibitCaptureWithoutTest) + my ($subcmd, $args) = split /\s+/, $command, 2; # Субкоманды не нашлось, ну и какбэ досвидонья - if ($cmd eq '') { + if ($subcmd eq '') { return; # Субкоманда censor... - } elsif ($cmd eq 'censor' || $cmd eq 'ценз') { + } elsif ($subcmd eq 'censor' || $subcmd eq 'ценз') { # Censor с аргументами if (defined ($args) && ($args ne '')) { my ($msgType, $toggle) = split /\s/, $args, 2; @@ -258,7 +256,7 @@ MYADMIN $reply = ListForbidden ($chatid); } # Хотим ли мы показывать фортунку с утра - } elsif ($cmd eq 'fortune' || $cmd eq 'фортунка') { + } elsif ($subcmd eq 'fortune' || $subcmd eq 'фортунка') { if (defined $args) { if ($args == 1) { $reply = FortuneToggle ($chatid, 1); @@ -269,7 +267,7 @@ MYADMIN $reply = FortuneStatus ($chatid); } # Хотим ли мы удалять "сообщения от каналов" - } elsif ($cmd eq 'chan_msg') { + } elsif ($subcmd eq 'chan_msg') { if (defined $args) { if ($args == 1) { $reply = ChanMsgToggle ($chatid, 1); @@ -280,7 +278,7 @@ MYADMIN $reply = ChanMsgStatus ($chatid); } # Приветствуем ли мы новых участников чата - } elsif ($cmd eq 'greet' || $cmd eq 'приветствие') { + } elsif ($subcmd eq 'greet' || $subcmd eq 'приветствие') { if (defined $args) { if ($args == 1) { $reply = GreetMsgToggle ($chatid, 1); @@ -290,7 +288,7 @@ MYADMIN } else { $reply = GreetMsgStatus ($chatid); } - } elsif ($cmd eq 'goodbye' || $cmd eq 'прощание') { + } elsif ($subcmd eq 'goodbye' || $subcmd eq 'прощание') { if (defined $args) { if ($args == 1) { $reply = GoodbyeMsgToggle ($chatid, 1); @@ -301,7 +299,7 @@ MYADMIN $reply = GoodbyeMsgStatus ($chatid); } # Работает ли плагин oboobs в чатике - } elsif ($cmd eq 'oboobs') { + } elsif ($subcmd eq 'oboobs') { if (defined $args) { if ($args == 1) { $reply = PluginToggle ($chatid, 'oboobs', 1); @@ -312,7 +310,7 @@ MYADMIN $reply = PluginStatus ($chatid, 'oboobs'); } # Работает ли плагин obutts в чатике - } elsif ($cmd eq 'obutts') { + } elsif ($subcmd eq 'obutts') { if (defined $args) { if ($args == 1) { $reply = PluginToggle ($chatid, 'obutts', 1);