Loop detection, easter eggs, update readme, update sample config, fix telegram-crippled brain names

This commit is contained in:
eleksir
2022-01-04 15:43:26 +03:00
parent 9c56db452c
commit b7013d6ab0
4 changed files with 70 additions and 22 deletions

View File

@@ -93,3 +93,4 @@ lib_sections = NAME | VERSION | DESCRIPTION | AUTHOR | LICENSE AND COPYRIGHT
[-ControlStructures::ProhibitDeepNests] [-ControlStructures::ProhibitDeepNests]
# Have to use it, so fuckoff # Have to use it, so fuckoff
[-Variables::ProhibitPackageVars]

3
README
View File

@@ -14,7 +14,8 @@ aleesa-craniac
и остальные, для которых ему надо решить нужен ли ответ и по-необходимости сгенерировать его, используя данные в цепях и остальные, для которых ему надо решить нужен ли ответ и по-необходимости сгенерировать его, используя данные в цепях
Маркова. Маркова.
Ответ направляется в redis-канал, указанный в поле plugin входящего сообщения. Ответ направляется в redis-канал, указанный в поле plugin входящего сообщения, если не предполагается некоей особой
логики, связанной с easter egg поведением.
Формат протокола - см README от aleesa-misc. Формат протокола - см README от aleesa-misc.

View File

@@ -1,10 +1,8 @@
{ {
"server" : "redis", "server" : "redis",
"port" : "6379", "port" : "6379",
# inbound redis channels, where we subscribed
"channels": [ "channels": [
"craniac", "craniac"
], ],
# should we fork() and become unix daemon? # should we fork() and become unix daemon?
@@ -22,5 +20,8 @@
"loglevel": "info", "loglevel": "info",
# ditto # ditto
"pid" : "/var/run/aleesa-craniac/aleesa-craniac.pid" "pid" : "/var/run/aleesa-craniac/aleesa-craniac.pid",
# maximal amount of message forwardings, to avoid endless loops
"forwards_max" : 5
} }

View File

