Добавлено поле misc->good_morning, глубже lint-уем входящий json

* Добавлено описание поля misc->good_morning в README
* Проверяем входной JSON на наличие всех полей и фиксим дефолтами
* Более аккуратная работа с substr - больше перестраховок
* Правка коментариев
This commit is contained in:
eleksir
2022-04-04 11:18:27 +03:00
parent 1f821453cb
commit 066e961bd2
2 changed files with 40 additions and 16 deletions

17
README
View File

@@ -26,27 +26,30 @@ mode - public или private
misc - объект с дополнительными полями: misc - объект с дополнительными полями:
misc->answer - 0 если ответ не требуется и 1 если ответ требуется (использован в модуле craniac), значение misc->answer - 0 если ответ не требуется и 1 если ответ требуется (использован в модуле craniac), значение
по-умолчанию 1, если поля нет. по-умолчанию 1, если поля нет.
misc->bot_nick - ник бота. Типа как, для разных чятов он может быть разный. (Использовано в модуле craniac.) Если misc->bot_nick - ник бота. Типа как, для разных чятов он может быть разный. (Использовано в модуле craniac.) Если
поле отсутствует, проверка на обращение к боту по нику не происходит. поле отсутствует, проверка на обращение к боту по нику не происходит.
misc->csign - command sign - значок, которым предваряется команда в чятике.Исторически сложилось так, что для misc->csign - command sign - значок, которым предваряется команда в чятике. Исторически сложилось так, что для
разных ботов этот символ был разный, например, eggdrop использовал точку, а sulci - восклицательный разных ботов этот символ был разный, например, eggdrop использовал точку, а sulci - восклицательный
знак. По-умолчанию, aleesa-bot вездепроставляет восклицательный знак, если во входящем сообщении знак. По-умолчанию, aleesa-bot вездепроставляет восклицательный знак, если во входящем сообщении
такой настройки нету. Изначально настройка задаётся в конфиге чат-модуля (aleesa-telegram, такой настройки нету. Изначально настройка задаётся в конфиге чат-модуля (aleesa-telegram,
например). например).
misc->fwd_cnt - количество пересылок сообщения. Значение по-умолчанию 5. Предполагается, что при пересылке misc->fwd_cnt - количество пересылок сообщения. Значение по-умолчанию 1. Предполагается, что при пересылке
сообщения,модуль будет инкрементировать это значение и заодно проверять, что оно не превышает сообщения, модуль будет инкрементировать это значение и заодно проверять, что оно не превышает
настройку forwards_max в конфиге или 5, если в конфиге такой настройки нету. настройку forwards_max в конфиге или 5, если в конфиге такой настройки нету.
misc->msg_format - Использовать форматирование в сообщении. На текущий момент этот флажок выставляется в модуле misc->good_morning - флажок признака сообщения-фразы дня, которая по идее осылается в ~8 часов по мск. Используется в
модуле phrases.
misc->msg_format - Использовать форматирование в сообщении. На текущий момент этот флажок выставляется в модуле
telegram и благополучно проходит через модуль misc, далее попадает в модуль phrases, и, наконец, telegram и благополучно проходит через модуль misc, далее попадает в модуль phrases, и, наконец,
возвращается в модуль telegram, чтобы выходное сообщение было отослано как отформатированное. возвращается в модуль telegram, чтобы выходное сообщение было отослано как отформатированное.
misc->username - имя пользователя, по которому к нему надо обратиться в ответе (используется в модуле games). Для misc->username - имя пользователя, по которому к нему надо обратиться в ответе (используется в модуле games). Для
telegram это фактически ссылка на пользователя, как правило с его firstname и lastname (или telegram это фактически ссылка на пользователя, как правило с его firstname и lastname (или
@username, если firstname и lastname у него нету), чтобы его можно было захайлатить. @username, если firstname и lastname у него нету), чтобы его можно было захайлатить.

View File

