Minor fixes for v1.0 release, mostly comments, add openrc init script
This commit is contained in:
8
README
8
README
@@ -7,7 +7,7 @@ aleesa-craniac
|
|||||||
Механика работы
|
Механика работы
|
||||||
-----------------------------------------------------------------------------------------------------------------------
|
-----------------------------------------------------------------------------------------------------------------------
|
||||||
Бредогенератор подписан на redis-канал craniac. В этот канал пишет другой демоночек - aleesa-misc. Причём, особенность
|
Бредогенератор подписан на redis-канал craniac. В этот канал пишет другой демоночек - aleesa-misc. Причём, особенность
|
||||||
такова, что если aleesa-misc не распознала фразу как команду для другого модуля, то по-умолчанию такая фраза
|
такова, что если aleesa-misc не распознала фразу, как команду для другого модуля, то по-умолчанию такая фраза
|
||||||
оправляется в канал craniac, то есть сюда, в "мозги".
|
оправляется в канал craniac, то есть сюда, в "мозги".
|
||||||
|
|
||||||
У бредогенератора есть 2 типа входящих сообщений - ключевые фразы, на которые у него есть готовые (статические) ответы
|
У бредогенератора есть 2 типа входящих сообщений - ключевые фразы, на которые у него есть готовые (статические) ответы
|
||||||
@@ -31,3 +31,9 @@ aleesa-craniac
|
|||||||
|
|
||||||
Если всё хорошо, то после запуска redis-а, создания data/config.json из data/config_sample.json, можно запускать и само
|
Если всё хорошо, то после запуска 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
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ use File::Basename qw (basename dirname);
|
|||||||
use File::Path qw (make_path);
|
use File::Path qw (make_path);
|
||||||
use Mojo::Log;
|
use Mojo::Log;
|
||||||
use POSIX qw (setgid setuid setsid);
|
use POSIX qw (setgid setuid setsid);
|
||||||
|
|
||||||
use Conf qw (LoadConf);
|
use Conf qw (LoadConf);
|
||||||
use Craniac qw (RunCraniac);
|
use Craniac qw (RunCraniac);
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/usr/bin/perl
|
#!/usr/bin/perl
|
||||||
|
# Наполняет отдельный "мозг" с бредом латинскими выражениями
|
||||||
|
|
||||||
use 5.018;
|
use 5.018;
|
||||||
use strict;
|
use strict;
|
||||||
@@ -10,7 +11,7 @@ use version; our $VERSION = qw (1.0);
|
|||||||
|
|
||||||
my $workdir;
|
my $workdir;
|
||||||
|
|
||||||
# before we run, change working dir
|
# До фактического запуска логики программы, сменим рабочий каталог, чтобы подцепить либы
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use Cwd qw (chdir abs_path);
|
use Cwd qw (chdir abs_path);
|
||||||
my @CWD = split /\//xms, abs_path ($PROGRAM_NAME);
|
my @CWD = split /\//xms, abs_path ($PROGRAM_NAME);
|
||||||
|
|||||||
11
contrib/aleesa-craniac.openrc
Normal file
11
contrib/aleesa-craniac.openrc
Normal file
@@ -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
|
||||||
|
}
|
||||||
2
cpanfile
2
cpanfile
@@ -19,4 +19,4 @@ requires 'POSIX', '0';
|
|||||||
requires 'Protocol::Redis::XS', '0';
|
requires 'Protocol::Redis::XS', '0';
|
||||||
requires 'Text::Fuzzy', '==0.29';
|
requires 'Text::Fuzzy', '==0.29';
|
||||||
requires 'utf8', '0';
|
requires 'utf8', '0';
|
||||||
requires 'version', '0';
|
requires 'version', '==0.9929';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package Craniac;
|
package Craniac;
|
||||||
# Предполагается, что craniac - это "маршрут по-умолчанию". То есть сюда попадают все фразы, которые не были распознаны
|
# Предполагается, что craniac - это "маршрут по-умолчанию". То есть сюда попадают все фразы, которые не были распознаны
|
||||||
# aleesa-misc как команды.
|
# aleesa-misc как команды. В том числе и некоторые команды (но по идее это так и задумано).
|
||||||
|
|
||||||
# Основная задача мозгов - распознать, требуется ли ответ и обработать фразу.
|
# Основная задача мозгов - распознать, требуется ли ответ и обработать фразу.
|
||||||
# Соответсвенно, мы предполагаем, что фразы делятся на 2 типа:
|
# Соответсвенно, мы предполагаем, что фразы делятся на 2 типа:
|
||||||
@@ -61,6 +61,8 @@ if (defined $logfile) {
|
|||||||
|
|
||||||
my $hailo;
|
my $hailo;
|
||||||
|
|
||||||
|
# Несколько фраз общего характера, используемые как универсальный ответ, когда ответить нечего (по тем или иным
|
||||||
|
# причинам) или ответ не будет достаточно вменяемым (слишком похож на фразу, на которую отвечаем)
|
||||||
sub RandomCommonPhrase () {
|
sub RandomCommonPhrase () {
|
||||||
my @myphrase = (
|
my @myphrase = (
|
||||||
'Так, блядь...',
|
'Так, блядь...',
|
||||||
@@ -104,6 +106,7 @@ sub fmatch (@) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Ленивая инициализация мозга. Создаём/открываем мозг только если нам надо "подумать" а не на каждую входящую фразу.
|
||||||
sub brains (@) {
|
sub brains (@) {
|
||||||
my $chatid = shift;
|
my $chatid = shift;
|
||||||
my $telegram = shift // 0;
|
my $telegram = shift // 0;
|
||||||
@@ -112,7 +115,7 @@ sub brains (@) {
|
|||||||
my $cid = $chatid;
|
my $cid = $chatid;
|
||||||
my $brainname;
|
my $brainname;
|
||||||
|
|
||||||
# Костыль, чтобы не портировать данные из телеграммных мозгов
|
# Костыль, чтобы не портировать данные из телеграммных мозгов и не заниматься переименованием
|
||||||
unless ($telegram) {
|
unless ($telegram) {
|
||||||
$cid = utf2sha1 ($chatid);
|
$cid = utf2sha1 ($chatid);
|
||||||
$cid =~ s/\//-/xmsg;
|
$cid =~ s/\//-/xmsg;
|
||||||
@@ -129,9 +132,9 @@ sub brains (@) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (defined $hailo->{$chatid}) {
|
if (defined $hailo->{$chatid}) {
|
||||||
$log->info (sprintf 'Lazy init brain: %s', $brainname);
|
$log->info (sprintf '[INFO] Lazy init brain: %s', $brainname);
|
||||||
} else {
|
} else {
|
||||||
$log->warn ($EVAL_ERROR);
|
$log->error ("[ERROR] $EVAL_ERROR");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -156,7 +159,7 @@ my $parse_message = sub {
|
|||||||
$m->{misc}->{fwd_cnt} = 1;
|
$m->{misc}->{fwd_cnt} = 1;
|
||||||
} else {
|
} else {
|
||||||
if ($m->{misc}->{fwd_cnt} > $fwd_cnt) {
|
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);
|
$log->debug (Dumper $m);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
@@ -346,13 +349,13 @@ my $parse_message = sub {
|
|||||||
if ($m->{misc}->{answer}) {
|
if ($m->{misc}->{answer}) {
|
||||||
# Пытаемся что-то генерировать, если фраза длиннее 3-х букв
|
# Пытаемся что-то генерировать, если фраза длиннее 3-х букв
|
||||||
if (length ($m->{message}) > 3) {
|
if (length ($m->{message}) > 3) {
|
||||||
# Lazy brain init
|
|
||||||
my $telegram = 0;
|
my $telegram = 0;
|
||||||
|
|
||||||
if ($m->{plugin} eq 'telegram') {
|
if ($m->{plugin} eq 'telegram') {
|
||||||
$telegram = 1;
|
$telegram = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Lazy brain init
|
||||||
if (brains ($chatid, $telegram)) {
|
if (brains ($chatid, $telegram)) {
|
||||||
$reply = $hailo->{$chatid}->learn_reply ($m->{message});
|
$reply = $hailo->{$chatid}->learn_reply ($m->{message});
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,9 @@ use version; our $VERSION = qw (1.0);
|
|||||||
use Exporter qw (import);
|
use Exporter qw (import);
|
||||||
our @EXPORT_OK = qw (Train Lat);
|
our @EXPORT_OK = qw (Train Lat);
|
||||||
|
|
||||||
|
# В нашем случае среднее количество слов в фразе равно 3, поэтому ставим 2 :)
|
||||||
|
my $brain_order = 2;
|
||||||
|
|
||||||
my $c = LoadConf ();
|
my $c = LoadConf ();
|
||||||
my $brain = $c->{lat}->{brain};
|
my $brain = $c->{lat}->{brain};
|
||||||
my $srcfile = $c->{lat}->{src};
|
my $srcfile = $c->{lat}->{src};
|
||||||
@@ -49,8 +52,7 @@ sub Train () {
|
|||||||
|
|
||||||
my $lat = Hailo->new (
|
my $lat = Hailo->new (
|
||||||
brain => $brain,
|
brain => $brain,
|
||||||
# В нашем случае среднее количество слов в фразе равно 3
|
order => $brain_order
|
||||||
order => 2
|
|
||||||
);
|
);
|
||||||
|
|
||||||
$lat->train ($srcfile);
|
$lat->train ($srcfile);
|
||||||
@@ -76,8 +78,7 @@ sub Lat () {
|
|||||||
|
|
||||||
my $lat = Hailo->new (
|
my $lat = Hailo->new (
|
||||||
brain => $brain,
|
brain => $brain,
|
||||||
# В нашем случае среднее количество слов в фразе равно 3
|
order => $brain_order,
|
||||||
order => 2,
|
|
||||||
save_on_exit => 0
|
save_on_exit => 0
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user