@@ -41,6 +41,7 @@ sub RunCraniac ();
my $c = LoadConf (); my $c = LoadConf ();
my $loglevel = $c->{'loglevel'} // 'info'; my $loglevel = $c->{'loglevel'} // 'info';
my $fwd_cnt = $c->{'forward_max'} // 5;
my $logfile; my $logfile;
my $log; my $log;
@@ -107,15 +108,17 @@ sub brains (@) {
unless (defined $hailo->{$chatid}) { unless (defined $hailo->{$chatid}) {
my $cid = $chatid; my $cid = $chatid;
my $brainname;
# Костыль, чтобы не портировать данные из телеграммных мозгов # Костыль, чтобы не портировать данные из телеграммных мозгов
unless ($telegram) { unless ($telegram) {
$cid = utf2sha1 ($chatid); $cid = utf2sha1 ($chatid);
$cid =~ s/\//-/xmsg; $cid =~ s/\//-/xmsg;
$brainname = sprintf '%s/%s.sqlite', $c->{braindir}, $cid;
} else {
$brainname = sprintf '%s/%s.brain.sqlite', $c->{braindir}, $cid;
} }
my $brainname = sprintf '%s/%s.sqlite', $c->{braindir}, $cid;
$hailo->{$chatid} = eval { $hailo->{$chatid} = eval {
Hailo->new ( Hailo->new (
brain => $brainname, brain => $brainname,
@@ -147,6 +150,18 @@ my $parse_message = sub {
# Если $m->{misc}->{answer} не существует, то проставим его как 1, предполагаем, что по-умолчанию ответ от нас # Если $m->{misc}->{answer} не существует, то проставим его как 1, предполагаем, что по-умолчанию ответ от нас
# всё-таки ожидают. Если что - уточним ниже. # всё-таки ожидают. Если что - уточним ниже.
if (defined $m->{misc}) { if (defined $m->{misc}) {
unless (defined $m->{misc}->{fwd_cnt}) {
$m->{misc}->{fwd_cnt} = 1;
} else {
if ($m->{misc}->{fwd_cnt} > $fwd_cnt) {
$log->error ('Forward loop detected, discarding message.');
$log->debug (Dumper $m);
return;
} else {
$m->{misc}->{fwd_cnt}++;
}
}
unless (defined $m->{misc}->{answer}) { unless (defined $m->{misc}->{answer}) {
$m->{misc}->{answer} = 1; $m->{misc}->{answer} = 1;
} }
@@ -251,9 +266,26 @@ my $parse_message = sub {
} }
} else { } else {
# Пока что нам нечего ответить, известных фраз не нашлось. Ищем дальше, на сей раз фразы, зависящие от режима # Пока что нам нечего ответить, известных фраз не нашлось. Ищем дальше, на сей раз фразы, зависящие от режима
# общения - приватного ли публичного. # общения - приватного или публичного.
if ($m->{mode} eq 'private') { if ($m->{mode} eq 'private') {
$phrase =~ s/^\s*(вот\s+)?скажи(\s*мне)?\s*//gui; # Если указанной в unless-е строки во фразе нету, то можно поискать другие приватные фразы
unless ($phrase =~ s/^\s*(вот\s+)?скажи(\s*мне)?\s*//gui) {
if ($phrase =~ /покажи +(сиськи|сиси|титьки)\s*$/ui) {
$send_to = 'webapp';
$reply = '!boobs';
} elsif ($phrase =~ /show +(titts|tities|boobs)\s*$/i) {
$send_to = 'webapp';
$reply = '!boobs';
} elsif ($phrase =~ /покажи +(попку|попу) *$/ui) {
$send_to = 'webapp';
$reply = '!ass';
} elsif ($phrase =~ /show +(ass|butt|butty) *$/i) {
$send_to = 'webapp';
$reply = '!ass';
}
}
unless (defined $reply) {
$phrase =~ s/\s*(,)?\s*а\s*\?$/?/gui; $phrase =~ s/\s*(,)?\s*а\s*\?$/?/gui;
if ($phrase =~ /^\s*кто\s+все\s+эти\s+люди\s*\?\s*$/ui) { if ($phrase =~ /^\s*кто\s+все\s+эти\s+люди\s*\?\s*$/ui) {
@@ -263,6 +295,7 @@ my $parse_message = sub {
} elsif ($phrase =~ /^\s*кто\s+(здесь|тут)\s*\?\s*$/ui) { } elsif ($phrase =~ /^\s*кто\s+(здесь|тут)\s*\?\s*$/ui) {
$reply = 'Ты да я, да мы с тобой.'; $reply = 'Ты да я, да мы с тобой.';
} }
}
# TODO: дописать запрос в webapp, для easter egg-ов, либо делать это на уровне aleesa-misc # TODO: дописать запрос в webapp, для easter egg-ов, либо делать это на уровне aleesa-misc
if (defined ($reply) && $m->{misc}->{answer}) { if (defined ($reply) && $m->{misc}->{answer}) {
@@ -310,7 +343,13 @@ my $parse_message = sub {
# Пытаемся что-то генерировать, если фраза длиннее 3-х букв # Пытаемся что-то генерировать, если фраза длиннее 3-х букв
if (length ($m->{message}) > 3) { if (length ($m->{message}) > 3) {
# Lazy brain init # Lazy brain init
if (brains ($chatid, 1)) { my $telegram = 0;
if ($m->{plugin} eq 'telegram') {
$telegram = 1;
}
if (brains ($chatid, $telegram)) {
$reply = $hailo->{$chatid}->learn_reply ($m->{message}); $reply = $hailo->{$chatid}->learn_reply ($m->{message});
# Если из реактора вернулся undef выдаём "общую" фразу из словаря # Если из реактора вернулся undef выдаём "общую" фразу из словаря
@@ -342,7 +381,13 @@ my $parse_message = sub {
} else { } else {
# пытаемся что-то запоминать, если фраза длиннее 3-х букв # пытаемся что-то запоминать, если фраза длиннее 3-х букв
if (length ($m->{message}) > 3) { if (length ($m->{message}) > 3) {
if (brains ($chatid, 1)) { my $telegram = 0;
if ($m->{plugin} eq 'telegram') {
$telegram = 1;
}
if (brains ($chatid, $telegram)) {
$hailo->{$chatid}->learn ($m->{message}); $hailo->{$chatid}->learn ($m->{message});
} }
} }