Loop detection, easter eggs, update readme, update sample config, fix telegram-crippled brain names
This commit is contained in:
@@ -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
3
README
@@ -14,7 +14,8 @@ aleesa-craniac
|
|||||||
и остальные, для которых ему надо решить нужен ли ответ и по-необходимости сгенерировать его, используя данные в цепях
|
и остальные, для которых ему надо решить нужен ли ответ и по-необходимости сгенерировать его, используя данные в цепях
|
||||||
Маркова.
|
Маркова.
|
||||||
|
|
||||||
Ответ направляется в redis-канал, указанный в поле plugin входящего сообщения.
|
Ответ направляется в redis-канал, указанный в поле plugin входящего сообщения, если не предполагается некоей особой
|
||||||
|
логики, связанной с easter egg поведением.
|
||||||
|
|
||||||
Формат протокола - см README от aleesa-misc.
|
Формат протокола - см README от aleesa-misc.
|
||||||
|
|
||||||
|
|||||||
@@ -1,26 +1,27 @@
|
|||||||
{
|
{
|
||||||
"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?
|
||||||
"daemonize": 1,
|
"daemonize": 1,
|
||||||
|
|
||||||
# caches and other data goes there
|
# caches and other data goes there
|
||||||
"cachedir" : "data/cache",
|
"cachedir" : "data/cache",
|
||||||
"braindir" : "data/brains",
|
"braindir" : "data/brains",
|
||||||
|
|
||||||
# unprivileged system user to run bot as
|
# unprivileged system user to run bot as
|
||||||
"user" : "nobody",
|
"user" : "nobody",
|
||||||
|
|
||||||
# logs goes there
|
# logs goes there
|
||||||
"log" : "/var/log/aleesa-craniac/aleesa-craniac.log",
|
"log" : "/var/log/aleesa-craniac/aleesa-craniac.log",
|
||||||
"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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user