From 066e961bd2fff58cccbe6d9b2c1349a14724a201 Mon Sep 17 00:00:00 2001 From: eleksir Date: Mon, 4 Apr 2022 11:18:27 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=BF=D0=BE=D0=BB=D0=B5=20misc->good=5Fmorning,?= =?UTF-8?q?=20=D0=B3=D0=BB=D1=83=D0=B1=D0=B6=D0=B5=20lint-=D1=83=D0=B5?= =?UTF-8?q?=D0=BC=20=D0=B2=D1=85=D0=BE=D0=B4=D1=8F=D1=89=D0=B8=D0=B9=20jso?= =?UTF-8?q?n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Добавлено описание поля misc->good_morning в README * Проверяем входной JSON на наличие всех полей и фиксим дефолтами * Более аккуратная работа с substr - больше перестраховок * Правка коментариев --- README | 17 ++++++++++------- lib/Misc.pm | 39 ++++++++++++++++++++++++++++++--------- 2 files changed, 40 insertions(+), 16 deletions(-) diff --git a/README b/README index 968d78f..ded19b9 100644 --- a/README +++ b/README @@ -26,27 +26,30 @@ mode - public или private misc - объект с дополнительными полями: -misc->answer - 0 если ответ не требуется и 1 если ответ требуется (использован в модуле craniac), значение +misc->answer - 0 если ответ не требуется и 1 если ответ требуется (использован в модуле craniac), значение по-умолчанию 1, если поля нет. -misc->bot_nick - ник бота. Типа как, для разных чятов он может быть разный. (Использовано в модуле craniac.) Если +misc->bot_nick - ник бота. Типа как, для разных чятов он может быть разный. (Использовано в модуле craniac.) Если поле отсутствует, проверка на обращение к боту по нику не происходит. -misc->csign - command sign - значок, которым предваряется команда в чятике.Исторически сложилось так, что для +misc->csign - command sign - значок, которым предваряется команда в чятике. Исторически сложилось так, что для разных ботов этот символ был разный, например, eggdrop использовал точку, а sulci - восклицательный знак. По-умолчанию, aleesa-bot вездепроставляет восклицательный знак, если во входящем сообщении такой настройки нету. Изначально настройка задаётся в конфиге чат-модуля (aleesa-telegram, например). -misc->fwd_cnt - количество пересылок сообщения. Значение по-умолчанию 5. Предполагается, что при пересылке - сообщения,модуль будет инкрементировать это значение и заодно проверять, что оно не превышает +misc->fwd_cnt - количество пересылок сообщения. Значение по-умолчанию 1. Предполагается, что при пересылке + сообщения, модуль будет инкрементировать это значение и заодно проверять, что оно не превышает настройку forwards_max в конфиге или 5, если в конфиге такой настройки нету. -misc->msg_format - Использовать форматирование в сообщении. На текущий момент этот флажок выставляется в модуле +misc->good_morning - флажок признака сообщения-фразы дня, которая по идее осылается в ~8 часов по мск. Используется в + модуле phrases. + +misc->msg_format - Использовать форматирование в сообщении. На текущий момент этот флажок выставляется в модуле telegram и благополучно проходит через модуль misc, далее попадает в модуль phrases, и, наконец, возвращается в модуль telegram, чтобы выходное сообщение было отослано как отформатированное. -misc->username - имя пользователя, по которому к нему надо обратиться в ответе (используется в модуле games). Для +misc->username - имя пользователя, по которому к нему надо обратиться в ответе (используется в модуле games). Для telegram это фактически ссылка на пользователя, как правило с его firstname и lastname (или @username, если firstname и lastname у него нету), чтобы его можно было захайлатить. diff --git a/lib/Misc.pm b/lib/Misc.pm index 4fb647a..44cab9c 100644 --- a/lib/Misc.pm +++ b/lib/Misc.pm @@ -7,7 +7,7 @@ use warnings; use utf8; use open qw (:std :utf8); -use Clone qw (clone); +use Clone qw (clone); # Модули для работы приложения use Log::Any qw ($log); # Чтобы "уж точно" использовать hiredis-биндинги, загрузим этот модуль перед Mojo::Redis @@ -50,13 +50,33 @@ my $parse_message = sub { $answer->{misc}->{answer} = 1; } + unless (defined $answer->{misc}->{bot_nick}) { + $answer->{misc}->{bot_nick} = ''; + } + unless (defined $answer->{misc}->{csign}) { $answer->{misc}->{csign} = '!'; } + + unless (defined $answer->{misc}->{good_morning}) { + $answer->{misc}->{good_morning} = 0; + } + + unless (defined $answer->{misc}->{msg_format}) { + $answer->{misc}->{msg_format} = 0; + } + + unless (defined $answer->{misc}->{username}) { + $answer->{misc}->{username} = ''; + } } else { $answer->{misc}->{answer} = 1; + $answer->{misc}->{bot_nick} = ''; $answer->{misc}->{csign} = '!'; + $answer->{misc}->{fwd_cnt} = 1; + $answer->{misc}->{good_morning} = 0; $answer->{misc}->{msg_format} = 0; + $answer->{misc}->{username} = ''; } # Если сообщение не попало ни под один шаблон, оно отправляется к craniac-у @@ -64,9 +84,11 @@ my $parse_message = sub { $log->debug ('[DEBUG] Incoming message ' . Dumper ($m)); + my $csign = $answer->{misc}->{csign}; + # Пробуем найти команды. Сообщения, начинающиеся с $answer->{misc}->{csign} - if (substr ($m->{message}, 0, length ($answer->{misc}->{csign})) eq $answer->{misc}->{csign}) { - my $cmd = substr $m->{message}, length ($answer->{misc}->{csign}); + if ((length $m->{message} > length $csign) && (substr ($m->{message}, 0, length $csign) eq $csign)) { + my $cmd = substr $m->{message}, length $csign; my $done = 0; # Вначале поищем команды модуля Phrases @@ -83,8 +105,8 @@ my $parse_message = sub { # Потом - команды модуля WebApp unless ($done) { my @webapp_cmd = qw (buni anek анек анекдот cat кис drink праздник fox лис frog лягушка horse лошадь лошадка - monkeyuser rabbit bunny кролик snail улитка owl сова сыч xkcd tits boobs tities boobies - сиси сисечки butt booty ass попа попка); + monkeyuser rabbit bunny кролик snail улитка owl сова сыч xkcd tits boobs tities boobies + сиси сисечки butt booty ass попа попка); while (my $check = pop @webapp_cmd) { if ($cmd eq $check) { @@ -108,12 +130,12 @@ my $parse_message = sub { } } - # И наконец остальные, более сложные команды, с аргументами + # И, наконец, остальные, более сложные команды, с аргументами unless ($done) { my @cmds = ('w ', 'п ', 'weather ', 'погодка ', 'погадка ', 'погода '); while (my $check = pop @cmds) { - if (length ($cmd) > length ($check) && substr ($m->{message}, length ($answer->{misc}->{csign}), length ($check)) eq $check) { + if ((length $cmd > length $check) && substr ($cmd, 0, length $check) eq $check) { $send_to = 'webapp'; $done = 1; last; @@ -124,14 +146,13 @@ my $parse_message = sub { @cmds = ('karma ', 'карма '); while (my $check = pop @cmds) { - if (length ($cmd) > length ($check) && substr ($m->{message}, length ($answer->{misc}->{csign}), length ($check)) eq $check) { + if ((length $cmd > length $check) && substr ($cmd, 0, length $check) eq $check) { $send_to = 'phrases'; $done = 1; last; } } } - # Попробуем найти изменение кармы } elsif (substr ($m->{message}, 0 - length ('++')) eq '++' || substr ($m->{message}, 0 - length ('--')) eq '--') { my @arr = split /\n/, $m->{message};