diff --git a/README b/README index 96cf587..f78c3bd 100644 --- a/README +++ b/README @@ -7,7 +7,7 @@ aleesa-craniac Механика работы ----------------------------------------------------------------------------------------------------------------------- Бредогенератор подписан на redis-канал craniac. В этот канал пишет другой демоночек - aleesa-misc. Причём, особенность -такова, что если aleesa-misc не распознала фразу как команду для другого модуля, то по-умолчанию такая фраза +такова, что если aleesa-misc не распознала фразу, как команду для другого модуля, то по-умолчанию такая фраза оправляется в канал craniac, то есть сюда, в "мозги". У бредогенератора есть 2 типа входящих сообщений - ключевые фразы, на которые у него есть готовые (статические) ответы @@ -31,3 +31,9 @@ aleesa-craniac Если всё хорошо, то после запуска redis-а, создания data/config.json из data/config_sample.json, можно запускать и само приложение. + +В каталоге contrib находится скрипт для alpine linux, системы инициализации openrc. Этот скрипт достаточно положить В +/etc/init.d/aleesa-craniac сконфигурить сервис по инструкции выше и после этого сервис запускается командой: +service aleesa-craniac start +в автозагрузку его можно прописать через команду +rc-update add aleesa-craniac default diff --git a/bin/aleesa-craniac b/bin/aleesa-craniac index bf17b04..963b064 100755 --- a/bin/aleesa-craniac +++ b/bin/aleesa-craniac @@ -31,6 +31,7 @@ use File::Basename qw (basename dirname); use File::Path qw (make_path); use Mojo::Log; use POSIX qw (setgid setuid setsid); + use Conf qw (LoadConf); use Craniac qw (RunCraniac); diff --git a/bin/train_lat.pl b/bin/train_lat.pl index e8f5edf..49499f6 100644 --- a/bin/train_lat.pl +++ b/bin/train_lat.pl @@ -1,4 +1,5 @@ #!/usr/bin/perl +# Наполняет отдельный "мозг" с бредом латинскими выражениями use 5.018; use strict; @@ -10,7 +11,7 @@ use version; our $VERSION = qw (1.0); my $workdir; -# before we run, change working dir +# До фактического запуска логики программы, сменим рабочий каталог, чтобы подцепить либы BEGIN { use Cwd qw (chdir abs_path); my @CWD = split /\//xms, abs_path ($PROGRAM_NAME); diff --git a/contrib/aleesa-craniac.openrc b/contrib/aleesa-craniac.openrc new file mode 100644 index 0000000..751365a --- /dev/null +++ b/contrib/aleesa-craniac.openrc @@ -0,0 +1,11 @@ +#!/sbin/openrc-run + +name="$SVCNAME" +command="/var/lib/$SVCNAME/bin/$SVCNAME" +pidfile="/var/run/$SVCNAME/$SVCNAME.pid" + +depend() { + need net redis + use dns + after redis +} diff --git a/cpanfile b/cpanfile index 58ae96d..5282345 100644 --- a/cpanfile +++ b/cpanfile @@ -19,4 +19,4 @@ requires 'POSIX', '0'; requires 'Protocol::Redis::XS', '0'; requires 'Text::Fuzzy', '==0.29'; requires 'utf8', '0'; -requires 'version', '0'; +requires 'version', '==0.9929'; diff --git a/lib/Craniac.pm b/lib/Craniac.pm index e909660..fd1f0e2 100644 --- a/lib/Craniac.pm +++ b/lib/Craniac.pm @@ -1,6 +1,6 @@ package Craniac; # Предполагается, что craniac - это "маршрут по-умолчанию". То есть сюда попадают все фразы, которые не были распознаны -# aleesa-misc как команды. +# aleesa-misc как команды. В том числе и некоторые команды (но по идее это так и задумано). # Основная задача мозгов - распознать, требуется ли ответ и обработать фразу. # Соответсвенно, мы предполагаем, что фразы делятся на 2 типа: @@ -61,6 +61,8 @@ if (defined $logfile) { my $hailo; +# Несколько фраз общего характера, используемые как универсальный ответ, когда ответить нечего (по тем или иным +# причинам) или ответ не будет достаточно вменяемым (слишком похож на фразу, на которую отвечаем) sub RandomCommonPhrase () { my @myphrase = ( 'Так, блядь...', @@ -104,6 +106,7 @@ sub fmatch (@) { } } +# Ленивая инициализация мозга. Создаём/открываем мозг только если нам надо "подумать" а не на каждую входящую фразу. sub brains (@) { my $chatid = shift; my $telegram = shift // 0; @@ -112,7 +115,7 @@ sub brains (@) { my $cid = $chatid; my $brainname; - # Костыль, чтобы не портировать данные из телеграммных мозгов + # Костыль, чтобы не портировать данные из телеграммных мозгов и не заниматься переименованием unless ($telegram) { $cid = utf2sha1 ($chatid); $cid =~ s/\//-/xmsg; @@ -129,9 +132,9 @@ sub brains (@) { }; if (defined $hailo->{$chatid}) { - $log->info (sprintf 'Lazy init brain: %s', $brainname); + $log->info (sprintf '[INFO] Lazy init brain: %s', $brainname); } else { - $log->warn ($EVAL_ERROR); + $log->error ("[ERROR] $EVAL_ERROR"); return 0; } } @@ -156,7 +159,7 @@ my $parse_message = sub { $m->{misc}->{fwd_cnt} = 1; } else { if ($m->{misc}->{fwd_cnt} > $fwd_cnt) { - $log->error ('Forward loop detected, discarding message.'); + $log->error ('[ERROR] Forward loop detected, discarding message.'); $log->debug (Dumper $m); return; } else { @@ -346,13 +349,13 @@ my $parse_message = sub { if ($m->{misc}->{answer}) { # Пытаемся что-то генерировать, если фраза длиннее 3-х букв if (length ($m->{message}) > 3) { - # Lazy brain init my $telegram = 0; if ($m->{plugin} eq 'telegram') { $telegram = 1; } + # Lazy brain init if (brains ($chatid, $telegram)) { $reply = $hailo->{$chatid}->learn_reply ($m->{message}); diff --git a/lib/Craniac/Lat.pm b/lib/Craniac/Lat.pm index 8ba173a..3f571ee 100644 --- a/lib/Craniac/Lat.pm +++ b/lib/Craniac/Lat.pm @@ -19,6 +19,9 @@ use version; our $VERSION = qw (1.0); use Exporter qw (import); our @EXPORT_OK = qw (Train Lat); +# В нашем случае среднее количество слов в фразе равно 3, поэтому ставим 2 :) +my $brain_order = 2; + my $c = LoadConf (); my $brain = $c->{lat}->{brain}; my $srcfile = $c->{lat}->{src}; @@ -49,8 +52,7 @@ sub Train () { my $lat = Hailo->new ( brain => $brain, - # В нашем случае среднее количество слов в фразе равно 3 - order => 2 + order => $brain_order ); $lat->train ($srcfile); @@ -76,8 +78,7 @@ sub Lat () { my $lat = Hailo->new ( brain => $brain, - # В нашем случае среднее количество слов в фразе равно 3 - order => 2, + order => $brain_order, save_on_exit => 0 );