@@ -7,7 +7,7 @@ use warnings;
use utf8; use utf8;
use open qw (:std :utf8); use open qw (:std :utf8);
use Clone qw (clone); use Clone qw (clone);
# Модули для работы приложения # Модули для работы приложения
use Log::Any qw ($log); use Log::Any qw ($log);
# Чтобы "уж точно" использовать hiredis-биндинги, загрузим этот модуль перед Mojo::Redis # Чтобы "уж точно" использовать hiredis-биндинги, загрузим этот модуль перед Mojo::Redis
@@ -50,13 +50,33 @@ my $parse_message = sub {
$answer->{misc}->{answer} = 1; $answer->{misc}->{answer} = 1;
} }
unless (defined $answer->{misc}->{bot_nick}) {
$answer->{misc}->{bot_nick} = '';
}
unless (defined $answer->{misc}->{csign}) { unless (defined $answer->{misc}->{csign}) {
$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 { } else {
$answer->{misc}->{answer} = 1; $answer->{misc}->{answer} = 1;
$answer->{misc}->{bot_nick} = '';
$answer->{misc}->{csign} = '!'; $answer->{misc}->{csign} = '!';
$answer->{misc}->{fwd_cnt} = 1;
$answer->{misc}->{good_morning} = 0;
$answer->{misc}->{msg_format} = 0; $answer->{misc}->{msg_format} = 0;
$answer->{misc}->{username} = '';
} }
# Если сообщение не попало ни под один шаблон, оно отправляется к craniac-у # Если сообщение не попало ни под один шаблон, оно отправляется к craniac-у
@@ -64,9 +84,11 @@ my $parse_message = sub {
$log->debug ('[DEBUG] Incoming message ' . Dumper ($m)); $log->debug ('[DEBUG] Incoming message ' . Dumper ($m));
my $csign = $answer->{misc}->{csign};
# Пробуем найти команды. Сообщения, начинающиеся с $answer->{misc}->{csign} # Пробуем найти команды. Сообщения, начинающиеся с $answer->{misc}->{csign}
if (substr ($m->{message}, 0, length ($answer->{misc}->{csign})) eq $answer->{misc}->{csign}) { if ((length $m->{message} > length $csign) && (substr ($m->{message}, 0, length $csign) eq $csign)) {
my $cmd = substr $m->{message}, length ($answer->{misc}->{csign}); my $cmd = substr $m->{message}, length $csign;
my $done = 0; my $done = 0;
# Вначале поищем команды модуля Phrases # Вначале поищем команды модуля Phrases
@@ -83,8 +105,8 @@ my $parse_message = sub {
# Потом - команды модуля WebApp # Потом - команды модуля WebApp
unless ($done) { unless ($done) {
my @webapp_cmd = qw (buni anek анек анекдот cat кис drink праздник fox лис frog лягушка horse лошадь лошадка my @webapp_cmd = qw (buni anek анек анекдот cat кис drink праздник fox лис frog лягушка horse лошадь лошадка
monkeyuser rabbit bunny кролик snail улитка owl сова сыч xkcd tits boobs tities boobies monkeyuser rabbit bunny кролик snail улитка owl сова сыч xkcd tits boobs tities boobies
сиси сисечки butt booty ass попа попка); сиси сисечки butt booty ass попа попка);
while (my $check = pop @webapp_cmd) { while (my $check = pop @webapp_cmd) {
if ($cmd eq $check) { if ($cmd eq $check) {
@@ -108,12 +130,12 @@ my $parse_message = sub {
} }
} }
# И наконец остальные, более сложные команды, с аргументами # И, наконец, остальные, более сложные команды, с аргументами
unless ($done) { unless ($done) {
my @cmds = ('w ', 'п ', 'weather ', 'погодка ', 'погадка ', 'погода '); my @cmds = ('w ', 'п ', 'weather ', 'погодка ', 'погадка ', 'погода ');
while (my $check = pop @cmds) { 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'; $send_to = 'webapp';
$done = 1; $done = 1;
last; last;
@@ -124,14 +146,13 @@ my $parse_message = sub {
@cmds = ('karma ', 'карма '); @cmds = ('karma ', 'карма ');
while (my $check = pop @cmds) { 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'; $send_to = 'phrases';
$done = 1; $done = 1;
last; last;
} }
} }
} }
# Попробуем найти изменение кармы # Попробуем найти изменение кармы
} elsif (substr ($m->{message}, 0 - length ('++')) eq '++' || substr ($m->{message}, 0 - length ('--')) eq '--') { } elsif (substr ($m->{message}, 0 - length ('++')) eq '++' || substr ($m->{message}, 0 - length ('--')) eq '--') {
my @arr = split /\n/, $m->{message}; my @arr = split /\n/, $m->{message};