diff --git a/Migration.txt b/Migration.txt deleted file mode 100644 index 5e7f089..0000000 --- a/Migration.txt +++ /dev/null @@ -1,30 +0,0 @@ -Migration procedure. - -When you require to perform this procedure? -- When perl version is changed -- When migration to other OS or distribution occurs - -Why do i have to perform this procedure? -- Some modules are vendored with bot -- BDB can vary its on-disk format depending on dbd version that linked with - perl interpreter itself and its appropriate module. - -How can i guess that i miss to perform this procedure? -Most notable symptom is 'BDB0091 DB_VERSION_MISMATCH' in logs and bot admin settings are lost. - - -Procedure steps. - -On source system perform following steps: -1. stop the bot, to unlock and close all files. -2. make a backup -3. prepare target system and copy bot to target system - -On target system perform these steps: -1. remove vendor_perl dir in bot' directory -2. run "bash bootstrap.sh" (no quotes) and wait until it successfully build and - install required modules. -3. run perl bin/cache_import.pl script. It should create cache and exit - silently. - -Now it is possible to run bot without settings loss. diff --git a/bin/cache_export.pl b/bin/cache_export.pl deleted file mode 100644 index a84d82a..0000000 --- a/bin/cache_export.pl +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/perl - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use English qw ( -no_match_vars ); -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); - if ($#CWD > 1) { $#CWD = $#CWD - 2; } - $workdir = join '/', @CWD; - chdir $workdir; -} - -use lib ("$workdir/lib", "$workdir/vendor_perl", "$workdir/vendor_perl/lib/perl5"); -use CHI; -use CHI::Driver::BerkeleyDB; -use File::Basename qw (dirname); -use File::Path qw (make_path); -use JSON::XS; -use Encode; - -use BotLib::Conf qw (LoadConf); - -my $c = LoadConf (); -my $cachedir = $c->{cachedir}; -my $datadir = dirname $cachedir; -my $export = 0; -my $exportInst = 0; - -sub dumpCache { - my $namespace = shift; - my $cacheExportDir = sprintf '%s/cacheexport', $datadir; - - unless (-d $cacheExportDir) { - make_path ($cacheExportDir) || die "Unable to create $cacheExportDir: $OS_ERROR\n"; - } - - my $filename = sprintf '%s/%s', $cacheExportDir, $exportInst; - - my $cache = CHI->new ( - driver => 'BerkeleyDB', - root_dir => $cachedir, - namespace => $namespace - ); - - my $j; - my $writefile = 0; - - foreach my $k ($cache->get_keys ()) { - $k = decode ('UTF-8', $k); - $j->{$k} = decode ('UTF-8', $cache->get ($k)); - $writefile = 1; - } - - if ($writefile) { - say "Dumping $namespace"; ## no critic (InputOutput::RequireCheckedSyscalls) - my $jsonencoder = JSON::XS->new->pretty (); - open (my $FILE, '>', $filename) or die "Unable to dump cache namespace $namespace to $filename: $OS_ERROR\n"; - print $FILE $jsonencoder->encode ($j) or die "Unable to dump cache namespace $namespace to $filename: $OS_ERROR\n";; - close $FILE; ## no critic (InputOutput::RequireCheckedSyscalls) - my $EXPORTFD; - - if ($export) { - open ($EXPORTFD, '>>', "$cacheExportDir/exportfiles.txt") or die "Unable to open for appending $cacheExportDir/exportfiles.txt: $OS_ERROR\n"; - } else { - open ($EXPORTFD, '>', "$cacheExportDir/exportfiles.txt") or die "Unable to create $cacheExportDir/exportfiles.txt: $OS_ERROR\n"; - $export = 1; - } - - printf ($EXPORTFD "%s,%s\n", $namespace, $filename) or die "Unable to write to $cacheExportDir/exportfiles.txt: $OS_ERROR\n"; - close $EXPORTFD; ## no critic (InputOutput::RequireCheckedSyscalls) - $exportInst++; - } - - return; -} - -opendir (my $DIR, $cachedir) or die "Unable to open $cachedir: $OS_ERROR\n"; - -while (readdir $DIR) { - if (/^BotLib\+3a\+3aAdmin_censor_(.+)\.db$/) { - dumpCache ("BotLib::Admin_censor_$1"); - } elsif (/^BotLib\+3a\+3aAdmin_fortune.db$/) { - dumpCache ('BotLib::Admin_fortune'); - } elsif (/BotLib\+3a\+3aAdmin_plugin_(.+)\.db$/) { - dumpCache ("BotLib::Admin_plugin_$1"); - } elsif (/BotLib\+3a\+3aAdmin_(.+)\.db$/) { - dumpCache ("BotLib::Admin_$1"); - } elsif (/^BotLib\+3a\+3aImage\+3a\+3aFlickr\.db$/) { - dumpCache ('BotLib::Image::Flickr'); - } elsif (/^BotLib\+3a\+3aKarma_(.+)\.db$/) { - dumpCache ("BotLib::Karma_$1"); - } -} - -closedir $DIR; -exit 0; - diff --git a/bin/cache_import.pl b/bin/cache_import.pl deleted file mode 100644 index 159c162..0000000 --- a/bin/cache_import.pl +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/perl - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use English qw ( -no_match_vars ); -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); - if ($#CWD > 1) { $#CWD = $#CWD - 2; } - $workdir = join '/', @CWD; - chdir $workdir; -} - -use lib ("$workdir/lib", "$workdir/vendor_perl", "$workdir/vendor_perl/lib/perl5"); -use CHI; -use CHI::Driver::BerkeleyDB; -use File::Basename qw (dirname); -use File::Path qw (make_path); -use JSON::XS; -use Encode; - -use BotLib::Conf qw (LoadConf); - -my $c = LoadConf (); -my $cachedir = $c->{cachedir}; -my $datadir = dirname $cachedir; -my $export = 0; - -sub createCache { - my $namespace = shift; - my $filename = shift; - say "Creating $namespace from $filename"; ## no critic (InputOutput::RequireCheckedSyscalls) - - my $cache = CHI->new ( - driver => 'BerkeleyDB', - root_dir => $cachedir, - namespace => $namespace - ); - - open my $FH, '<', $filename or die "Unable to open $filename: $OS_ERROR\n"; - binmode $FH; - my $len = (stat $filename) [7]; - my $json; - use bytes; - my $readlen = read $FH, $json, $len; - no bytes; - - unless ($readlen) { - close $FH; ## no critic (InputOutput::RequireCheckedSyscalls - die "Unable to read $filename: $OS_ERROR\n"; - } - - if ($readlen != $len) { - close $FH; ## no critic (InputOutput::RequireCheckedSyscalls - die "File $filename is $len bytes on disk, but we read only $readlen bytes\n"; - } - - close $FH; ## no critic (InputOutput::RequireCheckedSyscalls - my $j = JSON::XS->new->utf8->relaxed; - my $dump = $j->decode ($json); - - foreach my $key (keys (%{$dump})) { - $cache->set ($key, $dump->{$key}, 'never'); - } - - return; -} - -open (my $FH, '<', "$datadir/cacheexport/exportfiles.txt") or die "Unable to open $datadir/cacheexport/exportfiles.txt: $OS_ERROR\n"; - -while (<$FH>) { - chomp; - my ($namespace, $filename) = split /\,/, $_, 2; - createCache ($namespace, $filename); -} - -close $FH; ## no critic (InputOutput::RequireCheckedSyscalls) -exit 0; diff --git a/bin/flickr.pl b/bin/flickr.pl deleted file mode 100644 index 88e478d..0000000 --- a/bin/flickr.pl +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/perl - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use English qw ( -no_match_vars ); -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); - if ($#CWD > 1) { $#CWD = $#CWD - 2; } - $workdir = join '/', @CWD; - chdir $workdir; -} - -use lib ("$workdir/lib", "$workdir/vendor_perl", "$workdir/vendor_perl/lib/perl5"); -use BotLib::Image::Flickr qw (FlickrByTags); - -my $url = FlickrByTags ('bird,owl'); - -if ($url) { - say $url; ## no critic (InputOutput::RequireCheckedSyscalls) - exit 0; -} else { - exit 1; -} diff --git a/bin/flickr_init.pl b/bin/flickr_init.pl deleted file mode 100644 index 0d58b19..0000000 --- a/bin/flickr_init.pl +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/perl - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use English qw ( -no_match_vars ); -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); - if ($#CWD > 1) { $#CWD = $#CWD - 2; } - $workdir = join '/', @CWD; - chdir $workdir; -} - -use lib ("$workdir/lib", "$workdir/vendor_perl", "$workdir/vendor_perl/lib/perl5"); -use BotLib::Image::Flickr qw (FlickrInit); - -if (FlickrInit ()) { - exit 0; -} else { - exit 1; -} diff --git a/bin/flickr_test.pl b/bin/flickr_test.pl deleted file mode 100644 index 7d9b0bf..0000000 --- a/bin/flickr_test.pl +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/perl - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use English qw ( -no_match_vars ); -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); - if ($#CWD > 1) { $#CWD = $#CWD - 2; } - $workdir = join '/', @CWD; - chdir $workdir; -} - -use lib ("$workdir/lib", "$workdir/vendor_perl", "$workdir/vendor_perl/lib/perl5"); -use BotLib::Image::Flickr qw (FlickrTestLogin); - -if (FlickrTestLogin ()) { - exit 0; -} else { - exit 1; -} diff --git a/bin/fortune_seed.pl b/bin/fortune_seed.pl deleted file mode 100644 index a6f5b7d..0000000 --- a/bin/fortune_seed.pl +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/perl - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use English qw ( -no_match_vars ); -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); - if ($#CWD > 1) { $#CWD = $#CWD - 2; } - $workdir = join '/', @CWD; - chdir $workdir; -} - -use lib ("$workdir/lib", "$workdir/vendor_perl", "$workdir/vendor_perl/lib/perl5"); -use BotLib::Fortune qw (Seed); - -Seed (); -exit 0; diff --git a/bin/friday_seed.pl b/bin/friday_seed.pl deleted file mode 100644 index 3cf3e51..0000000 --- a/bin/friday_seed.pl +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/perl - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use English qw ( -no_match_vars ); -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); - if ($#CWD > 1) { $#CWD = $#CWD - 2; } - $workdir = join '/', @CWD; - chdir $workdir; -} - -use lib ("$workdir/lib", "$workdir/vendor_perl", "$workdir/vendor_perl/lib/perl5"); -use BotLib::Friday qw (Seed); - -Seed (); -exit 0; diff --git a/bin/proverb_seed.pl b/bin/proverb_seed.pl deleted file mode 100644 index 9c9a01f..0000000 --- a/bin/proverb_seed.pl +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/perl - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use English qw ( -no_match_vars ); -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); - if ($#CWD > 1) { $#CWD = $#CWD - 2; } - $workdir = join '/', @CWD; - chdir $workdir; -} - -use lib ("$workdir/lib", "$workdir/vendor_perl", "$workdir/vendor_perl/lib/perl5"); -use BotLib::Proverb qw (Seed); - -Seed (); -exit 0; diff --git a/bin/redis_msg_gen.pl b/bin/redis_msg_gen.pl deleted file mode 100644 index 0abb8b1..0000000 --- a/bin/redis_msg_gen.pl +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/perl - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use English qw ( -no_match_vars ); - -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); - if ($#CWD > 1) { $#CWD = $#CWD - 2; } - $workdir = join '/', @CWD; - chdir $workdir; -} - -use lib ("$workdir/lib", "$workdir/vendor_perl", "$workdir/vendor_perl/lib/perl5"); -use Cli qw (RunCli); - -RunCli (); - -exit 0; - -__END__ -# vim: set ft=perl noet ai ts=4 sw=4 sts=4: diff --git a/bin/train_lat.pl b/bin/train_lat.pl deleted file mode 100644 index 5ef0f02..0000000 --- a/bin/train_lat.pl +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/perl - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use English qw ( -no_match_vars ); -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); - if ($#CWD > 1) { $#CWD = $#CWD - 2; } - $workdir = join '/', @CWD; - chdir $workdir; -} - -use lib ("$workdir/lib", "$workdir/vendor_perl", "$workdir/vendor_perl/lib/perl5"); -use BotLib::Lat qw (Train); - -Train (); -exit 0; diff --git a/cpanfile b/cpanfile index aca9c4d..f16462a 100644 --- a/cpanfile +++ b/cpanfile @@ -1,4 +1,5 @@ requires 'Carp'; +requires 'Clone'; requires 'CHI'; requires 'CHI::Driver::BerkeleyDB'; requires 'Cwd::utf8'; diff --git a/data/fortune_src/citates b/data/fortune_src/citates deleted file mode 100644 index b019f4c..0000000 --- a/data/fortune_src/citates +++ /dev/null @@ -1,521 +0,0 @@ -Что сказал Берлиоз своей музыкой? - ничего; но как потрясающе он это -сказал. - -- Джеймс Гиббонз Хьюнекер -% -Музыка будет по-немецки, вы не поймете. - -- Оскар Уайльд -% -Четвертый раз смотрю этот фильм и должна вам сказать, что сегодня актеры -играли как никогда. - -- Фаина Раневская -% -Продолжительность фильма определяется выносливостью мочевого пузыря -обычного зрителя. - -- Альфред Хичкок -% -А что, если наша Земля - ад какой-нибудь другой планеты? - -- Олдос Хаксли -% -Если видишь женщину голой достаточно долго, опять начинаешь обращать -внимание на ее лицо. - -- Генри Миллер -% -Самое главное - выглядеть совершенно естественно; но для этого нужно очень -много косметики. - -- Кельвин Кляйн -% -Любовь - лучшая косметика. Но косметику купить легче. - -- Ив Сен-Лоран -% -Людей без лишнего веса больше всего на кладбище. - -- Биверли Силлз -% -Лучше быть молодым навозным жуков, чем старой райской птицей. - -- Марк Твен -% -К старости недостатки ума становятся все заметнее, как и недостатки -внешности. - -- Франсуа Ларошфуко -% -Лучше быть старой, чем мертвой. - -- Бриджит Бардо -% -Вечеринка с коктейлями: место, где можно встретить людей, которые пьют так -много, что вы не можете вспомнить их имена. - -- Космо Сардо -% -Средство от похмелья: выжать сок из двух бутылок виски... - -- Эдди Кондон -% -Дважды два уже четыре, а будет еще лучше. - -- Хенрик Ягодзинский -% -Я сидел на диете 14 дней и потерял всего две недели. - -- Тоти Филдс -% -В жизни можно полагаться только на себя самого. Да и то не советую! - -- Тристан Бернар -% -Источник нашей мудрости - наш опыт. Источник нашего опыта - наша глупость. - -- Саша Гитри -% -Уходя на тот свет, не забудь выключить этот. - -- Виктор Коваль -% -Я не верю ни единому слову из того, что вы говорите... или я вам. - -- Оскар Уайльд -% -Я думаю, мы должны говорить правду или хотя бы говорить то, что мы думаем. - -- Юрий Лужков -% -Нельзя иметь все. Куда вы это положите? - -- Стивен Райт -% -Сначала забываешь имена, потом забываешь лица, потом забываешь застегивать -ширинку, потом забываешь расстегивать ширинку. - -- Лео Розенберг -% -Время - лучший учитель, но, к сожалению, оно убивает своих учеников. - -- Гектор Берлиоз -% -Прошлое - чужая страна, там все по-другому. - -- Лесли Хартли -% -Помните о бедняках - это не требует никаких расходов. - -- Генри Уиллер Шоу -% -Я люблю своих детей, но некоторые мне не нравятся. - -- Лилиан Картер, мать президента США Д.Картера -% -Дружба - это когда можно ни с того ни с сего приехать к человеку -и поселиться у него. - -- Давид Самойлов -% -Врагов я забрасываю цветами - в гробу! - -- Сальвадор Дали -% -Я не боюсь умереть. Я просто не хочу при этом присутствовать. - -- Вуди Аллен -% -Какой замечательный некролог! С таким бы жить и жить! - -- М.Генин -% -Твои шансы выиграть в лотерею возрастут, если ты купишь билет. - -- Уинстон Грум из "Правил Фореста Гампа" -% -Пока вы ищете, кого бы стоило полюбить, вам нужен кто-то, кто любит вас. - -- Шейла Делейни -% -Если двое любят друг друга, это не может счастливо кончиться. - -- Э.Хемингуэй -% -Я порвала с ним через три года. Это была типичная любовь-ненависть. Мы оба -любили его и ненавидели меня. - -- Кэрол Зискинд -% -В тех кругах, в которых я вращаюсь, переспать с женщиной - недостаточный -повод для того, чтобы быть ей представленным. - -- Вирджиния Маклауд -% -Она говорила на восемнадцати языках и ни на одном из них не умела сказать -"нет". - -- Дороти Паркер -% -Помни: в пяти случаях из шести свет в конце туннеля - это свет -надвигающегося поезда. - -- Пол Диксон -% -Все соседи плохи, но верхние хуже нижних. - -- Константин Мелихан -% -Америка - единственный матриархат, под сенью которого женщины ведут борьбу -за равные права. - -- А. Рот -% -Брак - это лотерея, но в случае проигрыша вы не можете порвать свой билет. - -- Ф. Ноулз -% -Британский солдат устоит против кого угодно, только не против Британского -министерства обороны. - -- Бернард Шоу -% -Век наш таков, что он гордится машинами, умеющими думать, и побаивается -людей, которые пытаются проявить ту же способность. - -- Г.Мамфорд Джонс -% -Военная мудрость есть понятие, заключающее противоречие в самом себе. -Война - слишком серьезное дело, чтобы доверять его военным. - -- Талейран -% -Выход из беды найти не столь просто, как попасть в нее. - -- Эд Хау -% -Граница в политической географии - воображаемая линия между двумя -государствами, отделяющая воображаемые права одного от воображаемых прав -другого. - -- А.Бирс -% -Да не устрашит тебя величие: одни рождаются великими, другие достигают -величия, третьим его навязывают. - -- Уильям Шекспир -% -Две тысячи лет нам поставляли примеры для подражания, и теперь ничто нас -не извиняет, если мы, воюя, воем плохо. - -- Т.Э. Лоуренс -% -Дипломная работа среднего выпускника университета есть не что иное, как -кости, перенесенные из одной могилы в другую. - -- Дж. Фрэнк Доуби -% -Для любой волнующей человека проблемы всегда легко найти решение - -простое, достижимое и ошибочное. - -- Г.Л. Менкен -% -Добрым словом и револьвером вы можете добиться гораздо большего, чем одним -только добрым словом. - -- Аль Капоне -% -Если вы не восходящий, значит, вы ниспадающий. - -- Стивен Поттер -% -Если честолюбивая мечта не заставляет вас страдать, значит, ее у вас нет. - -- К. Норрис -% -Идеалист тот, кто, заметив, что роза пахнет лучше капусты, заключает, что -и суп из нее будет лучше. - -- Г. Менкен -% -Жизнь что луковица - вы чистите ее, снимая слой за слоем, и иногда -плачете. - -- С. Сандберг -% -Когда люди вольны поступать как угодно, они обычно подражают друг другу. - -- Э. Хоффер -% -Коли все думают одинаково, значит, никто особенно и не думает. - -- У.Липпман -% -Компьютеры бесподобны: за несколько минут они могут совершить такую -грандиозную ошибку, какую не в состоянии сделать множество людей за многие -месяцы. - -- М. Мичэм -% -Логика - это искусство ошибаться с уверенностью в своей правоте. - -- Дж. У. Крач -% -Любовь - вещь идеальная, супружество - реальная; смешение реального с -идеальным никогда не проходит безнаказанно. - -- И. Гете -% -Любое ваше решение - это ошибка. - -- Эдуард Далберг -% -Мой способ шутить - это говорить правду. На свете нет ничего -смешнее. - -- Бернард Шоу -% -На моем веку было очень много прогресса, но, боюсь, не в том направлении. - -- О. Нэш -% -Нам мало добиться успеха. Надо еще, чтобы друзья наши потерпели крах. - -- Ларошфуко -% -Невеста - женщина, у которой виды на счастье остались позади. - -- А. Бирс -% -Нужно учредить Нобелевскую премию за остроумие. Без физиков, химиков, -экономистов мы, если прижмет, как-нибудь обойдемся. Без мира обычно тоже -обходимся. Без остроумия - пропадем. - -- Джордж Ф. Уилл -% -О несчастном случае мой подзащитный впервые узнал лишь тогда, когда этот -случай произошел. - -- Из речи адвоката -% -Первый и наихудший из всех подвохов - обмануть самого себя. Потом уже -легко впасть в любой грех. - -- Дж. Бэйли -% -По самой своей природе человек, чем старше он становится, тем больше -противится переменам, особенно переменам к лучшему. - -- Дж. Стейнбек -% -Поиск истины способен изрядно позабавить. - -- Вернон Говард -% -Полицейский находится на своем месте не для того, чтобы создавать -беспорядок; полицейский находится там, чтобы поддерживать беспорядок. - -- Ричард Дж. Дейли, мэр Чикаго -% -Посредственность - добродетель в глазах посредственных людей. - -- Ж. Жобер -% -Посредственный учитель излагает. Хороший учитель объясняет. Выдающийся -учитель показывает. Великий учитель вдохновляет. - -- Уильям Артур Уорд -% -Президенту в его окружении не нужны мужчины и женщины, умеющие только -поддакивать. Если он говорит "нет", мы все говорим "нет". - -- Элизабет Доул, помощница президента Рейгана -% -"Радость моя, мы живем в переходную эпоху", говорил Адам Еве по дороге из -рая. - -- У. Инге -% -"С нами такого случиться не может" - это фраза номер один в списке -знаменитых последних слов. - -- Дэвид Кросби -% -Самая большая ложь - это неверно понятая правда. - -- Уильям Джеймс -% -Скрипка - инструмент для щекотания человеческих ушей при помощи трения -лошадиного хвоста о внутренности кошки. - -- Амброз Бирс -% -Среди преподавателей большинство составляют те, кто не прервет чтение -своих лекций по навигации, даже если корабль уже тонет. Следствие: -путешествие длиною в тысячу миль завершается одним-единственным шагом. - -- Джеймс Г. Борен -% -Творческое мышление, возможно, означает всего-навсего понимание, что нет -никакой особой добродетели в том, чтобы вести дела так, как их всегда вели до -нас. - -- Рудольф Флеш -% -Технический прогресс лишь снабдил нас действенными средствами для движения -назад. - -- О. Хаксли -% -То, что мы называем прогрессом, представляет собой замену одной -неприятности другою. - -- Г. Эллис -% -Учитель прикасается к вечности: никто не может сказать, где кончается его -влияние. - -- Генри Адамс -% -Человеку надлежит жить с самим собой и постоянно заботиться, чтобы это -была хорошая кампания. - -- С.И. Хьюз -% -Эксперт - это человек, знающий все больше и больше о все меньшем и -меньшем. Следствие: колледж не может обеспечить компетентность; он может -обеспечить диплом. - -- Николас Батлер -% -Эксперт - это человек, который больше уже не думает; он знает. - -- К. Хаббард -% -Я не верю в коллективную мудрость невежественных индивидуумов. - -- Т. Карлейль -% -Я не против полиции, я просто боюсь ее. - -- Альфред Хичкок -% -Я никогда не мог взять в толк, почему из-за того только, что я выражаюсь -невразумительно, никто меня не понимает. - -- Милтон Мейер -% -Пожилые люди думают, что с тех пор, как они постарели, мир только теряет, -но ничего не приобретает. - -- Жеремена Сталь -% -Меня интересует мнение не тех людей, которые разбираются в данном вопросе, -а тех, которые сами кое-что сделали в одной из областей знания. - -- Hорберт Винер -% -Случайные открытия совершают только подготовленные умы. - -- Паскаль -% -Бывают услуги настолько большие, что рассчитаться за них можно только -неблагодарностью. - -- Дюма-отец -% -"Тоже неплохо!" - сказал зять, бросив камнем в собаку, а попав в тещу. - -- Плутарх. "Пир семи мудрецов". -% -Не ковыряй в носу перочинным ножиком. Лезвие легко ржавеет. - -- Из книги "Пи" -% -Очень много - иногда вполне достаточно для женщины. - -- Из книги "Ву" -% -В жизни можно рассчитывать только на самих себя. И то не всегда. - -- Тристан Бернар -% -Все было бы очень хорошо, если бы все наши поступки можно было бы совершать -дважды. - -- Гете -% -E = mC - -- Альберт Эйнштейн -% -Человек бывает таким, каким его создал бог, но преимущественно немного хуже. - -- Сервантес -% -Две параллельных линии полюбили друг друга. Трагедия! - -- Из книги "Пи" -% -Я знаток всех "и т. д., и т. п." и я знаю, когда за ними ничего больше -не скрывается. - -- Гомес де ля Серна -% -Одна туча может погрузить в темноту весь парк, одно слово может затемнить -самое большое счастье. - -- Гомес де ля Серна -% -Тот факт, что будильник не прозвенел, изменило уже много человеческих судеб. - -- Агата Кристи -% -Заполнять жизнь - это еще не значит обогащать ее. - -- Из книги "Пи" -% -Самым серьезным достоинством современного искусства является то, что, когда -эти произведения смотрят дети, они не задают таких вопросов, на которые -обычно бывает трудно отвечать. - -- Лорд Галлюкс -% -Замужних женщин значительно больше, чем женатых мужчин. - -- По данным американской статистики -% -Совесть - это тот голос, который говорит тебе, что не надо делать именно то, -что ты только что сделал. - -- Из книги "Пи" -% -И мелкие неприятности могут отравить жизнь, если нет крупных. - -- Р. Гомес де ля Серна -% -Счастлив тот, кто ни о чем не думает. - -- Софокл -% -Я не читаю газет. Все, о чем там стоит знать, всегда кто-нибудь расскажет. - -- Лорд Галлюкс -% -Недостаточно встать рано, надо еще и проснуться. - -- Из книги "Ву" -% -Высохшую реку не благодарят за ее прошлое. - -- Рабиндранат Тагор -% -Давать советы всегда плохо, но хорошего совета тебе никто не простит. - -- Оскар Уайльд -% -Устарели не только ответы, но даже сами вопросы. - -- Хемингуэй -% -Друзья, как арбузы: случается, что из десяти ни одного хорошего не выбрать. - -- Из книги "Пи" -% -Пока слушатели во время лекции поглядывают на часы, все в порядке. Страшно, -когда они начинают удивленно подносить часы к уху. - -- Из книги "Пи" -% -Нет правила, которого нельзя было бы нарушить ради более прекрасного. - -- Л. Бетховен -% -Прекрасна молодость, когда она в движении и знает, куда приложить свои силы. - -- Менандр -% -Простим горячке юных лет -И юный жар, и юный бред. - -- А. С. Пушкин -% -Грустно думать, что напрасно -Была нам молодость дана. - -- А. С. Пушкин -% -Всего больнее знать, что счастье было так близко - и ты сам его отверг. - -- Софокл -% -Настоящий художник настолько владеет искусством, насколько оно владеет им. - -- Г. Флобер -% -Великие люди сами сооружают себе пьедестал; статую воздвигнет будущее. - -- В. Гюго -% -...заслуги отца на сына не распространяются. - -- М. Сервантес -% -Давайте жить так, чтобы даже гробовщику стало жалко, когда мы умрем. - -- Марк Твен -% - - Обладаешь ли ты разумом? - - Обладаю. - - Почему же ты не пользуешься им? - -- Марк Авелий -% -Нет такой глупости, которой нельзя было бы исправить при помощи ума, -и нет такой мудрости, которой нельзя было бы испортить при помощи глупости. - -- В. Гёте -% -Оптимист верит, что мы живем в лучшем из миров. -Пессимист боится, что так оно и есть. -% -Пессимист видит темный туннель. -Оптимист видит свет в конце туннеля. -Реалист видит, что это на них мчится поезд. -И только машинист видит трех мудаков, тупящих на рельсах. -% -Мы познаем человека не по тому, что он знает, а по тому, чему он радуется. - -- Р.Тагор -% -Если вы уверены в победе вашей национальной сборной на Евро 2004, то вы либо -дурак, либо немец. - -- М.Задорнов -% -Нет некрасивых женщин - есть только женщины, не знающие, что они красивы. - -- Вивьен Ли -% -Любая сложная технология неотличима от волшебства. - -- Артур Кларк -% -Я люблю тебя не за то, кто ты, а за то, кто я, когда я с тобой. - -- Габриэль Гарсиа -% -Ни один человек не заслуживает твоих слез, а те, кто заслуживают, -не заставят тебя плакать. - -- Габриэль Гарсиа -% -Только потому что кто-то не любит тебя так, как тебе хочется, не значит, -что он не любит тебя всей душой. - -- Габриэль Гарсиа -% -Настоящий друг – это тот, кто будет держать тебя за руку -и чувствовать твоё сердце. - -- Габриэль Гарсиа -% -Худший способ скучать по человеку – это быть с ним и понимать, -что он никогда не будет твоим. - -- Габриэль Гарсиа -% -Никогда не переставай улыбаться, даже когда тебе грустно: кто-то может влюбиться -в твою улыбку. - -- Габриэль Гарсиа -% -Возможно, в этом мире ты всего лишь человек, но для кого-то ты – весь мир. - -- Габриэль Гарсиа -% -Не трать время на человека, который не стремится провести его с тобой. - -- Габриэль Гарсиа -% -Возможно, Бог хочет, чтобы мы встречали не тех людей до того, как встретим того -единственного человека. Чтобы, когда это случится, мы были благодарны. - -- Габриэль Гарсиа -% -Не плачь, потому что это закончилось. Улыбнись, потому что это было. - -- Габриэль Гарсиа -% -Всегда найдутся люди, которые причинят тебе боль. Нужно продолжать верить людям, -просто быть чуть осторожнее. - -- Габриэль Гарсиа -% -Стань лучше и сам пойми, кто ты, прежде чем встретишь нового человека и будешь -надеяться, что он тебя поймет. - -- Габриэль Гарсиа -% -Не прилагай столько усилий, все самое лучшее случается неожиданно. - -- Габриэль Гарсиа -% -Всё, что случаеется, имеет причину. - -- Габриэль Гарсиа diff --git a/data/friday.txt b/data/friday.txt deleted file mode 100644 index 63db2c0..0000000 --- a/data/friday.txt +++ /dev/null @@ -1,106 +0,0 @@ -А пятница-то не настоящая!!! || 34 -Спасибо, кэп! || 5 -А за пивом сегодня идет user || 5 -user, ты пиво купил? || 5 -Пятница хоть и небольшой праздник, НО ЗАТО ПОСТОЯННЫЙ! || 45 -Мечта о пятнице — самая распространенная среди работающего населения. Она начинается уже в понедельник и продолжается четыре дня в неделю || 123 -Господи дай мне сил не напиться! А если напьюсь, то сделай так чтобы я не плясала, если сил твоих не хватит и я все-таки запляшу, постарайся хотя бы сделать так, что бы не пела! А если и это не удастся, сломай к чертям сервер Ю-тюба! || 5 -К пятнице готова! Мобильный заряжен, баланс пополнен, в кармане записка с моим адресом || 5 -ПРЕДУПРЕЖДЕНИЕ: Чрезмерное употребление… Алкоголя. делает ВАШУ пятницу… ОФИГИТЕЛЬНОЙ || 5 -Сломай систему! Порви шаблоны! Начни новую жизнь с пятницы! || 5 -В пятницу совесть доживает только до обеда… || 5 -Сколько работнику не плати, всё равно пятницы ждёт || 1234 -Робинзооон!!! || 5 -В пятницу чаще всего хочется выпить. В понедельник чаще всего хочется пятницу. || 15 -Здравствуй Пятница, здравствуй, любимая, наконец-то ты пришла! || 5 -Зарплата в пятницу — удар по печени. || 5 -Вот и пятница пришла, счастье, радость принесла! || 5 -Все мы — пятницофилы и понедельникофобы. || 15 -Люблю понедельник — всего три дня до пятницы. || 1 -Ну здравствуй, пятница. Я дополз к тебе. || 5 -Пятница. Улыбните Улыбальник. || 5 -Чувствуете? Выходными пахнет! || 5 -До пятницы осталось…. пережить четверг! || 4 -Если пятый день подряд опаздываешь на работу, значит сегодня пятница. || 5 -От понедельника до пятницы очень далеко, а от пятницы до понедельника рукой подать. || 123467 -Жизнь начинается в пятницу вечером… В остальное время — выживание. || 5 -Пятница… белочки следят за тобой. || 5 -Примета: Если утром жена с вами не разговаривает, значит, вчера была пятница. || 6 -Чем ближе пятница, тем добрее утро! || 1234 -Пятница — лучший день недели, особенно её вечер, так как выходные еще не начались, а работа уже закончилась. || 5 -Отличной была пятница! Особенно запомнились русские народные катания на полицейских бобиках! || 1 -Четверг это маленькая пятница, а пятницу можно считать выходным. || 4 -Пятница традиционно начиналась легким ужином в четверг и заканчивалась плотным завтраком в понедельник. || 4 -Уже с пятницы начинаешь бояться, что скоро понедельник! || 67 -Каждую пятницу жизнь начинается сначала. || 5 -С пятницами надо быть осторожней. Они обещают слишком уж многое. Они словно рецензия на кинофильм: лишь в редких случаях предсказанное ими сбывается. || 5 -Русские в понедельник не работают — у них тяжелый день. || 1 -Все мы просто дети, изображающие на работе профессионалов, а на самом деле ждущие пятницы, чтобы быть сами собой! || 5 -Почему-то в пятницу хочется ничего не делать. Хотя в другие дни тоже хочется, но в пятницу ничего не делать хочется особенно сильно. || 5 -Хочешь жить завтрашним днем — устрой себе семь пятниц на неделе. || 5 -Что мне снег, что мне зной, что мне вермут разливной, когда мои друзья со мной! || 5 -Каждую пятницу количество довольных жизнью людей увеличивается на пару миллиардов. Этот эффект длится вплоть до понедельника. || 123467 -Так, Понедельник, Вторник, Среда, Четверг, проходим, проходим, не задерживаем Пятницу! || 1234 -Четверг. Смотрю на часы — 16.00. Еле сдерживаюсь, чтобы не закричать — Ура! Во Владивостоке Пятница! || 4 -Пятница — друг человека! || 5 -В пятницу вечером понимаешь, что в принципе — жить можно. || 5 -Ничто так не портит пятницу, как новость о том, что сегодня четверг. || 4 -Жить нужно так, как будто каждый день пятница. || 123467 -Только настроился на работу ― и вдруг снова пятница, снова отдых… Вот так всегда! || 5 -Хорошо, что пятница! Плохо, что еще только утро… || 5 -Уходя вечером с работы, он был рад, что сегодня пятница и можно спрятаться в уикенде. Он накроется субботой и воскресеньем как двумя толстыми одеялами. Ему ничего не хотелось делать; у него даже не хватало мужества читать. || 5 -Понедельник ― отходим от выходных, вторник ― готовимся к работе, среда ― работаем, четверг ― отдыхаем от работы, пятница ― готовимся к выходным. Вывод: может, хватит уже работать по средам! || 3 -Неделя тянется со скоростью улитки. Но в пятницу вечером улитка превращается в Феррари. || 5 -Прогноз погоды на пятницу: облачно, вечером осадки в виде алкоголя, возможен секс. || 5 -А пятница всё ближе. Печень в ужасе, попа в предвкушении! || 5 -Люди, с кем я вчера пила? Объясните, откуда у меня кот и почему люди в магазине мне хлопают… Кстати… никому кот не нужен? || 6 -ПЯТНИЦА — это старинный народный праздник, который начинают праздновать в ПЯТНИЦУ, а заканчивают — в ПОНЕДЕЛЬНИК || 567 -Вчера была пятница, завтра суббота, а сегодня тогда что? || 1 -Сегодня… ПЯТНИЧКА !!! Из хороших новостей пока… ВСЁ… Всем ДОБРА!!! || 5 -Надену-ка я сегодня красное платье… Под цвет глаз… || 5 -Вчера был yesterday || 235 -Вчера была yesterday || 467 -Вчера было yesterday || 1 -Никогда еще ожидание пятницы не было столь актуальным… || 4 -Завтра будет tomorrow || 1234567 -Четверг - это "завтра пятница". И помнить об этом надо в среду || 34 -Понедельник - это не начало новой недели, это задница предыдущей( || 1 -Я, признаться, очень завидую Робинзону Крузо. Живет на острове, никто мозги не е@ет и ПЯТНИЦА, ПЯТНИЦА, ПЯТНИЦА!!! Каждый день ПЯТНИЦА!!! || 1234 -Наступила пятница — значит мечты начинают сбываться || 5 -Вечером в пятницу девчонки должны быть алкоголенькими… || 5 -Позвони мне в субботу рано утром, часов в пятнадцать || 5 -Ну, вот и пятница пришла… Граждане и гражданки! Следите за своей белкой, чтобы она не разгорячилась! || 5 -Ага, вчера был понедельник, а сегодня сразу ПЯТНИЦА! ЩАС! || 2 -Вот пятница пролетела, наступил понедельник, но не все, не все вернулись на свои рабочие места || 1 -Работа не волк… В лес не убежит?.. А вдруг убежит… Так, за раздумьями и мечтами, и проходит рабочий день… || 12345 -Какой бы долгой и увлекательной ни была вечеринка, сделайте все, чтобы завтра проснуться в собственной спальне || 5 -Тяжелое воскресное засыпание объясняется вполне объективной причиной — организм на подсознательном уровне пытается продлить выходной… || 7 -Воскресенье — день недели с привкусом разочарования. Вроде и выходной, но все равно что-то не то || 7 -У воскресного дня есть только один существенный недостаток — он почему-то кончается в два раза быстрее, чем любой понедельник или четверг. || 7 -Первое правило хороших выходных - не вставать рано с постели || 67 -Понедельник — это такой день, когда вместо бейджика хочется повесить табличку: "Осторожно, злая собака" || 1 -Нас тупило утро понедельника || 1 -Бедный понедельник. Его ж никто не любит! || 1 -Вот выйду на пенсию — буду каждый понедельник выходить на улицу в семь утра и смотреть, как люди идут на работу и страдают || 1 -Если бы понедельник имел лицо… я бы его… ударила... || 1 -Завтра во всех домах страны: психологическая драма "утро понедельника" || 7 -Надеюсь, когда-нибудь я проснусь утром, включу новости и услышу: "Понедельник отменен, продолжайте спать…" || 1 -Хороший день словом Моndау не назовут! || 1 -Люди, почему вы злитесь только на понедельник? Как будто в другие дни работать хочется || 1 -Лучше утро пятницы, чем вечер понедельника || 15 -Если вы проживете 70 лет, то проживете 10 лет понедельников… || 1 -Берите пример с понедельника: его никто не ждёт, а ему по)(уй, он все равно приходит… || 1 -Завтра будет лучше, чем вчера! А, нет, завтра ПОНЕДЕЛЬНИК || 7 -Три ужасные новости: 1. Сегодня не пятница. 2. И даже завтра не пятница. 3. И даже послезавтра не пятница || 12 -В понедельник утром, очень сильно завидуешь… безработным || 1 -Понедельник — удобный повод чего-нибудь понеделать... || 1 -Дамы и господа! Предлагаю почтить утро понедельника минутой ворчания || 1 -Вот и начались трудо выебудни || 5 -Каждый понедельник меня мучает вопрос: выходные, вы вообще были? || 1 -На улице вторник, а на душе — вечер пятницы… || 2 -Наступил долгожданный вторник — послезавтра предпоследний день рабочей недели… || 2 -Если второй день не охота идти на работу, значит сегодня вторник || 2 -Предлагаю переименовать четверг в "завтра пятница"! || 4 -Говорят, при Сталине все субботы были рабочие, должно быть он и вправду был садист и тиран! || 6 -Остановись, воскресенье! Ты прекрасно!!! || 7 -Воскресенье — день трагичный. Суббота маячит далеко позади, а до понедельника уже рукой подать || 7 diff --git a/data/lat.txt b/data/lat.txt deleted file mode 100644 index e1862c4..0000000 --- a/data/lat.txt +++ /dev/null @@ -1,1336 +0,0 @@ -A caelo usque ad centrum -A capillo usque ad ungues -A capite ad calcem -A casu ad casum -A contrario -A dato -A fortiori -A limine -A majore ad minus -A maximis ad minima -A mensa et toro -A nativitate -A nescire ad non esse -A novo -A parte -A pedibus usque ad caput -A posse ad esse -A posse ad esse non valet consequential -A posteriori -A potentia ad actum -A potiori -A potiori fit denominatio -A prima facie -A priori -A probis probari, ab improbis improbari aequa laus est -A realibus ad realiora -A sacris -A tuo lare incipe -Ab absurdo -Ab aeterno -Ab antiquo -Ab equis ad asinos -Ab esse ad posse valet consequentia -Ab exterioribus ad interiora -Ab extra -Ab hinc -Ab hoc et ab hac -Ab hodierno -Ab hoedis scindere oves -Ab igne ignem -Ab imis unguibus ad verticem summum -Ab imo pectore -Ab inconvenienti -Ab incunabulis -Ab initio -Ab initio nullum, semper nullum -Ab intestato -Ab irato -Ab Jove principium -Ab origine -Ab ovo -Ab ovo usque ad mala -Ab posse ad esse consequentia (illatio) non valet -Ab uno disce omnes -Ab Urbe condita -Abeunt studia in mores -Abiens, abi! -Absente aegroto -Absit omen! -Absit verbo invidia -Absolutio ab instantia -Absolvo te! -Absque nota -Absque omni exceptionae -Abstractum pro concreto -Absurdum in adjecto -Abusus non tollit usum -Abyssus abyssum invocat -Accessio cedit principali -Acta diurna -Acta est fabula! -Actio immanens -Actio in distans -Actio in factum -Actio popularis -Actio transiens -Actore non probante reus absolvitur -Actor sequitur forum rei -Actum atque tractatum -Actum est ilicet! -Actum ut supra -Actus purus -Ad absurdum -Ad acta -Ad aeternum -Ad aras -Ad arbitrium -Ad augusta per angusta -Ad bestias! -Ad Calendas Graecas -Ad captandum benevolentiam -Ad captandum vulgus -Ad cogitandum et agendum homo natus est -Ad delectandum -Ad discendum, non ad docendum -Ad disputandum -Ad ea debeat adaptari jus, quae frequenter eveniunt -Ad exemplum -Ad extra -Ad extremitates -Ad finem -Ad fontes -Ad futuram memoriam -Ad futuram rei memoriam -Ad gloriam -Ad gustum -Ad hastam -Ad Herculis columnas -Ad hoc -Ad hominem -Ad honores -Ad hoste maligno libera nos, Domine -Ad impossibilia nemo tenetur -Ad infinitum -Ad informandum -Ad instar -Ad instruendum -Ad interim -Ad latus -Ad libita librarii -Ad libitum -Ad limina (apostolorum) -Ad litem -Ad litteram -Ad loca! -Ad majorem Dei gloriam -Ad manum -Ad maximum -Ad meliora tempora -Ad meliorem -Ad memorandum -Ad minimum -Ad modum -Ad multos annos -Ad narrandum, non ad probandum -Ad nauseam -Ad normam -Ad notam -Ad notanda -Ad notata -Ad oculos -Ad opus! -Ad patres -Ad patres conscriptos -Ad perpetuam rei memoriam -Ad personam -Ad pias causas -Ad pluralitatem votorum -Ad populum -Ad profundum -Ad publicandum -Ad ratificandum -Ad referendum -Ad rem -Ad se ipsum -Ad totalem evaporabionem -Ad tertium -Ad unguem -Ad unum omnes -Ad usum delphini -Ad usum externum -Ad usum internum -Ad usum populi -Ad usum proprium -Ad usum vitae -Ad valorem -Ad verbum -Ad verbum audiendum -Ad victoriam -Ad vitam -Ad vitam aeternam -Ad vitam aut culpam -Ad vocem -Adhuc sub judice lis est -Adverbium -Advitalitum -Advocatus Dei -Advocatus Diaboli -Aequam memento rebus in arduis servare mentem -Aequat causa effectum -Aequilibrium indifferentiae -Aequo animo -Aequo pulsat pede -Aequum est neminem cum alterius detrimento et injuria fieri locupletiorem -Aere perennius -Aes triplex -Aeterna historia -Aeterna urbs -Aeternae veritates -Aeternum vale -Age, libertate decembri utere -Age, quod agis, et respice finem -Agere sequitur esse -Ager publicus -Agnosco veteris vestigia flammae -Agnus Dei -Ajo! -Albo lapillo notare diem -Alea iacta (jacta) est -Alia editio -Alia tempora -Alibi -Aliena vitia in oculis habemus, a tergo nostra sunt -Alienatio mentis -Alieni juris -Aliis inserviendo consumor -Aliquando bonus dormitat Homerus -Aliud stans, aliud sedens -Alius alio plura invenire potest, nemo omnia -Alma Mater -Alter ego -Alter idem -Altera pars -Altum silentium -Amabile opus -Amabilis insania -Amabilis scientia -Amant alterna Camenae -Amantes sunt amentes -Amantium irae -Amantium irae amoris integratio -Amat victoria curam -Amata nobis quantum amabitur nulla -Amen! -Amicalia desideria -Amici, diem perdidi -Amicus certus in re incerta cernitur -Amicus cognoscitur amore, more, ore, re -Amicus (Animal) humani generis -Amicus incommodus ab inimico non differt -Amicus meus -Amicus Plato, sed magis amica est veritas -Amicus verus -Amor caecus -Amor fati -Amor patriae -Amor vincit omnia -Amor non est medicabilis herbis -An nescis longas regibus esse manus? -An nescis, mi fili, quantilla prudentia mundus regatur? -Analogia entis -Anathema maranata -Ancilla philosophiae -Ancilla theologiae -Anguis in herba -Angulus ridet -Anima -Anima vilis -Animalia vivunt, crescunt et sentiunt -Animam in promptu habere -Animi magnitudo -Animus -Animus denuntiandi -Animus injuriandi -Animus meminisse horret -Animus possidendi -Animus quod perdidit optat, Atque in praeterita se totus imagine versat -Animus rem sibi habendi -Animus suspicax -Anni currentis -Anno -Anno ab urbe condita -Anno aetatis suae -Anno ante Christum Natum -Anno Christi -Anno Domini -Anno mundi -Anno post Romam conditam -Annus horribilis -Ante bellum -Ante Christum Natum -Ante diem -Ante factum -Ante mare undae -Ante meridiem -Ante nuptias donatio -Ante quem -Anterioritas -Apparatus criticus -Appellatio -Appendix -Appetitus societatis -Aqua bulliens -Aqua destillata -Aqua et igni alicui interdicere -Aqua et ignis -Aqua et panis, vita canis -Aqua fontana -Aqua [cavat] lapidem non vi, sed saepe cadendo -Aqua pluvialis -Aqua pura -Aqua tophana -Aqua vitae -Aquae et ignis interdictio, hoc est exillum -Aquae potoribus -Aquila non captat muscas -Arbiter elegantiae -Arboretum -Arcades ambo -Argenteis hastis pugnare -Argentum nitricum -Argumenta ambigua -Argumenta ponderantur, non numerantur -Argumentum a contrario -Argumentum a posteriori -Argumentum a priori -Argumentum a silentio -Argumentum a tuto -Argumentum achilleum -Argumentum ad crumenam -Argumentum ad hominem -Argumentum ad ignorantiam -Argumentum ad invidia -Argumentum ad judicum -Argumentum ad misericordiam -Argumentum ad populum -Argumentum ad rem -Argumentum ad verecundiam -Argumentum ad veritatem -Argumentum ambiguum (communis) -Argumentum baculinum -Argumentum ex consensu gentum -Argumentum ex silentio -Argumentum externum -Argumentum internum -Argumentum legis -Argumentum primarium (palmarium) -Arma virumque cano -Arrectis auribus -Ars adeo latet arte sua -Ars amandi -Ars est celare artem -Ars et norma interpretandi naturam -Ars gubernandi -Ars moriendi -Ars logica -Ars longa, vita brevis -Ars oratoria -Ars poetica -Ars sacra -Ars una, species mille -Ars vitae -Artes ingenuae (liberales) -Artes molliunt mores -Articulo mortis -Articulus -Articulus secretissimus -Artificiosa natura -Artium magister -Asa foetida -Asini exiguo pabulo vivunt -Asinos non curo -Asinus asinorum in saecula saeculorum -Asinus asinum fricat -Asinus Buridani inter duo prata -Associatio idearum -Astra inclinant, non necessitant -Asylum ignorantiae -Atrium mortis -Atrophia nervorum -Auctoritas foris -Auctoritas rei judicatae -Audacter calumniare, semper aliquid haeret -Audentes fortuna juvat -Audiatur et altera pars -Auguror nec me fallit augurium, historias tuas immortales futuras -Aura popularis -Aurea mediocritas -Aures habent, et non audient -Auri sacra fames -Auribus teneo lupum -Aurora borealis -Aurora musis amica est -Аurum nostrum non est aurum vulgi -Aurum potestas est -Auspicia sunt fausta -Auspicium melioris aevi -Aut bene, aut nihil -Aut bibat, aut abeat -Aut Caesar, aut nihil -Aut cum scuto, aut in scuto -Aut deus, aut natura -Aut non tentaris, aut perfice -Aut disce, aut discede -Aut prodesse volunt aut delactare poetae -Aut vincere, aut mori -Ave -Ave, Caesar, morituri te salutant -Ave Maria -Ave ac vale -Ave verum corpus -Avibus bonis -Bacchum Nymphis temperare -Barba crescit caput nescit -Barba non facit philosophum -Barbam video, sed philosophum non video -Barbarus hic ego sum, quia non intelligor ulli -Beata stultica -Beatae plane aures, quae non vocem foris sonantem, sed intus auscultant veritatem docentem -Beati pauperes spiritu -Beati possidentes -Beatudio non est virtutis praemium, sed ipsa virtus -Beatus ille, qui procul negotiis -Bella matribus detestata -Bellum internecivum -Bellum omnium contra omnes -Bene diagnoscitur, bene curatur -Bene misceatur -Bene placito -Bene qui latuit, bene vixit -Bene tritum -Bene valete -Benevole lector -Benevolentiae captande causa -Bestiolae, quae unum tantum diem vivunt -Biblia pauperum -Bibliothecae scriptorum -Bis dat qui cito dat -Bis repetitia placent -Bis vincit qui se vincit in victoria -Bona adventica -Bona dicta -Bona fama divitiis est potior -Bona fide -Bona fides -Bona hereditaria -Bona mente -Bona opinio homini tuttior pecunia est -Bona venia vestra -Bonae fidei possesio -Boni homines -Bonis auspiciis -Bono modo -Bono sensu -Bonum publicum -Bonum vinum lactificat cor hominus -Bonus eventus -Bonus ordo -Bonus pater familias -Bonus ver semper tiro est -Breves vibrantesque sententiae -Brevi manu -Brevis esse laboro, obscurus fio -Bruta fulmina -Cacatum non est pictum -Cadit quaestio -Cadmea victoria -Caedite eos. Novit enim Dominus qui sunt eius -Caelo tonantem credidimus Jovem Regnare -Caelum, non animum mutant, qui trans mare currunt -Caesar ad Rubiconem -Caesar citra Rubiconem -Caesarem licet stantem mori -Caesarem vehis Caesarisque fortunam -Caesar non supra grammaticos -Caetera activitati -Caetera desiderantur -Caetera desunt -Calamitas virtutis occasio -Callida junctura -Calumniare audacter, semper aliquid haeret -Calvitium non est vitium sed prudentiae judicium -Camera clara -Camera lucida -Camera obscura -Camica santa -Candidior lacte -Canina facundia -Canis a non canendo -Cantabit vacuus coram latrone viator -Capitis deminutio -Captatio benevolentiae -Caput atro carbone notatum -Caput mortuum -Caput mundi -Caput orbi -Caritas humani generis -Caritas omnia credit -Carmen famosum -Carmen horrendum -Carmina nulla canam -Carmina morte carent -Caro est qui securis est -Carpe angelum -Carpe diem -Carpent tua poma nepotes -Carthago delenda est -Casta est quam nemo rogavit -Castis omnia casta -Casum sentit dominus -Casus a nullo praestantur -Casus belli -Casus conscietiae -Casus foederis -Casus incurabilis -Catena scientiarum -Causa activa -Causa bibendi -Causa causalis -Causa civilis -Causa criminalis -Causa efficiens -Causa essendi -Causa finalis -Causa finita est -Causa formalis -Causa irae -Causa justa -Causa materialis -Causa naturalis -Causa occasionalis -Causa prima -Causa principalis -Causa privata -Causa proxima, non remota spectatur -Causa sine qua non -Causa sufficiens -Causa sui -Cautio judicatum solvi -Cave canem -Cave hominem unius libri -Cave ne cadas -Caveant consules! -Cedant arma togae -Cedo majori -Censor morum -Certa de causa -Certa viriliter sustine patienter -Cessante causa, cessat effectus -Cessio bonorum -Ceteris paribus -Ceterum censeo -Charta non erubescit -Cibus, onus et virga asino -Circulus in probando -Circulus vitiosus -Citato loco -Citius, altius, fortius! -Cito citissimo -Civiliter mortui -Civis Romanus sum -Civitas Dei -Clara pacta, boni amici -Clari viri -Claris verbis -Classicus scriptor -Classicus testis -Claudite jam rivos, sat prata biberunt -Clausula rebus sic stantibus -Cloaca maxima -Codex chartaceus -Codex manuscriptus -Codex rescriptus -Coeli lumen -Cogita et visa -Cogitationum poenam nemo luit -Cogito ergo sum -Cognata vocabula rebus -Cognatio spiritualis -Coincidencia oppositorum -Collegium musicum -Collegium privatum -Collegium publicum -Colluvies gentium -Columnae Herculis -Commentarius perpetuus -Commodum possessionis -Commodum publicum -Commotio cerebri -Communa bonorem -Communibus annis -Communis opinio -Comoedia togata -Compelle intrate -Compesce mentem -Comple promissum -Compos mentis -Compos sui -Conclamatum est -Concordet sermo cum vitā -Concordia discors -Concordia parvae res crescunt, discordia maximae dilabuntur -Conditio sine qua non -Conditio suspensiva -Confessus pro judicato habetur -Confiteor solum hoc tibi -Consensus facit nuptias -Consensus gentium -Consensus omnium -Consequentia non valet -Consideratis considerandis -Consilio manuque -Consilium abeundi -Consortium omnis vitae -Consuetudo altera natura -Consummatum est! -Consumor aliis inserviendo -Contra bonos mores -Contra Gracchos Tiberim habemus -Contra factum non datur argumentum -Contra jus et fas -Contra tabulas -Contra rationem -Contra contrariis curantur -Contra spem spero -Contra vim mortis non est medicamen in hortis -Contradictio in adjecto -Contradictio in contrarium -Contradictio in re -Contradictio simptomatum -Contraria sunt complementa -Contumacia cumulat poenam -Coram arbitris -Coram hominibus -Coram publico (populo) -Cornu copiae -Corpora non agent nisi soluta -Corpus delicti -Corpus Domini -Corpus juris -Corpus juris civilis (romani) -Corpus simbioticum -Corpus solidum -Corpus vile -Correctis, corrigendis, imprimatur -Corruptio optimi pessima -Corruptissima re publica plurimae leges -Corvus corno oculos non eruit -Crambe repetita -Crassa ignorantia -Crassa Minerva -Credo quia absurdum -Credendo vides -Crescit amor nummi, quantum ipsa pecunia crescit -Crescite, nos qui vivimus, multiplicamini -Crimen laesae majestatis -Crimine ab uno disce omnes -Cui bono? -Cui podest malum? -Cujus regio, ejus lingua -Cujusvis hominis est errare, nullius nisi insipientis in errore perseverare -Culpa fictia -Culpa in eligendo -Culpa in inspiciendo -Culpa lata -Culpa lata dolo camparatur -Culpa lata dolo proxima est -Culpa levis -Culpa poena par esto -Cum commento -Cum Deo -Cum eximia laude -Cum figuris -Cum grano salis -Cum hoc non est propter hoc -Cum moriar, medium solvar et inter opus -Cum notis variorum scriptorum -Cum principia negante non est disputandum -Cum quodam fastidio -Cum res unimum occupavere verba ambiunt -Cum tempore -Cum tot sustineas et tanta negotia solus -Cum vota consultiva -Cuncta supercilio moventis -Cunctando restituit rem -Cupiditas rerum novarum -Cupio omnia, quae vis -Cura te ipsum -Curae leves loquuntur, ingentes stupent -Currente calamo -Curriculum vitae -Cursus honorum -Custodia honesta -Custos morum -Cymini sectores -Damnant quod non intellegunt -Damnatio ad bestias -Damnatio memoriae -Damnatus est -Damnosa quid non imminuit dies? -Damnum emergens -Damoclis gladius -(Timeo) Danaos et dona ferentes -Dat census honores -Dat, donat, dedĭcat (DDD) -Dat veniam corvis, vexat censura columbas -Date obolum Belisario -De capsula totae -De facto -De jure -De gustibus non est disputandum -De lana caprina rixari -De lege ferenda -De lege lata -De lingua stulta incommoda multa -De mare ad mare -De minimis non curat lex -De mortuis aut bene, aut nihil -De mortuis et absentibus nihil nisi bene -De nihilo nihil -De nomine -De novo -De omni re scibili et quibusdam aliis -De omnibus dubito -De possibili et impossibili -De principiis non est disputandum -De profundis -De quo fabula narratur -De rerum natura -De se ipso modifice, de aliis honorifice -De stercore Ennii -De visu et auditu -Decies repetitia placebit -Decipimur specie recti -Debellare superbos -Debes ergo potes -Deductio ad absurdum -Definitio fit per genus et differentiam specificam -Dei gratia -Delegatus non potest delegare -Delicta carnis -Delicta facti permanentis -Delicta facti transeuntis -Delectabile tempus! -Delictum commissionis -Delictum communi juris -Delictum omissionis -Delirium furens -Delirium tremens -Dementia praecox -Dementia senilis -Demonstratio ad oculos -Dente lupus, cornu taurus petit -Dente superbo -Dentibus albis -Deo ignoto -Deos manes placari victimis humanis -Desideria carnis -Desine sperare qui hic intras -Desinit in piscem mulier formosa superne -Destruam et aedificabo -Deus conservat omnia -Deus ex machina -Deus vult -Di meliora -Diagnosis ex juvantibus -Diagnosis ex observatione -Dicendo de cibis dicendum est de moribus -Dicis causa -Dicis gratia -Dictum factum -Dictum sapienti sat est -Dies diem docet -Dies interpellat pro homine -Dies irae -Differentia specifica -Difficile est proprie communia dicere -Difficile est satyram non scribere -Digitus dei est hic! -Dignus est intrare -Dii minorum gentium -Diligentia qualem diligentissimus pater familias abhibet -Diligentia quam im rebus suis -Diluvii testis -Dimidium animae meae -Dimidium facti, qui соерit, habet -Dira necessitas -Dis manibusque sacrum -Disjecta membra -Displicuit nasus tuus -Diurna manu nocturnaquae -Divide et impera -Divinum opus sedare dolorem -Dixi -Dixi et animam levavi -Dixi et animam meam salvavi -Do manus -Do ut des -Do ut facias -Docendo discimus (discitur) -Dolendi modus, timendi non item -Dolus malus -Domi sedet lanam ducit -Domina omnium scientiarum -Dominium bonitarium -Dominus et deus noster sic fieri jubet -Dominus litis -Don gratuit -Donec eris felix, multos numerabis amicos -Donum didacticum -Dramatis personae -Duae res longe sunt difficillimae -Dubia plus torquent mala -Ducunt volentem fata, nolentem trahunt -Dulce est desipere in loco -Dulce et decorum est pro patria mori -Dulce laudari a laudato viro -Dulcis fumus patriae -Dum docemus, discimus -Dum spiro spero -Dum vivimus vivamus -Duo quum faciunt idem, non est idem -Duobus certantibus tertius gaudet -Dura lex sed lex -E pluribus unum -Ea tempestate -Eadem oberrare chorda -Ecce homo -Ecce spectaculum dignum, ad quod respiciat intentus operi suo deus -Ede, bibi, lude -Edictum perpetuum -Edimus ut vivamus, non vivimus ut edamus -Edite, bibite, post mortem nulla voluptas -Effectrix eloquentiae est audientium approbatio -Ego -Ego cogito ergo sum -Ego sum rex Romanus et supra grammaticos -Ego ti intus et in cute novi -Ego versiculos feci, tulit alter honores -Eheu fugaces labuntur anni! -Ei incumbit probatio, qui dicit, non qui negat -Ejus est nolle qui potest velle -Ejusdem farinae -Ejusdem generis -Elegantia juris -Elephanti corio circumtentus est -Eloquentia canina -Emere catullum in sacco -Emunctae naris homo -Ens a se -Ens causa sui -Ens cogitans -Ens rationis -Ens reale -Ens realissimum -Entia metaphysica -Epicuri de grege porcus -Epistola non erubescit -Equo non credite Teucri -Equus Troianus -Ergo -Ergo bibamus -Erit sicut cadaver -Errare humanum est, или Humanum errare est -Errare humanum est sed stultum est in errore perseverare -Eruditio aspera optima est -Est avis in dextra, melior quam quattuor extra -Est deus in nobis -Est modus in rebus -Est quaedam flere voluptas -Esse, vivere, sentire -Et alia -Et cetera -Et fabula partem veri habet -Et fumus patriae dulcis -Et gaudium et solatium in litteris -Et hoc genus omne -Et in Arcadia ego -Et multa alia -Et tu, Brute? -Et premitur ratione animus vincique laborat -Et propter vitam vivendi perdere causas -Et quibusdam aliis -Et semel emissum volat irrevocabile verbum -Etiam periere ruinae -Etiamsi omnes ego non -Eventus docet -Eventus stultorum magister est -Ex abrupto -Ex adverso -Ex aequo -Ex aequo et bono -Ex auditu -Ex cathedra -Ex mero motu -Ex libris -Ex nihilo nihil fit -Ex nunc prout ex tunc -Ex officio -Ex ungue leonem -Exceptio probat regulam in casibus non exceptis -Excitare fluctus in simpulo (см. Буря в стакане) -Excudent alii spirantia mollius aera -Exempli gratia -Experimenta est optima rerum magistra -Experimentum crucis -Extra omnes! -Faber est suae quisque fortunae -Factum est factum -Fac fideli sis fidelis -Facta, non verba -Fallaces sunt rerum species -Fas est et ab hoste doceri -Fatum -Falax species rerum -Feci quod potui, faciant meliora potentes -Fecit -Ferox verbis -Ferro et igni; Igni et ferro -Festina lente -Fiat iustitia, et pereat mundus! -Fiat lux! -Fiat Roma, et ubi illa nunc est? -Fidei defensor -Fidelis et fortis -Finis coronat opus -Finis sanctificat media -Fortes fortuna adiuvat -Forum delicti -Fortis imaginatio generat casum -Fortuna caeca est -Fuimus Troes, fuit Ilium -Furor Teutonicus -Furtum manifestum -Frustra fit per plura quod potest fieri per pauciora -Gaudeamus igitur, juvenes dum sumus! -Genius loci -Gratis -Gutta cavat lapidem -Habeas corpus -Habemus Papam -Hannibal ante portas -Hic bibitur -Heu quam est timendus qui mori tutus putat -Hic locus est ubi mors gaudet succurrere vitae -Hic et nunc -Hic portus salutis -Hic Rhodus, hic salta -Hic sunt dracones -Hic sunt leones -Hoc fac et vinces -Hoc volo, sic jubeo, sit pro ratione voluntas -Hodie mihi, cras tibi -Homo homini lupus est -Homo proponit, sed Deus disponit -Homo Sapiens non urinat in ventum -Homo sum, humani nihil a me alienum puto -Honores mutant mores, sed raro in meliores -Honoris causa -Horribile dictu -Humanum errare est -Ibi semper est victoria, ubi concordia est -Ibi victoria, ubi concordia -Ibidem -Idem per idem -Id est -In bono veritas -Iesus Nazarenus, Rex Iudaeorum -Igni et ferro -Ignoramus et ignorabimus -Ignorantia non excusat -Ignoratio elenchi -Ignorantia non est argumentum -Imago animi vultus est -Imperare sibi maximum imperium est -Imperatorem stantem mori oportet -In absentia -In angustiis amici apparent -In camera -In coena domini -In contumaciam -In corpore -Indignus qui inter mala verba -In dubio pro reo -In flagrante delicto -In foro scientiae -Ingenium mala saepe movent -In infinitum -In hoc signo vinces -Injuria realis -Injuria verbalis -Injuriam faclius fasias guam feras -In memoriam -In nomine Patris, et Filii, et Spiritus Sancti, (amen) -Innocens credit omni verbo -In partem salari -In pricipio erat verbum -In propria persona -In propia causa nemo jundex -In rerum natura -In saecula saeculorum -In silico -In situ -Inter alia -Inter arma silent Musae -Interdum lacriumae pondera vocis habent -In utero -In vacuo -Invia est in medicina via sine lingua latina -Invia virtuti nulla est via -In vino veritas -Inutile terrae pondus -Ipsa se velocitas implicat -In vitro -In vivo -Ipse dixit -Ipso facto -Iura novit curia -Ira furor brevis est -Ira odium generat, concordia nutrit amorem -Irreparabilium (iprepara rabilium) felix oblivio rerum -Is fecit cui prodest -Jamque opus exegi quod nec Jovis ira, nec ignis, nec poterit ferrum, nec edax abolere vetustas -Judex damnatur, cum nocens absolvitur -Juris praecepta sunt haec: honeste vivere, alterum non laedere, suum cuique tribuere -Jus primae noctis -Jus primae occupationis -Jus sanguinis -Jus soli -Jus vitae ac necis -Justitia regnorum fundamentum -Labor omnia vincit -Labor est etiam ipse voluptas -Lassata viris necdum satiata recessit -Laborare est orare -Lectori benevolo salutem, L.B.S. -Legum servi sumus ut liberi esse possimus -Letum non omnia finit -Legio nomen mihi est -Levis est labor omnis amanti -Lex specialis derogat generali -Lex posterior derogat legi priori -Lex superior derogat legi inferiori -Lex talionis -Liberum veto -Libro ultimo -Licentia poetica -Littera scripta manet -Litterae humaniores -Locus regit actum -Lorem ipsum -Longa manus calami -Lege artis -Lucri bonus est odor ex re qualibet -Lupus in fabilus -Lupus non mordet lupum -Lupus pilum mutat, non mentem -Lux in tenebris -Lux ex tenebris -Magni nominis umbra -Magnum opus -Malum discordiae -Malum se ipsum devorat -Manifestum non eget probatione -Maniae infinitae sunt species -Manus manum lavat -Margaritas ante porcos -Matrimonium iustum -Mea culpa -Mea virtute me involvo -Medicus curat, natūra sanat -Medius terminus -Memento mori -Memento vivere -Memento quia pulvis es -Mens sana in corpore sano -Metri causa -Metus, dolor, mors ac formidines -Misericórdia -Modus operandi -Modus vivendi -More majorum -Mortem effugere nemo potest -Multum vinum bibere -Multi multa; Nemo omnia novit -Multa paucis -Mutatis mutandibus -Nam vitiis nemo sine nascitur -Natura abhorret vacuum -Naturalia non sunt turpia -Navigare necesse est, vivere non est necesse -Naviget, haec summa est -Nec gemino bellum Trojanum orditur ab ovo -Nec nostri saeculi est -Nec Deus intersit -Nec sutor ultra crepidam -Nemo debet bis puniri pro uno delicto -Nemo debet esse judex in propria causa -Nemo me impune lacessit -Nemo omnia potest scire -Nemo solus satis sapit -Ne sutor supra crepidam -Nihil admirari -Nihil habeo, nihil timeo -Nihil habeo, nihil curo -Nihil habenti nihil deest -Nihil verum est licet omnia -Nil aliud scit necessitas quam vincere -Nil inultum remanebit -Nil sancti -Nil satis nisi optimum -Nolens volens -Nomen est omen -Nomen Nescio -Nomina sunt odiosa -Non bis in idem -Non curatur, qui curat -Non moritura -Non olet (см. Деньги не пахнут) -Non progredi est regredi -Non rex est lex, sed lex est rex -Non scholae, sed vitae discimus -Non tam praeclarum est scire Latine, quam turpe nescire -Nosce te ipsum -Nota bene -Novus ordo seclorum -Nullum crimen sine poena, nulla poena sine lege, nullum crimen sine poena legali -Nusquam est qui ubique est -Occasio receptus difficiles habet -Oderint, dum metuant -Odi et amo -Omnia homini, dum vivit, speranda sunt -Omne vivum ex ovo -Omnes vulnerant, ultima necat -Omnia mea mecum porto -Omnia mutantur, nihil interit -Omnia orta cadunt -Omnia praeclara rara -Omnia vincit amor et nos cedamus amori -Omnis homo mendax -Omnis ars imitatio est naturae -Omnium consensu -Ora et labora -Orbis terrarum -Ordo ab chao -O sancta simplicitas -O tempora, o mores! -Otia dant vitia -Otium post negotium -Pacta sunt servanda -Panem et circenses -Pater noster -Pax optima rerum est -Pecuniae oboediunt omnia -Per aspera ad astra -Per Iovem -Periculum in mora -Perpetuum mobile -Per se -Persona grata -Persona non grata -Persona suspecta -Personae dramatis -Pes sic tendatur ne lodix protereatur -Petitio principii -Pictoribus atque poetis -Pie Jesu Domine, dona eis requiem -Plus ultra -Poëma -Poëtae nascuntur, oratōres fiunt -Porta itineri longissima -Post coitum omne animal triste est -Post factum -Post hoc ergo propter hoc -Post hoc non est propter hoc -Post mortem -Post prandium stabis, post cenam ambulabis -Post scriptum -Post tenebras lux -Potius sero quam nunquam -Praemonitus praemunitus -Primo -Primum non nocere -Primus inter pares -Pro forma -Pro pace -Pro patria mori -Pro poena -Pro tempore -Probatuum est -Procul negotiis -Quae medicamenta non sanat, ferrum sanat; Quae ferrum non sanat, ignis sanat. Quae vero ignis non sanat, insanabilia reputari oportet -Qualis artifex pereo! -Quantum satis -Qui nimium probat, nihil probat. -Qui non laborat, non manducet -Qui non proficit deficit. -Qui pro quo -Qui scribit, bis legit -Qui seminat mala, metet mala -Qui sine pecato est? -Qui ventum seminat, turbinem metet -Quid dubitas, ne faceris -Quid est veritas? -Quid pro quo -Quid timeas? Caesarem vehis Caesarisque fortunam -Quis? Quid? Ubi? Quibus auxiliis? Cur? Quomodo? Quando? -Quis custodiet ipsos custodes? -Quo vadis? -Quod deus bene vertat -Quod erat demonstrandum -Quod gratis asseritur, gratis negatur -Quod licet Jovi, non licet bovi -Quod scripsi, scripsi -Quot capita, tot sententiae -Quo usque pro Roma ibis? -Radices litterarum amarae sunt, fructus dulces -Rara est [adeo] concordia formae atque pudicitiae -Rebus sic stantibus -Reddite quae sunt Caesaris Caesari, et quae sunt Dei Deo -Reductio ad absurdum -Regula certa datur: bene qui stat, non moveatur -Repetitio est mater studiorum -Requiescat in pace -Requiem aeternam dona eis, Domine -Res Publica -Respice finem -Respondeat superior -Reti ventos venari -Rex regnat, sed non gubernat -Roma locuta, causa finita -Salus populi suprema lex -Sancta sanctorum -Sapere aude -Sapienti sat -Scientia potentia est -Scire leges non hoc est verba earum tenere, sed vim ac potestatem -Secundo -Sed alia tempora -Sed semel insanivimus omnes -Sede Vacante -Sedia Gestatoria -Sed non quo ad hanc -Semper idem -Semper in motu -Semper fidelis -Senatus bestia, senatores boni viri -Senatus Populusque Romanus (S.P.Q.R) -Sententia absolutoria -Sero venientibus ossa -Serva me, servanto te -Servus Servorum Dei -Si parva licet componere magnis -Si vales, bene est; Ego valeo (SVBEEV) -Si vis amari, ama! -Si vis pacem, para bellum -Si vis vincere, disce pati -Sic! -Sic itur ad astra -Sic transit gloria mundi -Sic semper tyrannis -Silentium est aurum -Silentium videtur confessio -Similia similibus curantur -Sine causa -Sine cura -Sine ira et studiо -Sit tibi terra levis -Sitio -Sola Scriptura -Soli Deo gloria -Sol lucet omnibus -Solum debilis mori debent -Solus cum sola, in loco remoto, non cogitabuntur orare «Pater noster» -Status quo -Sub rosa -Sudore et sanguine -Sui generis -Suis quaeque temporibus -Summa summarum -Supra nos Fortuna negotia curat -Supremum vale -Sursum corda -Suum cuique -Tabula rasa -Tacito consensu -Tale quale -Te amo est verum -Tempora mutantur et noc mutamur in illis -Tempus edax rerum -Tempus fugit -Tempora labuntur, tacitisque senescimus annis -Tertium non datur -Terra incognita -Terra nullius -Testis unus -Timeo Danaos et dona ferentes -Toties quoties -Totum revolutum -Totus floreo -Trahit sua quemque voluptas -Tres faciunt collegium -Tres muliers faciunt nundias -Ubi bene, ibi patria -Ubi concordia, ibi victoria -Ubi culpa est ibi poena subbesse debet -Ubi nil vales, ibi nil velis -Ubi mel, ibi apes -Ubi mel, ibi fel -Ubi pus, ibi incisio -Ultima ratio -Ultra posse nemo obligatur -Una voce -Unum et idem -Unus pro omnibus, omnes pro uno -Urbi et Orbi -Usus est optimus magister -Utile dulce miscere -Ut tensio sic vis -Ut desint vires, tamen est laudanda voluntas -Uti, non abuti -Vale -Vade retro, Satana -Vae victis -Vanitas vanitatum et omnia vanitas -Varietas delectat -Veni, vidi, vici -Verba magistri -Verba volant, scripta manent -Verbatim -Verte -Verum est quod pro salute fit mendacium -Veto -Versus -Via est vita -Viam supervadet vadens -Vice versa -Vide licet (Vide licet) -Videre majus quiddam -Vince in bono malum -Vinum -Vinum verba ministrat -Viribus unitis -Vis unita fortior -Vita brevis ars longa -Vita sine libertate, nihil -Vita sine litteris mors est -Vitae sal -Vivenda -Vivere est cogitare -Vi veri universum (veniversum) vivus vici -Volens nolens -Volo ergo sum -Volo, non valeo -Votum separatum -Vox populi vox Dei diff --git a/data/proverb_src/proverb.txt b/data/proverb_src/proverb.txt deleted file mode 100644 index 67f2d8d..0000000 --- a/data/proverb_src/proverb.txt +++ /dev/null @@ -1,1719 +0,0 @@ -А Васька слушает да ест. -Аль ты слова не доищешься? -Аркан ценится длиной, а слово – краткостью. -Бабий язык – чертово помело. -Бабьи сплетни хуже плетки – секут не жалеючи. -Бает, рассыпает, что погодой посыпает. -Баснями сыт не будешь. -Бахвальство не молотьба. -Бедный песни поет, а богатый только слушает. -Без газеты, как без солнца; и днем темны оконца. -Без запевалы и песня не поется. -Без красного словца ни на шаг. -Без обеда не красна беседа. -Без острого словца ни на шаг. -Без понукалки и сказочник дремлет. -Без пословицы не проживешь. -Без притчи веку не изживешь. -Без слова дело не делается, без дела слово не молвится. -Без соли, без хлеба худая беседа. -Без спора споро, да не скоро. -Без спорного слова не беседа. -Без углов дом не строится, без пословицы речь не молвится. -Без языка и колокол нем. -Без языка стал. -Белый свет не околица, а пустая речь не пословица. -Беседа дорогу коротает, а песня – работу. -Беседа дорогу строит. -Беседа не без красного словца. -Беседливый всегда с людьми. -Беседовать не устать, было бы что сказать. -Беседовать хорошо тогда, когда есть что сказать. -Блюди хлеб на обед, а слово – на ответ. -Бойся вышнего (вышестоящего), не говори лишнего. -Болтай, болтай, недалеко Валдай. -Болтай, да меру знай. -Болтливая молва к правде ложь прибавлять любит. -Болтливость – старости сестра. -Болтливость часто причиняет больше зла, чем злость. -Болтливый язык до добра не доведет. -Болтнешь – не воротишь. -Болтовня может стоить жизни. -Болтун не ждет спроса, а сам все скажет. -Болтун подобен маятнику: того и другой надо остановить. -Болтуна бросил в ад, а он и там заговорил: «Дрова сырые». -Боль от самой большой раны пройдет, а от дурного слова не пройдет. -Больше говорить – больше согрешить. -Больше знай, да меньше болтай. -Больше те люди шутят, у которых сердце поет. -Большой говорун – плохой работник. -Большой секрет – знает весь свет. -Бритва скребет, а слово режет. -Брюзжит, что худая муха в осень. -Будь своему слову хозяин. -Был бы запевала, а подголоски найдутся. -Была речь у Федосьи в переголосье. -Были б песни, будут и пляски. -Быль – трава, небыль – вода. -Быль – что смола, а небыль – что вода. -Быль за сказкой не угонится. -Быль за сказкой торопится. -Быль не сказка: из нее слова не выкинешь. -Быть по-сказанному, как по-писаному. -В добрый час молвить, а в худой – промолчать. -В долгих речах и короткого толку нет. -В запертый рот и муха не залетит. -В зубах не удержал, а в губах не удержишь. -В зубах слово не завязнет. -В мелких словах и большое дело утопить можно. -В паводок нет рыбы, в пословице – лжи. -В прохладе живем: язык болтает, а ветерок продувает. -В сказках все есть, да в руках ничего нет. -В споре и белая ворона черна, и черная бела. -В споре рождается истина. -В умной беседе быть – ума прикупить. -В умной беседе ума набраться, а в глупой – свой растерять. -В чем проговорился, с тем и распростился. -В чужих людях надо жить умеючи, а говорить рассуждаючи. -В шутке слово молвится. -В шутку сказано, да всерьез задумано. -В шуточках часто правда бывает. -Важно не то, что сказано, а как сказано. -Ваша речь впереди. -Велик звон, да не красен. -Велик язык у коровы, да говорить не дают. -Великое слово без дела ничтожно. -Ветер веет, а дорожный едет. -Ветром море колышет, молвою – народ. -Ветры горы разрушают – слово народы подымает. -Ветряна мельница да баба-бездельница мелет без устатку. -Видом не видал, слыхом не слыхал. -Вино входит – тайна уходит. -Внимательный слушатель вдохновляет оратора. -Волна по морю, молва по миру. -Ври, да не завирайся! -Все мы говорим, да не все по-говореному выходит. -Всего не переговоришь. -Всем рты затыкать – надо много полотна ткать. -Всех речей не переслушаешь. -Всюду писак более, чем писателей. -Всякая прибаска хороша с прикраской. -Всякая прибаутка в сказке хороша. -Всякая сорока от своего языка погибает. -Всякая сплетница на свою голову наплетает. -Всякая шутка надвое растворена: коту потешно, а мышке на беду. -Всякого слушай, а верь не всякому. -Выговоренное слово уже не проглотишь. -Выпустил словечко, не догонишь и на крылечке. -Выпустишь с воробушка, а вырастет с коровушку. -Высоко говорит, а рукою до неба не достанет. -Выстрелив, пулю не схватишь, а слово, сказав, не поймаешь. -Вяло говорит, да метко приходит. -Где двое тайно говорят, тут третий говорун не брат. -Где много слов, там мало правды. -Где песня льется, там легче живется. -Где слова редки, там они имеют вес. -Глупо говорить – людей смешить. -Глупого не оспаривай. -Глупые речи – что пыль на ветру. -Глупый болтает – умный думает. -Глупым словам глухое ухо. -Гнило слово от гнила сердца. -Говори мало, слушай много, а думай еще больше. -Говори меньше, умнее будет. -Говори подумавши, садись осмотревшись. -Говори про чужих, услышишь и про своих. -Говори с другом поменьше, а с собой – побольше. -Говори с одним поменьше, а с другим – побольше. -Говори складно, коль язык подвешен ладно. -Говори смелее – будет вернее. -Говори, говори, да и молви. -Говори, да не ври. -Говори, да не заговаривайся; ври, да не завирайся. -Говори, да не проговаривайся. -Говори, да не спорь, а хошь спорь, да не вздорь. -Говорил бы и про тебя, да боюсь тебя. -Говорил бы много, да сосед у порога. -Говорили просто так, а угодили в такт. -Говорили сегодня, говорить и завтра. -Говорит – не унять, а хвалить – не нанять. -Говорит – не устать, да в какую стать? -Говорит балы семигодовалы. -Говорит бело, а делает черно. -Говорит день до вечера, а послушать нечего. -Говорит до вечера, а слушать нечего. -Говорит красиво, да слушать тоскливо. -Говорит много, а слушать нечего. -Говорит много, а толку на грош, да итог не хорош. -Говорит по секрету, а выйдет по всему свету. -Говорит про тебя, забыв себя. -Говорит прямо, а делает криво. -Говорит сквозь зубы. -Говорит три дни, а все про злыдни. -Говорит три дня, а все пустое. -Говорит, как горох к стене лепит. -Говорит, как клещами на лошадь хомут надевает. -Говорит, как плохая плетея кружева плетет: что сплетет, ничего не разберет. -Говорит, как река льется. -Говорит, как слепой о краске. -Говорит, как спит. -Говорит, ровно в стену горохом сыплет. -Говорит, словно жвачку жует. -Говорит, точно во сне мочалку жует. -Говорит, что в цедилку цедит. -Говорит, что дипломат, да дела не идут на лад. -Говорит, что плетень плетет. -Говорит, что родит (с потугами)! -Говорит, что рублем дарит. -Говорится на глум, а ты бери себе на ум. -Говорить – беда, а молчать – другая. -Говорить – не работать, торопиться не надо. -Говорить беда, а молчать другая. -Говорить было немало, да разума не стало. -Говорить впустую, что стрелять вхолостую. -Говорить не думая – это стрелять не целясь. -Говорить не устать, да в какую стать? -Говорить умеет, да не смеет. -Говорить, так договаривать, а не договаривать, так и не говорить. -Говоришь по секрету, а выйдет по всему свету. -Говорок на порог, а скука из избы вон. -Говорят наобум, а ты бери себе на ум. -Говорят про Фому, а он про Ерему. -Говорят, что в Москве кур доят, а к нам привезут, они только яйца несут. -Голая речь не пословица. -Голову отдавай, а тайну – никогда. -Голову сложу, а тайну не скажу. -Городит ни зиму, ни лето. -Горшок с горшком в печи и то стыкается (о возможности спора). -Горькие вести и гонцу не на радость. -Горькое слово не легко молвится. -Грех не беда – молва не хороша. -Губы да зубы – два запора (забора), а удержу нет. -Дал Бог и немому речь. -Дальше в лес – больше дров; дальше в спор – больше слов. -Два уха, а рот один, и у того две службы: больше слушай, меньше говори. -Дважды думай перед тем, как говорить – в два раза. -Делай дело за семерых, а слушайся одного. -Дело шутки не любит. -Дельное слово бьет больнее палки. -Денег ни гроша, да речь хороша. -День-деньской – как за язык повешенный. -Держи кулак в кармане, а язык – на аркане. -Держи собаку на цепи, а язык – на семи. -Держи язык за зубами. -Держи язык короче! -Держи язык на привязи (на веревочке)! -Длинный язык – короткие мысли. -Длинный язык с умом не в родстве. -Для (про) глухого двух обеден не служат. -Для красного словца не пощадит (не пожалеет) ни матери, ни отца. -Для поговорки мужик в Москву пеши пошел. -До россказней охотник – плохой работник. -До трех дней трое знали, а после трех – весь мир узнал. -Добрая весть сама летит, худую на ворота вешают. -Добрая пословица ко времени молвится. -Добрая пословица не в бровь, а прямо в глаз. -Добрая шутка дружбы не рушит. -Добро смолчится, а худое молвится. -Добро тому врать, кто за морем бывал. -Доброе молчание чем не ответ. -Доброе молчанье лучше пустого болтанья. -Доброе слово – глоток воздуха. -Доброе слово – тоже помощь. -Доброе слово в жемчугах ходит, а злое слово пуще стрелы разит. -Доброе слово для доброго дела. -Доброе слово дом построит, злое слово дом разрушит. -Доброе слово железные ворота отопрет. -Доброе слово и кошке приятно. -Доброе слово лучше мягкого пирога. -Доброе слово окрыляет. -Доброе слово сказать – посошок в руки дать. -Доброе слово человеку – что дождь в засуху. -Доброму слову – добрый ответ. -Доброму слушателю – немного слов. -Добрые вести не лежат на месте. -Добрые вести прибавят чести. -Добрый молодец никогда не выдаст тайны. -Добрый ответ чем не привет. -Добрым словом и бездомный богат. -Долго думал, да хорошо сказал. -Долог у коровы язык, да не дают говорить. -Дорог в поле пахарь, а в беседе – бахарь. -Дороже рубля не шути. -Достается сычке от своего язычка. -Думать дважды раньше, чем один раз сказать. -Думка чадна, недоумка бедна, а всех тошней пустослов. -Дурное слово, что смола: пристанет – не отлепишь. -Дурному слову подводы не требуется. -Дурные вести бегут, хорошие плетутся прихрамывая. -Дым с чадом сошелся, или чад с дымом сошелся (о споре). -Его слова вилами на воде писаны. -Его слово – лед: легко тает. -Егор оповестил Фому, а тот – белому свету всему. -Ему черт лыки дерет, а он лапти плетет. -Если бы на сойку да не свой язык. -Если косить языком, спина не устанет. -Если сидишь на печи, так побольше молчи. -Если ум имеешь – следуй уму, если ума не имеешь – следуй пословице. -Есть кому послушать – было бы что. -Есть притча короче носа птичья. -Есть слова, которые похожи на соленое варенье. -Есть словко – как мед сладко; есть словко – как полынь горько. -«Есть» – словко, как мед сладко; а «нет» – словко, как полынь горько. -«Есть» «пета» лучше. -Ешь больше, а говори меньше! -Ешь калачи, да меньше лепечи. -Ешь калачи пока горячи. -Ешь капусту, да не мели попусту! -Ешь пирог с грибами, а язык держи за зубами! -Ешь сласти да слушай страсти. -Жало остро, а язык острей того. -Жду ответа, как соловей лета. -Желанные вести – мил гонец, горькие вести – и гонцу не на радость. -Живем не пышно, а далеко слышно. -Живое слово дороже мертвой буквы. -Живое слово дороже писаного. -Жизнь отдавай, а тайны не выдавай. -Жить в соседях – быть в беседах. -Журавля баснями не кормят. -За болтливым языком не поспеешь и босиком. -За грехи языка губы терпят. -За дурную речь – голову с плеч. -За ответом за пазуху не полезет. -За своими щеками не удержал, за чужими не удержишь. -За словом в карман не полезет, а знай свое мелет. -За словом в карман не полезет. -За собой слово не удержал, за людьми не удержишь. -За твое, за мое спор разгорается. -За умную речь хвалят, за дурную хают. -За хлебом-солью всякая шутка хороша. -За худые слова слетит и голова. -За что купил, за то и продаю (о передаче слышанного). -За шутки попадает Яшутке. -За шутку не сердись и в обиду не вдавайся. -Забавника, шута, потешника ищут, худо пошутит – просвищут. -Заговорил, так надо договаривать. -Заговорила про Гаврила, а свела на Фрола. -Загороди рот запором, заставь заставкой! -Заплел плетень, а доплетать-то нечем. -Зарубай, сглаживай, да никому не сказывай. -Затвердила сорока Якова одно про всякого. -Заткни фонтан красноречия, и фонтан отдохнуть должен (Козьма Прутков). -Затоковал что глухарь. -Звонит во все колокола. -Звону много, да толку мало. -Злой язык – злое оружие. -Знает кум, да кума, да людей полсела. -Знает один – тайна, знают двое – не тайна. -Знай обо всем, все помни, но язык свой придержи. -Знал бы, так не сказал бы, так знай раньше, а не позже. -Знала бы наседка – узнает и соседка. -Знают в Казани, что люди сказали. -И без песен рот тесен, а запоешь – и весь раздерешь. -И без песен рот тесен. -И гладко стружит, и стружки кудрявы. -И глупый ино молвит слово в лад. -И доброе слово не уймет злого. -И за космической пылью сказку сделаем былью. -И за песней плачется. -И клочит, и валяет, и гладит, и катает, а все языком. -И кот песни поет, когда хорошо живет. -И красно, и пестро (говорит), да пустоцветом. -И красно, и пестро, да все пусто. -И на твою спесь пословица есть. -И не слушает, да слышит. -И невелика беседа, да честна. -И новая песня старится. -И платье чисто, и речь честна. -И прав мышонок перед волком, да не скажет дело толком. -И речисто, да нечисто. -И слово имеет меру. -И это ответ, коли лучше нет. -Из ничего сыр-бор загорелся. -Из одних слов шубы не сошьешь. -Из одного места, да не одни вести. -Из одной деревни, да слухи разные. -Из песни слова не выкинешь, из-за стола гостя не выведешь. -Из поговорки слова не выкинешь. -Из пустого в порожнее переливает. -Из-за одного слова да вечная ссора. -Ино за неволю слово молвится. -Иной мелет, да никто ему не верит. -Иной речист, да на руку нечист. -Иной хлеб достанет горлом, а иной – горбом. -Каждому слову – свое место. -Как аукнется, так и откликнется. -Как борона бороздит (о нескладной речи). -Как горбатого к стене лепит. -Как сказано, так и сделано. -Как сорвалось, так и брякнулось. -Как только ты произнес слово, оно царствует над тобой, а до этого ты над ним царствовал. -Как чей язычок захочет, так и сокочет. -Каков вопрос, таков и ответ. -Каков зов, таков и отзыв. -Каков муж, такова и речь. -Каков привет, таков и ответ. -Какова голова, такова речь. -Какова песня, такова и плата. -Какова песня, таковы и слова. -Какова речь, таков и склад. -Какой разум, такой и разговор. -Карандаш иной раз тяжелее пудового молота. -Каркает как ворона. -Кашу кушай, а сказку слушай: умом-разумом смекай да на ус мотай. -Кланяться горазд, а говорить не умеет. -Клин на клин наскочил. -Когда он заговорит, то и собаке не дает слова сказать. -Когда правды нет в сердце, слова пусты. -Когда сорока пером вся побелеет, тогда и сокотать перестанет. -Кому до чего, а куме до всего. -Кому и петь, как не петуху. -Кому красное словцо, кому присказку. -Конь вырвется – догонишь, а сказанного слова не воротишь. -Короткие речи и слушать неча. -Коротко сказано, да много высказано. -Коротко, да узловато сказано. -Коротко, да ясно, оттого и прекрасно. -Коротко, да ясно; длинно, да ужасно. -Короткую речь слушать хорошо, под долгую речь думать хорошо. -Короток язык, так вытянут, а длинен, так окоротают. - -Кос очами, крив речами. -Красен разговор, да не спор. -Красна речь поговоркой. -Красна речь пословицей. -Красна речь притчею (пословицей). -Красна речь умом. -Красна речь слушанием. -Красна речь слушаньем, а беседа смиреньем. -Красна сказка складом, а песня – ладом. -Красно поле зерном, а беседа – умом. -Красно поле пшеном, а беседа умом. -Красно поле рожью, а речь ложью. -Красное дерево редко, красное слово метко. -Красное слово всегда впору. -Красное слово не ложь. -Красное словцо всегда бывает остро. -Красное словцо не ложь. -Красную речь красно и слушать. -Краткость – душа остроумия. -Крепка окова, а еще крепче слово. -Крепкое слово делом вертит. -Кроткое слово гнев побеждает. -Кстати промолчать, что большое слово сказать. -Кто в деле, тот и в ответе. -Кто военную тайну разглашает, тот присягу нарушает. -Кто говорит, ничего не узнает – кто слушает узнает много. -Кто говорит, тот сеет, кто слушает, тот пожинает (собирает). -Кто мало говорит, тот больше делает. -Кто много болтает, тот беду на себя накликает. -Кто не умеет говорить, портит разговор. -Кто не умеет тайны скрыть, тот не может мудрым быть. -Кто не умеет хорошо слушать, тот не умеет беседовать. -Кто открывает тайну, тот нарушает верность. -Кто переносит вести, тому не делают чести. -Кто правду слушать любит, своей души тот не погубит. -Кто проговорился, тот доверия лишился. -Кто рассказывает тайну, тот теряет всякое доверие. -Кто сваи колачивал, тот и песню знает. -Кто сдержит свой язык, тот сохранит свою голову. -Кто сказал А, тот должен сказать и Б. -Кто словом скор, тот в деле не спор. -Кто сплетни разносит, тот головы не сносит. -Кто спорит, тот ничего не стоит. -Кто шутки любит, того все любят. -Кто шутки пошучивает, тот на себя плеть покручивает. -Кто шуток не понимает, над тем не шути. -Курица кудахчет, хоть яйцо несет. -Кушай варено, слушай говорено. -Ладно баюкаешь, да сон не берет. -Ласково слово – что вешний день. -Ласково слово не трудно, да споро. -Ласковое слово и кость ломит. -Ласковое слово пуще дубины. -Легко сказать, да нелегко доказать. -Легко сказать, да нелегко орла поймать. -Лепечет как сорока. -Лес видит, а поле слышит (не разглашай тайну). -Лишнее говорить – себе вредить. -Лишнее слово в досаду вводит. -Лишнее слово до стыда доводит. -Лишний спор – лишняя и склока. -Лишняя погудка в забаву не годится. -Лишняя шутка не прибаутка. -Ловить на слове. -Лошади узнают друг друга по ржанию, а люди – по разговору. -Лучше богатство потерять, чем слово нарушить. -Лучше большой спор, чем маленькая ссора. -Лучше быть хорошим читателем, чем плохим писателем. -Лучше говорить дельно, чем говорить много. -Лучше не договорить, чем переговорить. -Лучше один раз увидеть, чем сто раз услышать. -Лучше оступиться, чем оговориться. -Лучше первый спор, чем последний. -Лучше печатного не скажешь. -Лучше промолчать, чем лишнего сказать. -Лучше раз показать, чем двадцать раз рассказать. -Лучше споткнуться ногою, чем словом. -Льстец под словами – змей под цветами. -Любишь говорить – люби и слушать. -Людей слушай, а дело делай. -Люди пишут не пером, а умом. -Людских басен не переслушаешь. -Лясы точить да людей морочить. -Мал язык, да всем телом владеет. -Мало говори: больше услышишь. -Мало ли что говорят, да не все перенять. -Мало ль что говорят, да всего не переслушаешь. -Малое слово большую обиду творит. -Мелева много, да помолу нет. -Мелет день до вечера, а послушать нечего. -Мелет и жернов, и язык. -Мели воду, помола не будет. -Мели, Агаша! Изба-то наша: унять некому. -Мели, кривая: устанешь, так перестанешь. -Мели, мели, Емеля, твоя неделя! -Меньше бы говорил, да больше бы слушал. -Метать громы и молнии. -Меткое слово не говорится мимо. -Мирская молва не лучше дерьма. -Мне не диво твое пиво: дивешеньки речи. -Много баять не подобает. -Много бредится – мало сбудется. -Много всего говорится, да не все в дело годится. -Много говорено, да мало сказано. -Много говорить – голова заболит. -Много грому по-пустому. -Много дыму, да мало пылу. -Много знай, да мало бай. -Много кудахтанья, а яиц нет. -Много не договорено – да и говореное-то еще не сварено. -Много слышится, да мало верится. -Много шуму – мало толку. -Многословие не без пустословия. -Мое слово – слово. -Можно много сказать и в короткой речи. -Молва ходит, говор бродит, на что наткнется, тут и приткнется. -Молва что волна: расходится шумно, а утешится – нет ничего. -Молву поветрием носит. -Молча губами не разводи! -Молча отмолчишься, как в саду отсидишься. -Молчание – знак согласия. -Молчание – золото. -Молчанье – золотое словечко. -Молчи, коли Бог разуму не дал! -Молчи, коли Бог убил! -Молчит как мертвый; как неживой. -Молчит, как воды в рот набрал. -Море ветром, народ слухом волнуется. -Мужик кочедыком, а чистомойка языком. -Мы не доживем до конца этой песни. -Мысль с сердцем, а речь с перцем. -Мягкие слова костей не ломят. -Мягкое слово кости ломает. -Не выдавай тайны другу; у него тоже найдутся друзья. -Не давай волю языку во пиру во хмелю, в беседе и гневе. -На большом разговоре не без промаха. -На великое дело – великое слово. -На всякий роток не накинешь платок. -На всякого Егорку есть поговорка. -На всякое слово есть пословица. -На глупый вопрос не бывает ответа. -На гнилое слово держи ухо глухо. -На добром слове кому не спасибо? -На добрый привет добрый и ответ. -На молву нет суда. -На молчок не разевай роток! -На первой встрече да озорные речи. -На пословицу не обижаются. -На пословицу ни суда, ни расправы. -На пословицу, на дурака да на правду и суда нет. -На пословицу, что молвится, суда нет. -На пусты лесы звонит. -На рынке пословицы не купишь. -На рысях плохо песни петь. -На свашенькиных речах хоть садись да катись. -На словах его хоть выспись, а на деле и головы не приклонишь. -На спор не будь скор. -На суку висит мочало – начинай свой сказ с начала. -На твою спесь пословица есть. -На уши оскомину набить. -На чужой рот пуговицы не нашьешь. -На язык пошлин нет, что хочет, то и лопочет. -На язык пошлины нет. -Наговорил семь верст до небес – и все лесом. -Наговорила, что наварила, а глядь – и нет ничего. -Наговорили, что безрукий клеть обокрал, голому за пазуху наклал, слепой подглядывал, глухой подслушивал, немой караул закричал, безногий в погоню погнался. -Наговорят-набают, чего и сами не знают. -Над другом шути, пока краска в лицо не вступит. -Над кем пословица не сбывается?! -Надоела нам эта песня. -Написал – и сам архиерей не разберет (о замысловатости). -Написал, как курица лапой (о небрежной работе). -Написали, что набрехали. -Напой, накорми, а после вестей расспроси. -Наскажешь семь верст до небес, и все лесом. -Наскочила кость на кость. -Натощак и песня не поется. -Наш брат Исайка – без струн балалайка. -Наш Наум себе на уме: слушать слушает, а знай щи хлебает. -Наш Фаддей проживет и без затей. -Нашли зубы на зубы, что коса на камень. -Не бей кулаком – ударь словом. -Не бросай слов на ветер. -Не будет добра, коли меж своими вражда. -Не в бровь, а прямо в глаз. -Не в обиду (во гнев) будь сказано. -Не в том углу сидишь, не те песни поешь. -Не вам говорить, не мне бы слушать. -Не все сказывай, что помнится. -Не все такать, ино и покалякать. -Не все такать, иногда и покалякать. -Не все то в строку, что молвится. -Не все то правда, что люди говорят. -Не все шутки сегодня шути, покинь на завтра. -Не всякая водица для питья годится, не всякая сказка людям указка. -Не всякая поговорка для нашего Егорки. -Не всякая пословица при всяком молвится. -Не всякая пустота прозрачна, не всякая острота удачна. -Не всякий столб околица, не всякая речь пословица. -Не всякий стрелок, кто много стреляет: не всякий оратор, кто много говорит. -Не всякое лыко в строку. -Не всякое слово – пословица. -Не всякое слово в строку пишется. -Не всякое слово в дело. -Не всякое слово всяким понимается. -Не всякое слово за дело считай, а иное и мимо ушей пропускай. -Не всякому слуху верь, не всякую правду сказывай. -Не всякую правду сказывай. -Не всякую речь сказывай. -Не глаза видят, а человек; не ухо слышит, а душа. -Не гляди, каков в плечах, слушай, каков в речах. -Не говорит – ум копит; а скажет – нечего слушать. -Не годится к страже вор, а дурак – на разговор. -Не гром грянул, что бедный слово молвил. -Не давай волю языку во пиру, а сердцу во гневе. -Не давши слова – крепись, а давши – держись. -Не до шуток рыбке на сковородке. -Не до шуток рыбке, коли крючком под жабры хватают. -Не доищется слова. -Не долго думал, да хорошо молвил. -Не долго метил, да хорошо попал. -Не дурачься, и так не умен. -Не жалей минутки для веселой шутки. -Не ждет баба спроса, а сама все скажет. -Не за былью и сказка гоняется. -Не звони в большой колокол – не разглашай тайны. -Не знаешь говорить толком, так живи тихомолком. -Не кричи о себе – пусть другие о тебе хоть тихо скажут. -Не любо – не слушай. -Не молвя крепись, а молвя держись. -Не мухи переносят слухи. -Не наше дело, чтобы сделать дело; а наше, чтоб пересудачить. -Не ножа бойся – языка! -Не остри: заостришься – в землю уйдешь. -Не подпрячь ли заике, один не вывезет. -Не при вас будь сказано. -Не пройми копьем, пройми языком! -Не слово хозяин хозяину, а хозяин слову хозяин. -Не слушал с начала, так жди конца. -Не то сквернит, что в уста, а то, что из уст. -Не торопись отвечать, торопись слушать. -Не убьешь словом, да озадачишь. -Не убьешь словом, да опозоришь. -Не хвали сам себя – пусть люди похвалят тебя. -Не хвали сам себя, есть много умнее тебя. -Не шути над тем, что дорого другому. -Не шути огнем – обожжешься. -Не шути с таким ты шуток, кто на всяко слово чуток. -Не шутка – промашка, а шутка – поправка. -Невестушка, полно молоть, отдохни – потолки. -Недоброе слово больней огня жжет. -Нем как рыба. -Нем, да свое ем; а речист, да не плечист – голодный сидит. -Немногих учи, а многих слушай. -Немного говорит, да много смыслит. -Немного слов, да много дела. -Непоседа портит беседу. -Нескладно, да ладно. -Неспроста слово молвится и до веку не сломится. а всякое слово есть пословица. -Несудима псловица. -Нет лучше шутки, как над собою. -Нет той тайны, чтобы не была явна. -Ни вздоров, ни перекоров, ни пустых разговоров. -Ни одному человеку на свете не говори о военном секрете. -Ни привету ни ответу. -Ни складу, ни ладу, ни толку. -Ни слуху ни духу, ни вестей ни костей. -Ни ступить, ни молвить, а туда же лезет. -Ни ткаха, ни пряха, а язык как плаха. -Никто бы про тебя не знал, когда бы сам не сболтал. -Никто за язык не тянет. -Никто не будет знать, только сыч, да сова, да людей полсела. -Никто не слышал, кроме базара. -Никто так не глух, как тот, кто не хочет слушать. -Ножи точат на точиле, а язык – на остроте. -Ну и шепоток – во весь роток! -О волке помолвка, а волк и тут. -Обаял да обошел, на кривых объехал. -Обед узнают по кушанью, а ум – по слушанью. -Обсуждение не своди на осуждение. -Одет просто, а на языке речей со сто. -Один острит замысловато, а другой – глуповато. -Одна врала, другая не разобрала, третья по-своему переврала. -Одна голова – два языка. -Околесицу несет. -Окромя базара, никто не знает. -Он на ветер слова не молвит. -Он речь сквозь зубы цедит. -Он спроста не говорит: растопырит слова, что вилы, да и молчит. -Она языком и белит и чернит. -Осла узнаешь но ушам, а дурака – по словам. -Остер на язык, а к делу не привык. -Острое словечко колет сердечко. -Острое слово с языка что пуля срывается. -Острый язык – дарование, длинный язык – наказание. -Острый язык что бритва. -Осудил горшок чугунку, а сам весь в саже. -Осуждая другого, погляди на себя. -От доброго слова язык не усохнет. -От добрых гостей ждут добрых вестей. -От злых языков не скроешься. -От одних слов толку мало. -От одного слова – да навек ссора. -От пословицы не уйдешь. -От свиньи визгу много, а шерсти нет. -От слова до дела – бабушкина верста. -От слова до дела – сто перегонов. -От слова не сбудется. -От языка не уйдешь. -Отвечай не словом, а делом. -Откуда знаешь? – Сорока на хвосте принесла. -Ошибка в слове – не спор. -Пень – не околица, глупая речь – не пословица. -Перо пишет, а ум водит. -Петух скажет курице, а она – всей улице. -Петь не пой, а подтягивай. -Петь хорошо вместе, а говорить порознь. -Писано черным по белому. -Писать – не языком чесать. -Письмо для солдата – отрада. -Письмо не товарищ, а правду сказывает. -Плевка не перехватишь, слова не воротишь. -Плети паутину да умей понять свой вес, чтобы выдержала тебя. -Плохо жить без забот, худо без доброго слова. -Плохую весть не торопятся везть. -По вестям и гонца встречают. -По животу и корм, по уму и разговор. -По привету ответ, по заслуге почет. -По речи узнают человека. -По чужим словам как по лестнице идет. -Поговорить по душам. -Поговорка – цветочек, пословица – ягодка. -Под вести подводы не требуется. -Подумай, обдумай, да и молви. -Подшучивай сам над собой: здоровей смеяться будешь. -Поет мотивно, только слушать противно. -Поется там, где воля, холя и доля. -Поёшь – слово. -Поймать на слове. -Получил из тыла привет – вот боец и согрет. -Понял, отчего Данило помер. -Поселись там, где поют: кто поет, тот худо не думает. -Пословица – краса речи. -Пословица – мудрость народа. -Пословица ведется, как изба веником метется. -Пословица всем делам помощница. -Пословица груба, да в ней правда люба. -Пословица да присказка беседу красят. -Пословица не клинок, а колет в бок. -Пословица не на ветер молвится. -Пословица не судима. -Пословица не укор, а почешется и вор. -Пословица недаром (к слову) молвится. -Пословица плодуща и живуща. -Пословицами на базаре не торгуют, а всем они нужны. -Пословицу и на кривой не объедешь. -Пословицы ни обойти, ни объехать. -Посмотри, сова, сама какова. -Поступь павлиная, речь соловьиная. -Пошел разговор со двора на двор. -Поэтами рождаются, ораторами делаются. -При всякой встрече все те же речи. -Приехала баба из города, привезла вестей три короба. -Промолвка хуже недомолвки. -Птица поет – сама себя выдает. -Пулей попадешь в одного, а метким словом – в тысячу. -Пустая бочка пуще гремит. -Пустая мельница и без ветру мелет. -Пусти уши в люди, всего наслушаешься. -Пустые разговоры оскомину набили. -Пыль столбом, дым коромыслом (о споре). -Разговор один на один. -Разговором каши не сваришь. -Разговорчив, как живая грамота. -Разуму нет – и «да» хорошо. -Рана от копья – на теле, рана от речей – в душе. -Расплескаешь – подотрешь, а промолвишь – не подберешь. -Рассказал, словно размазал. -Речами тих, да сердцем лих. -Речи иногда и горькие, а несут радость. -Речи слышим, а дела не видим. -Речи что мед, а дела что полынь. -Речь как меч – сечет и правого, и виноватого. -Рот откроешь, а слово не приготовишь. -Руки не крюки, да язык что кляп. -Русская пословица ко всему пригодится. -С ветру пришло, на ветер и уйдет. -С твоего слова, как с золотого блюда. -С тобой говорить – решетом воду носить. -С тобой поговорить, что меду напиться. -С умным разговориться, что меду напиться. -Садитесь рядком да потолкуйте ладком. -Сам поет – сам слушает. -Сам поет соловьем, не зная о чем. -Сама скажет сорока, где гнездо свила. -Самый лучший секрет – это тот, который оставляешь при себе. -Сболтнул бы коток, да язык короток. -Свинья скажет борову, а боров – всему городу. -Секрет на весь свет. -Секретное что заветное. -Семь бед – один ответ. -Семь дураков могут больше спрашивать, чем семьдесят умных отвечать. -Серого помянули, а серый здесь. -Сидит, как свеча горит; говорит, что рублем подарит. -Скажешь – не воротишь, напишешь – не сотрешь, отрубишь – не приставишь. -Скажешь с уха на ухо – узнают с угла на угол. -Скажешь слово, а прибавят десять. -Сказал другу, а пошло по кругу. -Сказал красно – по избам пошло; а смолчится – себе пригодится. -Сказал кум куме, кума свату, а сват брату, и пошел разговор со двора на двор. -Сказал, как ножницами отрезал. -Сказал, как топором отрубил. -Сказанное слово – серебряное, а несказанное – золотое. -Сказанное слово не может вернуться. -Сказать – смешно, утаить – грешно. -Сказка – ложь, а песня – правда. -Сказка – складка, песня – быль. -Сказка – складка, послушать сладко. -Сказка от начала начинается, до конца читается, в середке не перебивается. -Сказка про белого бычка. -Сказки не салазки: не сядешь да не поедешь. -Сказку слушай, а к присказке прислушивайся. -Сказывали и мы сказки. -Склад дороже песни. -Склад лучше погудки. -Складно бает, да дела не знает. -Сколько ни говорить, а с разговору сыту не быть. -Сколько ни говорить, а с разговору сытым не быть. -Сколько ни толковать, а всего не перетолковать. -Скоро сказка сказывается, да не скоро дело делается. -Скучное занятие – игра в молчанку. -Слова не доискался. -Слова серебряные, посулы золотые. -Словами горю не поможешь. -Словами жернова не повернешь, а глухого не научишь. -Словами и туды и сюды, а делами никуды. -Слово – не воробей, вылетит – не поймаешь. -Слово – не стрела, а пуще стрелы разит. -Слово – олово. -Слово – серебро, молчание – золото. -Слово бело, да дело черно. -Слово вовремя и кстати сильнее письма и печати. -Слово к делу не пришьешь. -Слово крепче печати. -Слово не воробей, вылетит – жди беды. -Слово не воробей, не поймаешь за хвост. -Слово не мимо идет. -Слово пуще стрелы разит. -Слово родит, а другое само бежит. -Слово сказал, так на нем хоть терем клади. -Слово слово родит, третье само бежит. -Словом и комара не убьешь. -Слову – вера, хлебу – мера, деньгам – счет. -Слух в ушах, а зрение в очах. -Слухам не верь, а сначала проверь. -Слухом земля полнится. -Слушайте сами, а люблю говорить. -Соли нету – слова нету, а хлеба не стало – поговорка стала. -Соловья баснями не кормят. -Сорвалось словцо – не схватишь за кольцо. -Сорока сама сказывает, где гнездо свила. -Спела бы рыбка песенку, кабы голос был. -Спроси громом – ответят ливнем. -Спроси у ветра совета, не будет ли ответа. -Старая песня на новый лад. -Старая погудка на новый лад. -Старая пословица ввек не сломится. -Старая пословица на века молвится. -Старая пословица с новым веком ссорится. -Старая пословица, да про новое молвится. -Старинная пословица не мимо молвится. -Старых людей пословицы – не мимо дела. -Струны готовы, недалеко и до песен. -Суды да пересуды доведут до остуды. -Сядем рядком да поговорим ладком. -Твои бы речи да Богу в уши. -Типун тебе на язык. -Тихое молчанье – никому не ответ. -Тихое молчанье – чем не ответ? -То же бы слово, да не так бы ты молвил. -То же слово, да не так бы молвить. -Ты ему слово, а он тебе десять. -Ты, язычок, смалчивай: за тебя я бедку плачивал. -У вороны одно кра. -У всякого словца ожидай конца. -У добрых вестей легкие крылья. -У каждого Егорки свои поговорки. -У нас с ним полтора разговора. -У нас собака осердилась, так неделю не лаяла. -У нашего словца не дождешься конца. -У нашей Басенки про все побасенки. -У него вехотка во рту. -У него на все есть ответ. -У него на всякий спрос есть ответ. -У него рот без застежек. -У него слово слову костыль подает. -У него что на уме, то и на языке. -У него язык – как бритва. -У него язык длинен. -У него язык ниткой перевязан. -У Севки в лавке (ответ на вопрос: «Где был?»). -У языка костей нет, как хочет, так и ворочается. -Умеет он стать и сесть, умеет и разговор весть. -Умная беседа оживляет дух. -Умные речи добро (приятно) и слушать. -Умный не скажет, дурак не поймет – и так сойдет. -Условье – не присловье, а слово – ряд делу. -Учи других – и сам поймешь. -Хитрого не поймешь, упрямого не доймешь. -Хороша пословица в лад да в масть. -Хорошая речь лучше меда. -Хорошему говорку всегда рады. -Хорошо говорит, да было бы что слушать. -Хорошо поешь, где-то сядешь. -Хорошую речь приятно и слушать. -Хоть немного видал, да много слыхал. -Хоть слово не обух, а от него люди гибнут. -Худые вести всякого вестовщика опережают. -Худые вести не лежат на месте. -Что к делу молвится – долго помнится. -Что молвишь, того не воротишь. -Что нескладно, то и неладно. -Что ни день, то новость. -Что ни слово – золото. -Чужих слухов не оберешься. -Чужого рта не завяжешь. -Чьи-то курочки несутся, а наши в крик пошли. -Шила, мыла, гладила, катала – и все языком. -Шутку любишь над Фомой, так люби и над собой. -Это – камень в наш огород. -Я тебе челом, а уж ты знаешь о чем. -Язык – стяг, дружину водит. -Язык – что мочало. -Язык без костей намелет на семь волостей. -Язык без костей, а кости ломает. -Язык голову кормит. -Язык голубит, язык и губит. -Язык до Киева доведет. -Язык есть, а ума нет. -Язык и то поведает, чего голова не ведает. -Язык мал, а великим человеком ворочает. -Язык мой – враг мой: прежде ума говорит. -Язык мой – враг мой: прежде ума рыщет, беды ищет. -Язык мой, а речи не мои говорит. -Язык поит, и кормит, и спину порет. -Язык разум открывает. -Язык хлебом кормит и дело портит. -Язык что осиновый лист: во всякую погоду треплется. -Язык языку весть подает. -Язык языку ответ дает. -Языком гладок, а душою гадок. -Языком кружева плетет. -Языком молоть – не дрова колоть, спина не заболит. -Языком не расскажешь, так и пальцем не растычешь. -Языком плетет, что коклюшками. -Ярко слово смущает сердце. -Чужбина – калина, родина – малина -Береги землю родимую, как мать любимую. -В трубу не труби на чужой проруби, свою проруби. -В чужих людях (на чужой стороне) три года чертом прослывешь. -В чужих руках все дело легко. -В чужих руках калач слаще. -В чужих руках ломоть больше кажется. -В чужих руках пирог велик. -В чужой горшок, да со своей ложкой. -В чужой кошель не заглядывай, а свой покрепче завязывай. -В чужом добре рыться – вором слыть. -В чужом месте, что в лесу. -В чужом месте, что в темном лесе. -В чужом пиру похмелье. -В чужом хлеву овец не считают. -В чужую дудку не наиграешься. -Видит и кривой, на ком кафтан чужой. -Всяк кулик на своем болоте велик. -Всяк человек свое дело ведай, а в чужое не лезь. -Всяк чужу сторону хвалит, а сам ни ногой. -Всякая птица свое гнездо любит. -Всякая сосна своему бору шумит. -Всякому мила своя сторона. -Вы, братцы, помолотите, а мы поедим. -Где живешь, кулик? – На болоте. – Иди к нам в поле. – Там сухо. -Где кто родится, там и пригодится. -Где народ, там и правда. -Где ни жить – Родине служить. -Где сосна взросла, там она и красна. -Глупа та птица, которой гнездо свое не мило. -Говорят в Москве, а слушают по всей стране. -Голос народа могуч, как океан. -Горе на чужой стороне безъязыкому. -Гусь за море полетел; гусь, а не лебедь, и назад прилетел. -Давай дружить: то я к тебе, то ты меня к себе. -Давай жить сообща: ты купишь, и мы есть станем. -Далеко шел, а добра не нашел. -Далеко, как до звезды небесной. -Далеко, как небо от земли. -Держись за дубок: дубок в землю глубок. -Для Родины своей ни сил, ни жизни не жалей. -До них три года скачи – не доскачешь. -Дома все споро, а вчуже житье хуже. -Дома и стены помогают. -Дома прикусница, а в гостях внакладку. -Если вздохнуть всем народом – ветер будет. -Если народ един – он непобедим. -Ешь, Гришка, не жалей хозяйского добришка. -За морем веселье – да чужое, а у нас и горе – да свое. -За морем теплее, а у нас светлее. -За свое вступайся, а за чужое не хватайся. -За свое постою, а чужое не возьму. -За чужим грошом потянешься – своим рублем расплатишься. -За чужим добром не гоняйся с багром. -За чужим скотом, да со своим кнутом. -За чужое лычко заплатишь ремешком. -За чужой головой легче жить, да тошнее. -Заработанный ломоть лучше чужого каравая. -Зариться на чужое – свое не беречь. -Зачем далеко, и здесь хорошо. -Зачем нам туда, где золото родится? Оно и само к нам привалится». -Зашел в чужую клеть молебен петь. -Звал ячмень пшеничку: «Пойдем туда, где золото родится; там нам с тобой хорошо будет водиться». – «У тебя, ячмень, ус долог, да ум короток». -Зубов не точи на чужие калачи. -И конь на свою сторону рвется, а собака отгрызётся, да уйдет. -И кости на чужбине плачут. -И кулик чужу сторону знает. -И пензенцы в Москве свою ворону узнали. -И полынь на своем корню растет. -И собака свою сторону знает. -И хлеб по своей стороне скучает. -Из чужого кармана платить легко. -Из чужого кармана раздавать не убыточно. -Из чужой спины ремешки хорошо кроить. -Изба чужая, как свекровь лихая. -Искав чужое, свое потеряешь. -Ищи добра на стороне, а дом люби по старине. -Каждому свой край сладок. -Кормись, козе, чужими садами, отдуваться будешь своими боками. -Крови не одной, но души родной. -Кто своего не уступает да чужого желает, того суд донимает. -Куда ворон костей не заносит? -Куда Макар и телят не гонял (т. е. очень далеко). -Кулик на месте соколином не будет птичьим господином. -Лошади чужие, хомут не свой – погоняй, не стой. -Лучше плохой ум, да свой, чем хороший, да чужой. -Лучше по миру собирать, чем чужое брать. -Лучше свое отдать, чем чужое взять. -Лучше свой кусок, чем чужой пирог. -Лучше своя свечка, чем чужая печка. -Любит выезжать на чужих плечах. -Любовь к Родине на огне не горит и в воде не тонет. -Любовь к Родине побеждает смерть. -Любовь к Родине сильнее смерти. -Мала птица, а и та свое гнездо бережет. -Мила та сторона, где пупок резан. -Мир дунет – ветер будет, мир плюнет – море будет, мир охнет – лес сохнет. -На родину и собачку тянет. -На родной стороне и камешек знаком. -На своей стороне мило, на чужой – постыло. -На чужбине – словно в домовине. -На чужбине жить – слезы лить. -На чужбине и собака тоскует. -На чужбине родная землица во сне снится. -На чужбине, словно в домовине, – и одиноко, и немо. -На чужих руках мозолей не видно. -На чужое богатство не надейся, свое береги. -На чужое добро и глаза разгораются. -На чужое добро руки чешутся. -На чужое пиво нечего губы пучить. -На чужой двор нечего вилами указывать, а надо нажить свой. -На чужой каравай рот не разевай, а пораньше вставай да свой затевай. -На чужой корм скотины не покупай. -На чужой кусок не пяль роток, а свой припаси и в рот понеси. -На чужой лошадке погоняй, не стой. -На чужой пир не надейся. -На чужой работе и солнце не движется. -На чужой спине беремя легко. -На чужой стог своими вилами не указывай. -На чужой стороне и весна не красна. -На чужой стороне и сокола зовут вороной. -На чужой стороне и солнышко не греет. -На чужой стороне поклонишься и бороне. -На чужой стороне родина милей вдвойне. -На чужой стороне три года собаки пролают, да три года люди проохают. -На чужой стороне, как былинка в поле. -На чужой сторонке и собачка мила. -На чужой сторонке не держи ты сердца на ладонке. -На чужой сторонушке рад своей воронушке. -На чужом горбу в рай хочет проехать. -На чужом добре далеко не уедешь. -На чужом пожаре всегда теплей. -На чужом хребте легко работать. -На чужую кашу у него рот нараспашку. -На чужую работу глядя, сыт не будешь. -Нам твоими нитками не зашивать дырки. -Народная дружба и братство дороже богатства. -Научит горюна чужая сторона: и вымучит, и выучит. -Наш городок – Москвы уголок. -Наша весна красным-красна. -Нашему народу Родина всего дороже. -Не бери чужого, так не отдашь и своего. -Не дери глаз на чужой квас. -Не жди, Мартын, чужих алтын, а стой, Мартын, за свой алтын. -Не закрывай чужой прорехи своим рукавом. -Не замасливай ус на чужой кус (кусок). -Не ищи обетованные края – они там, где Родина твоя, Новгород – отец, Киев – мать, а Москва – сердце. -Не кидай камень в чужой огород. -Не надейся, Роман, на чужой карман. -Не смейся чужой беде – своя на гряде. -Не та рука плоха, что держит свое, а та, что тянет чужое. -Неприятен чужой обед, когда своего нет. -Нет земли краше, чем Родина наша. -Нет своего ума – не прибавит и кума. -О том кукушка кукует, что своего гнезда нет. -Одна мать родна, и Родина одна. -Одна только сваха чужую сторону хвалит. -От чужеземных вод не воскреснешь. -От чужих нажитков не нажить пожитков. -Оттого кукушка по чужим гнездам бедует, что своего не имеет. -Охал дядя, на чужие деньги глядя. -По родимой сторонке сердце поет. -По чужим ранам да чужим салом мазать не убыточно. -Поехала кума неведомо куда. -Позор перед Родиной хуже смерти. -Приходи, брат, в гости: у соседа больно пиво хорошо. -Родина – всем матерям мать. -Родина – мать, умей за нее постоять. -Родина для нас дороже глаз. Родина краше солнца, дороже золота. -Родину, как и родителей, на чужбине не найдешь. -Родная землица и во сне снится. -Родная сторона – мать, чужая – мачеха. -Родной куст и зайцу дорог. -Родных нет, а по родимой стороне сердце ноет. -Русская душа нараспашку. -Русский ни с мечом, ни с калачом не шутит. -Русский терпелив до зачина. -Русский человек добро помнит. -С родной земли – умри – не сходи. -С родной сторонки и ворона мила. -Свое добро всегда впрок, а чужое – на ветерок. -Своя земля – свой прах. -Своя земля и в горсти мила. -Своя сторона не бывает холодна. -Своя сторона по шерсти гладит, чужая – насупротив.. -Скучно Афонюшке на чужой сторонушке. -Славны бубны за горами, а к нам придут, как лукошко. -Слушать чужими ушами. -Сторонушка и не дальняя, а печальная. -Твоим бы медом да нам по губам. -Только кукушка своего гнезда не вьет. -Тот не умен, кто живет не своим умом. -Тошно мне на чужой стороне. -У него разум не свой – пустил на постой. -Хвали заморье, а сиди дома. -Хозяина в голове нет – одни квартиранты. -Худая та птица, которая гнездо свое марает. -Человек без Родины – что соловей без песни. -Чужая одежа не надежа. -Чужая слеза – как с гуся вода. -Чужая сторона – дремуч бор. -Чужая сторона – мачеха. -Чужая сторона – темный лес. -Чужая сторона и без ветра сушит, и без зимы знобит. -Чужая сторона не сахаром посыпана, не медом полита. -Чужая сторона прибавит ума. -Чужая-то сторонушка не медом полита, а слезами улита. -Чужбина по шерсти не гладит. -Чужбина слезам не верит. -Чужбину хвали другим. -Чужедальняя сторона горем посеяна, слезами поливана, тоской упитана, печалью огорожена. -Чужие деньги – щепки. -Чужие петухи поют, на наших типун напал. -Чужие собаки дерутся, а свои не зевай. -Чужие хлебы приедчивы. -Чужим всяк тороват. -Чужим обедом гостей потчевать не убыточно. -Чужим умом до порога жить. -Чужим умом жить – добра не нажить. -Чужим умом не будешь умен. -Чужим умом не выстроишь дом. -Чужим умом подшивают бураки, да и то одни дураки. -Чужими пирогами родителей поминать. -Чужими руками легко жар загребать. -Чужого не желай, а своего не теряй. -Чужого не захватывай, а своего не разбрасывай. -Чужого не надо, а своего не отдам. -Чужое веять – лишь глаза порошить. -Чужое взять – своё потерять. -Чужое вино и пил бы, и лил бы, и искупаться попросил бы. -Чужое время не кради, свое побереги. -Чужое горе душу не тяготит. -Чужое горе не болит. -Чужое и хорошее постыло, а своё и худо, да мило. -Чужое не прочно и большое, а своё и мало, да правое. -Чужой дурак – ха-ха! А свой дурак – ох-ох! -Чужой ломоть лаком. -Чужой ум – не ум. -Чужой хлеб вкусен. -Чужой хлеб петухом в горле запоет. -Чужой хлеб слаще калача. -Чьим умом живешь, того и песенку поешь. -Я был бы сыт – что мне до других. -Как живем, так и умираем -Бегать смерти – не убегать. -Без несчастий нет века (жизни), без пороков – человека. -Без пользы на свете жить – лишь землю тяготить. -Без причины смерти не бывает. -Без року не умереть. -Безумно живому человеку о смерти думать. -Белый свет на волю дан. -Беспричинный стук в доме – к чьей-либо смерти. -Бойся жить, а умирать не бойся. -Бойся не бойся, а без року смерти не будет. -Бойся не бойся, а гроб теши. -Бойся не бойся, а смерть у порога. -Больше живешь – больше видишь. -Бояться смерти – на свете не жить. -Будет досуг, когда вон понесут. -Был – не был, жил – не жил, знать, что пропал. -Был (жил) – полковник; помер – покойник. -Был дуб, а стал сруб; время прибудет, и того не будет. -Был мужичок, да помер; была и кляча, да изъездилась. -Были кости, да легли на погосте. -Было бы суслице, доживем и до бражки. -В веселый час и смерть не страшна. -В гроб ничего не положат. -В добром житье краснеют, а в худом – бледнеют. -В добром житье кудри вьются, в худом – секутся. -В добром житье лицо белится, а в худом – чернится. -В живом боле корысти. -В жизни все меняется. -В жизни всегда так: лошадь тащит, а кучер получает «на чай». -В землю все люди идут, а оттуда – никто. -В землю уходящим отказу не бывает. -В могилке, что в перинке, не просторно, да улежно. -В нем смерть уже гнездо свила. -В одно перо и птица не родится. -В одной шерсти и собака не проживет. -В одну прядь веку не переживешь. -Важно знать не то, каким ты родился, а каким умрешь. -Вволю наешься, а вволю не наживешься. -Век – долга неделя. -Век (жизнь) изжить – не рукой махнуть (не рукавицей тряхнуть). -Век (жизнь) прожить – не поле перейти. -Век веку не указывает. -Век долог всем полон. -Век долог, да час дорог. -Век живи – век трудись, а трудясь – век учись. -Век живучи, спотыкнешься идучи. -Век живя, состаришься. -Век жить – не мех шить. -Век изжить – не нитку исшить. -Век короток, да погудка долга. -Век мой впереди, век мой назади, а на руке нет ничего. -Век не веревкой мерян. -Век не поле, вдруг не перескочишь. -Век прожить – не море переплыть. -Век прожить – не рукой махнуть, не рукавицей тряхнуть. -Век протянется – всего достанется. -Век прошутишь, славно проживешь. -Весело пожить да красно умереть. -Веселое не вечно, и печальное конечно. -Весна да лето, пройдет и не это. -Видимая смерть страшна. -Видимый рок, как ножом в бок. -Ворон каркает – к покойнику. -Вот и все: коротенькая была, да вся вышла. -Вот тебе и вся недолга. -Время придет – и час пробьет. -Все на свете годится; только то не годится, что не родится. -Всем придется лезть в тот ларчик, что ни встать, ни сесть. -Всем там быть: кому раньше, кому позже. -Всякая могила задернеет. -Всякая могила травой зарастает. -Всякий родится, да не всякий в люди годится. -Всяко наживешься – Кузьму батькой назовешься. -Всякому свой век жить. -Где жить, тем и слыть. -Где погребают, тут и рыдают. -Где хлебно и тепло, там и жить добро. -Говорила мне своячинка, что на дороге бывает всячинка. -Год на год не приходится. -Год прожить – не реку переплыть. -Года текут, как вода. -Года, как вода, пройдут – не увидишь. -Годы не уроды. -Горька смерть, а горчее злой живот. -Горя много, да смерть одна. -Гроб не ложь, и проводы тож. -Губы зудят к поцелуям. -Гул в трубе – душа покойника пришла. -Два века не изживешь. -Два века не проживешь, две молодости не перейдешь. -Два раза молоду не быть, а смерти не отбыть. -Два раза не умирать, а одного не миновать. -Двум смертям не бывать, а одной не миновать. -День – мать, день – мачеха. -День да ночь – и сутки прочь, так и отзваниваем. -День да ночь – сутки прочь, а все к смерти ближе. -День дню не указчик. -День долог, а век короток. -День к вечеру – ко смерти ближе. -День мой – век мой, а неделя – и весь живот. -День мой – век мой, сегодня жить, а завтра гнить. -День мой – век мой; что до нас дошло, то и к нам пришло. -День на день не приходится, час на час не выпадает. -День прошел, и к смерти ближе. -Дней много, а все впереди. -До смерти у живых – у старых душа не вынута, а у молодых не запечатана. -Добра была голова, да слава Богу, что земля прибрала. -Добрые умирают, да дела их живут. -Добрые умирают, да дела их не пропадают. -Дожили, что и ножки съежили. -Долго ли, скоро ли, а все будет конец. -Дом строй, а домовину ладь! -Дома нет, а домовище будет. -Домок в шесть досок. -Дума за горами, а смерть за плечами. -Думы за горами, а смерть за плечами. -Дятел мох долбит в избе – к покойнику. -Его стали хоронить, а он поехал боронить. -Елень быстр, а от смерти не убегает. -Ему житье-то – умирать не надо. -Если гроб не в меру велик – быть ещё покойнику в доме. -Если петухи в селении не вовремя распоются – к покойнику. -Если собака не ест крохи после больного, то он скоро умрет. -Если хворый бык к стене ложится – умрет. -Если щука плеснет хвостом перед рыбаком, то ему недолго жить. -Есть множество людей, смерть которых к чему-нибудь годна (И. Крылов). -Еще и то будет, что и нас не будет. -Еще належится во гробе. -Жив – жив, а умер – так умер. -Жив, да покойника не стоит. -Жива душа калачика чает. -Живая кляча лучше мертвого рысака. -Живая кость мясом обрастает. -Живем богато, со двора покато; за что ни хватись, за всем в люди катись. -Живем как в раю. -Живем маемся, слезой умываемся (старинная). -Живем не в год, а в рот. -Живем не на радость, а пришибить некому. -Живем не пышно, а далеко слышно. -Живем не пышно, нигде не слышно. -Живем ни худо, ни красно, а хлеб едим не напрасно. -Живем ни шатко, ни валко, а умереть все-таки жалко. -Живем хлеб жуем, а бывает и конфетки. -Живем хлеб жуем, а иногда и посаливаем (шутка). -Живем шутя, а помрем вправду. -Живет в Туле да ест дули. -Живет да небо коптит. -Живет как птица небесная; не сеет, не жнет. -Живет на птичьих правах. -Живет не живет, а проживать проживает. -Живет не тужит, никому не служит. -Живет не тужит, по свету кружит. -Живет себе, как рыба в воде. -Живет, как у Христа за пазухой. -Живет, людеет, помереть не смеет. -Живется – ни в сито, ни в решето. -Живется – поется; умирается – дрягается. -Живется с горем пополам (старинная). -Живешь – не оглянешься, помрешь – не спохватишься. -Живешь – не с кем покалякать; помрешь – некому поплакать. -Живешь не с тем, с кем родишься, а с тем, с кем сдружишься. -Живи – и не то еще увидишь. -Живи – почесывайся, умрешь – свербеть не станет. -Живи всяк своим умом да своим горбом. -Живи для людей, поживут люди для тебя. -Живи надвое: и до веку и до вечера. -Живи не как хочется, а как можется. -Живи не прошлым, а завтрашним днем. -Живи не скупись, с друзьями веселись. -Живи не тужи, теперь нет межи. -Живи не тужи, что у них ременные гужи: у нас и лыко да мочало, а туды же умчало. -Живи ни шатко, ни валко, ни на сторону. -Живи по-старому, а говори по-новому! -Живи по-старому, проживешь дольше; мели по-новому, намелешь больше. -Живи своим умом, а честь расти трудом. -Живи умно в молодости, не будешь охать в старости. -Живи, да не заживайся! -Живи, живи, да и помирать собирайся. -Живи, не тужи: помрешь, не заплачешь. -Живи, ни о чем не тужи: все проживешь, авось еще наживешь. -Живой без сапог обойдется, а мертвый без гроба не обойдется. -Живой в могилу не ляжет. -Живой думает о живом. -Живой живое и думает. -Живой не без места, мертвый не без могилы. -Живой не без промысла. -Живой о живом пещись должен. -Живой смерти боится. -Живой смерти не ищет. -Живому домок, а помер – шесть досок. -Живому именины, мертвому помины. -Живому нет в земле места, а на небо крыл. -Живому нет могилы. -Живот животы дает, а смерть все отберет. -Живот смерти не любит. -Животы – не нитки: надорвешь, не подвяжешь. -Живуч как кошка. -Живучи – до всего доживешь. -Живучи – живи; будешь помирать – станешь поминать. -Живучи на веку, навертишься и на сиделке и на боку. -Живучи на погосте, всех покойников не оплакать. -Живучи не улыбнешься, помирать станешь – крякнешь. -Живучи просто, доживешь лет до ста, а кто лукавит, того черт задавит. -Живучи столько вместе, и горшок с горшком столкнется. -Живучий сразу не умирает. -Живых не оплакивают. -Живьем в могилу не кладут. -Жизнь – как луна: то полная, то на ущербе. -Жизнь – копейка, голова – наживное дело. -Жизнь бежит, а годы скачут. -Жизнь без цели – выстрел без прицела. -Жизнь берет свое. -Жизнь вести – не вожжой трясти. -Жизнь висит на нитке, а думает о прибытке. -Жизнь все хуже, а воротник все уже. -Жизнь дана на добрые дела. -Жизнь дороже всех сокровищ. -Жизнь жизни рознь. -Жизнь идет: кто не поспевает за ней, тот остается одиноким. -Жизнь изжить – и других бить и биту быть. -Жизнь изжить – не лапоть сплесть. -Жизнь измеряется не годами, а трудами. -Жизнь короткая, да слава долгая. -Жизнь надокучила, а к смерти не привыкнешь. -Жизнь наша – полная чаша. -Жизнь не камень: на одном месте не лежит, а вперед бежит. -Жизнь не красна, так и смерть не страшна. -Жизнь не лошадь – ее кнутом не побьешь. -Жизнь пережить – что море переплыть: побарахтаешься, да и ко дну. -Жизнь прожить – море переплыть. -Жизнь прожить – не мутовку облизать. -Жил – маялся, а умирал – каялся. -Жил – не жил, а помирай. -Жил – не жил, а умер – покойник. -Жил – не житель, умер – не покойник. -Жил – не крестьянин, а умер – не боярин. -Жил – не крестьянин, умер – не родитель. -Жил – не мешал, умер – не жаль. -Жил – не сосед, помер – не крестьянин. -Жил – не сосед, умер – не покойник. -Жил – ни о чем не тужил; помер – и о нем не тужат. -Жил бы тихо, да от людей лихо. -Жил бы хорошенько, да денег маленько. -Жил был, пожил, да ножки съёжил. -Жил в лесу, молился колесу. -Жил грешно и умер смешно. -Жил долго, а умер скоро. -Жил не жил, был не был. -Жил помаленьку, а помер вдруг. -Жил собакой, околел псом. -Жил, жил, да вдруг и помер. -Жил, жил, да и жилы порвал. -Жил, жил, да и прожился. -Жила бабушка – не мешала; умерла – голбчик опростала. -Жили деды так, и мы поживем. -Жили люди до нас, будут жить и после нас. -Жили по-человечьи и не будем жить по-овечьи. -Жили с локоть, а жить с ноготь. -Жили сажень, а доживать пядень. -Жили славой, а умерли – чужой саван. -Жили старые дураки – поживут и молодые. -Жили, жили, а стыда не нажили. -Жили, жили, да и жилы порвали. -Житейское делай, а смерть помни! -Жить – кряхтеть. -Жить – не лукошко шить. -Жить – не сено трясти, а надо домок свести. -Жить бы тихо, да людей лихо. -Жить бы хорошо, да в животе стало тощо. -Жить в добре да в красе – хорошо и во сне. -Жить в соседях – быть в беседах. -Жить весело – помирать не с чего. -Жить вместе и умереть вместе. -Жить горько, да и умереть не сладко. -Жить грустно, а умирать тошно. -Жить да быть – ума копить. -Жить живи, да честь знай: чужого века не заедай. -Жить заодно – делиться пополам. -Жить мучиться, а умереть не хочется. -Жить на море – не видать себе воли. -Жить надейся, а умирать готовься. -Жить не живет, а проживать проживает. -Жить не можется, а умереть не хочется. -Жить не с деньгами, а с добрыми людьми. -Жить не с приданным, а с таланом. -Жить нельзя, а умирать не дают. -Жить ни шатко, ни валко, ни на сторону. -Жить от младости до старости – повидаешь и горя и радости. -Жить плохо, да ведь и умереть не находка. -Жить по воле – умереть в поле. -Жить поуже – не хуже. -Жить припеваючи. -Жить с кем заодно – делиться пополам. -Жить стало лучше, жить стало веселей! -Жить страшнее, чем умереть. -Жить тихо, так от людей лихо; жить моторно – от людей укорно. -Жить тяжко, да и умирать не легко. -Жить широко – хорошо, но и уже не хуже. -Жить, богатеть, добра наживать, лихо избывать. -Жить, так не блажить, а блажить, так не жить. -Житье на житье не приходится. -Житье скупо – платье носить худо. -Жить-поживать да добра наживать. -За смерть нет поруки. -Зажит век, как-нибудь доживать надо. -Здесь бы умер, а там бы встал. -И бездомник не без домовища. -И богату и просту – всем дорога к погосту. -И в аду люди живут. -И в красне живут, и в черне живут. -И всяк умрет, как смерть придет. -И гусь (и лошадь) линяет. -И ладно живется, и не ладно живется. -И недолго на свете побыть, да не дадут и веку изжить. -И пономарь, и владыка в земле равны. -И рад бы смерти, да где ее взять? -И сам тому не рад, что родился горбат. -И такой родится, что ни дома, ни в людях не годится. -И то будет, что и нас не будет. -Из тюрьмы выходят, а из гробу – никогда. -Из ястребиного яйца ястреб выходит. -Избу крой, песни пой, а шесть досок паси! -Из-за гроба нет голоса. -Икона упадет – к покойнику. -Ино скоком, ино боком, а ино и ползком. -Испуг от смерти не спасет. -К худой жизни не привыкнешь. -Кабы до нас люди не мерли, и мы бы на тот свет дороги не нашли. -Кабы люди не мерли – земле бы не сносить. -Кабы снова на свет народиться, знал бы, как состариться. -Как бы ни болела, а умерла. -Как живем, так и умираем. -Как живется, так и живи. -Как жил на свете – видели; как помирать станешь – увидим. -Как жил, так и умер. -Как жили деды да прадеды, так и нам жить велели. -Как жить ни тошно, а умирать тошней. -Как ни биться, а от смерти не отбиться. -Как ни вертись, а в могилку ложись. -Как ни плыть, а у дна быть. -Как ни тяни, а чужого веку не заешь. -Как отцы и деды наши, так и мы. -Как поживешь, так и прослывешь. -Как пришло, так и ушло. -Какова Ананья, такова у ней и Маланья. -Каково дерево, таков и клин; каков батька, таков и сын. -Каково живется, таково и спится. -Кобыла сдыхает, а траву хватает. -Когда ни умирать, а день терять. -Балаболит, как балаболка. -Без языка и колокол нем. -Блюди хлеб на обед, а слово на ответ. -Блюди хлеб на обед, а слово на привет. -Бог дал два уха и один язык. -Больше дела, меньше слов. -Бормочет, что глухарь. -Бранись, бранись, да на мир слово оставляй. -Бритва скребёт, а слово режет. -В добрый час молвить, в худой промолчать. -В сердце льстец всегда отыщет уголок. -В чужой беседе всяк ума купит. -В чужом доме не будь приметлив, а будь приветлив. -В чужом доме не указывают. -Верёвка хороша длинная, а речь короткая. -Вертит языком, что корова хвостом. -Во многословии не без пустословия. -Всё мы говорим, да не всё по-говореному выходит. -Всякая ссора красна миром. -Вчера солгал, а сегодня лгуном называют. -Выстрелив, пулю не схватишь, слово сказав – не воротишь. -Где много толков, там мало толку. -Говори, да назад оглядывайся. -Говори, да не заговаривайся. -Говори, да не спорь, а хоть и спорь, да не вздорь. -Говорит день до вечера, а послушать нечего. -Говорит красно, да слушать тошно. -Говорит крестом, а глядит пестом. -Говорит направо, а глядит налево. -Говорит прямо, а делает криво. -Говорит, будто клеит. -Говорит, как клещами на лошадь хомут тащит. -Говорит, как по-писаному. -Говорит, словно реченька журчит. -Говорит, что родит. -Говорить беда, а молчать другая. -Держи язык за зубами. -Держи язык на верёвочке. -Держи язык на привязи. -Для красного словца не пощадит ни матери, ни отца. -Доброе молчанье лучше худого ворчанья. -Доброе словечко в жемчуге. -Доброе слово и кошке приятно. -Добрым словом и бездомный богат. -Дома, как хочу, а в людях, как велят. -Если говоришь, что думаешь, так думай, что говоришь. -Ешь пирог с грибами, а язык держи за зубами. -Живое слово дороже мёртвой буквы. -За правое дело говори смело. -За правое дело стой смело. -За словом в карман не полезет (ему слово, а он - десять). -За твоим языком не поспеешь босиком. -За хлеб-соль не платят, кроме спасиба. -За худые слова слетит и голова. -Звону много, да толку мало. -Знала б наседка, узнает и соседка. -Знать сороку по язычку. -И дорого б дал за словечко, да не выкупишь. -И собака ласковое слово знает. -И собака ласковое слово понимает. -И собаку ласково примолвишь, так нескоро укусит. -И собаку ласково примолвишь, так хвостом вертит. -И хорошее слово хорошо один раз. -Из пустого в порожнее переливает. -Кабы я ведал, где ты ныне обедал, знал бы я, чью ты песню поёшь. -Как нет души, так что хошь пиши! -Каковы свойства, таковы и речи. -Каркает, как ворона. -Клади крест по-писаному, поклон веди по-учёному. -Кланяйся по-новому, а живи по-старому. -Коня на вожжах удержишь, а слова с языка не воротишь. -Короткую речь слушать хорошо, под долгую речь думать хорошо. -Короток язык, так вытянут, а длинен, так окоротают. -Красна речь поговоркой. -Красна речь притчею. -Красна речь слушаньем, а беседа смиреньем. -Красную речь красно и слушать. -Кстати промолчать, что большое слово сказать. -Ласковое слово и кость ломит. -Ласковое слово и кошке приятно. -Ласковое слово лучше мягкого пирога. -Ласковое слово многих прельщает. -Ласковое слово нетрудно, да споро. -Ласковое слово, что вешний денёк. -Лишнее говорить – себе вредить. -Лучше недоговорить, чем переговорить. -Лучше ногою запнуться, нежели языком. -Льстец под словами – змей под цветами. -Мал язык, да всем телом владеет. -Мели, Емеля, твоя неделя. -Меньше говори, да больше делай. -Мирская молва что морская волна. -Много баять не подобает. -Много говорено, да мало сказано. -Много говорить – голова заболит. -Много знай, да мало бай. -Мягко стелет, да жёстко спать. -На великое дело – великое слово. -На грубое слово не сердись, на ласковое не сдавайся. -На добром слове кому не спасибо? -На кого проговор не живёт. -На ласковое слово не кидайся, на грубое не гневайся. -На чужой рот пуговицы не пришьёшь. -На чужой роток не накинешь платок. -На языке медок, а на сердце ледок. -На языке мёд, да под языком лёд. -Наговорили, что наварили, глянь – ан и нет ничего. -Называет другом, а обирает кругом. -Наперёд накорми, а там уж поспроси. -Напой, накорми, а после вестей расспроси. -Напой, накорми, а после расспроси. -Начал гладью, а кончил гадью. -Обычай выше закона. -Обычай старше закона. -Один говорит – красно, двое говорят – пестро. -Он на ветер слов не бросает. -От доброго слова язык не усохнет. -От лихого не услышишь доброго слова. -От одного слова да навек ссора. -От приветливых слов язык не отсохнет. -От языка не уйдёшь, везде достанет. -Ошибка в слове не спор. -Падок соловей на таракана, а человек на льстивые речи. -Первая брань лучше последней. -Петь хорошо вместе, а говорить порознь. -Платье чисто, так и речь честна. -Плевка не перехватишь, слова не воротишь. -По привету и собачка бежит. -Пожалуйста не кланяется, а спасибо спины не гнёт. -Поменьше говори, побольше услышишь. -Пошёл на обед, неси словцо на привет. -Птицу кормом, а человека словом приманывают. -Пустая мельница и без ветру мелет. -Рад не рад, а говори: милости просим! -Ради красного словца не пожалеет родного отца. -Раз солгал, а навек лгуном стал. -Рассказчики не годятся в приказчики. -Речами тих, да сердцем лих. -Речи, как мёд, а дела, как полынь. -Речи, что снег, а дела, что сажа. -Рот нараспашку, язык на плечо. -Ртом болезнь входит, а беда выходит. -С брани люди сохнут, а с похвальбы толстеют. -С кем перекланиваться, с тем не перебраниваться. -С кем побранюсь, с тем и помирюсь. -С умным разговориться, что мёду напиться. -Свинья скажет борову, а боров всему городу. -Своего спасиба не жалей, а чужого не жди. -Скажешь – не воротишь, напишешь – не сотрёшь, отрубишь – не приставишь. -Сказал бы словечко, да волк недалечко. -Сказано – сделано. -Сказано – серебро, не сказано – золото. -Складно бает, да дела не знает. -Словами, что листьем, стелет, а делами, что иглами, колет. -Слово – серебро, молчание – золото. -Слово вымолвит, ровно жвачку пережуёт. -Тараторит, как тараторка. -Ты ему слово, а он тебе десять. -У злой Натальи все люди канальи. -У кого что болит, тот про то и говорит. -У него на всякий спрос ответ есть. -У него слово слову костыль подаёт. -У него суконный язык. -У него язык, что бритва. -У него язык, что помело. -Умей вовремя сказать, умей и смолчать. -Умные речи приятно и слушать. -Учтивое слово и буйну голову смиряет. -Хорошо и там и тут, где по имени зовут. -Хорошую речь приятно и слушать. -Хорошую речь хорошо и слушать. -Честное слово и буйну голову смиряет. -Честь пива дороже. -Честь пива лучше. -Что кого веселит, тот про то и говорит. -Что написано пером, не вырубить топором. -Чужих слов не перебивай. -Язык до добра не доведёт. -Язык до Киева доведёт. -Язык доведёт до кабака. -Язык кормит, и поит, и спину порет. -Язык мал, великим человеком ворочает. -Язык мой – враг мой: прежде ума глаголет. -Язык мой – враг мой: прежде ума рыщет, беды ищет. -Язык наперёд ума рыщет. -Язык телу якорь. -Язык хлебом кормит и дело портит. -Язык царствами ворочает. -Язык языку ответ даёт, а голова смекает. -Языком болтай, а рукам воли не давай. diff --git a/data/sample_config.json b/data/sample_config.json index 837b417..57d464f 100644 --- a/data/sample_config.json +++ b/data/sample_config.json @@ -7,42 +7,6 @@ "gamestatdir" : "data/gamestat" }, - "fortune" : { - "dir" : "data/fortune", - "srcdir" : "data/fortune_src" - }, - - "proverb" : { - "dir" : "data/proverb", - "srcdir" : "data/proverb_src" - }, - - "friday" : { - "dir" : "data/friday", - "src" : "data/friday.txt" - }, - - "image": { - "imgur" : { - # See README.md about these settings - auth'ed search settings. - "client-id" : "imgur api client id", - "secret" : "secret for client id", - "access_token" : "access token for querying imgur api", - "refresh_token" : "token for refreshing access token" - }, - "flickr" : { - # See README.md about these settings - auth'ed search settings. - "consumer_key" : "md5-like_hash", - "consumer_secret" : "some_hash-like_string", - "verifier": "some_hash-like_string" - } - }, - - "lat" : { - "brain": "data/lat/brain.sqlite", - "src": "data/lat.txt" - }, - # Required for debugging reasons, if commented out or not exist, no debug logging appears at all. "log" : "/var/log/aleesa-telegram-bot/aleesa.log", @@ -50,11 +14,6 @@ # Currently implemented debug, info, notice, warn, error, fatal. Notice is default logging level. "loglevel": "notice", - # Openwatermap plugin. - "openweathermap" : { - "appid" : "md5sum-like_string" - }, - # Stuff for telegram itself. "telegrambot" : { @@ -69,7 +28,7 @@ }, # Unprivileged user to run this bot from. - "user" : "unit", + "user" : "nobody", "redis_server": "127.0.0.1", "redis_port" : "6379", diff --git a/lib/BotLib.pm b/lib/BotLib.pm index 5f4cd7a..dcbed82 100644 --- a/lib/BotLib.pm +++ b/lib/BotLib.pm @@ -15,48 +15,18 @@ use Log::Any qw ($log); use BotLib::Conf qw (LoadConf); use BotLib::Admin qw (@ForbiddenMessageTypes GetForbiddenTypes AddForbiddenType DelForbiddenType ListForbidden FortuneToggle FortuneStatus - PluginToggle PluginStatus PluginEnabled); -use BotLib::Anek qw (Anek); + PluginToggle PluginStatus PluginEnabled ChanMsgToggle ChanMsgStatus); use BotLib::Archeologist qw (Dig); -use BotLib::Buni qw (Buni); -use BotLib::Drink qw (Drink); use BotLib::Fisher qw (Fish); -use BotLib::Fortune qw (Fortune); -use BotLib::Friday qw (Friday); -use BotLib::Image qw (Kitty Fox Oboobs Obutts Rabbit Owl Frog Horse Snail); -use BotLib::Karma qw (KarmaSet KarmaGet); -use BotLib::Lat qw (Lat); -use BotLib::Monkeyuser qw (Monkeyuser); -use BotLib::Proverb qw (Proverb); use BotLib::Util qw (trim); -use BotLib::Weather qw (Weather); -use BotLib::Xkcd qw (Xkcd); use version; our $VERSION = qw (1.0); use Exporter qw (import); -our @EXPORT_OK = qw (RandomCommonPhrase Command Highlight BotSleep IsCensored); +our @EXPORT_OK = qw (Command Highlight BotSleep IsCensored); my $c = LoadConf (); my $csign = $c->{telegrambot}->{csign}; -sub RandomCommonPhrase { - my @myphrase = ( - 'Так, блядь...', - '*Закатывает рукава* И ради этого ты меня позвал?', - 'Ну чего ты начинаешь, нормально же общались', - 'Повтори свой вопрос, не поняла', - 'Выйди и зайди нормально', - 'Я подумаю', - 'Даже не знаю, что на это ответить', - 'Ты упал такие вопросы девочке задавать?', - 'Можно и так, но не уверена', - 'А как ты думаешь?', - 'А ви, таки, почему интересуетесь?', - ); - - return $myphrase[irand ($#myphrase + 1)]; -} - sub Command { my $self = shift; my $msg = shift; @@ -79,15 +49,65 @@ sub Command { $rmsg->{mode} = 'public'; } - if ((substr ($text, 1) eq 'ping') || (substr ($text, 1) eq 'пинг') || (substr ($text, 1) eq 'pong') || - (substr ($text, 1) eq 'понг') || (substr ($text, 1) eq 'coin' || substr ($text, 1) eq 'монетка') || - (substr ($text, 1) eq 'roll' || substr ($text, 1) eq 'dice' || substr ($text, 1) eq 'кости') || - (substr ($text, 1) eq 'ver' || substr ($text, 1) eq 'version' || substr ($text, 1) eq 'версия') || - (substr ($text, 1) eq 'хэлп' || substr ($text, 1) eq 'halp') || - (substr ($text, 1) eq 'kde' || substr ($text, 1) eq 'кде') ) { + my $cmd = substr $text, 1; + my @cmds = qw (tits boobs tities boobies сиси сисечки butt booty ass попа попка); + + while (my $check = pop @cmds) { + if ($cmd eq $check) { + unless (PluginEnabled $chatid, 'oboobs') { + return; + } + } + } + + $#cmds = -1; + @cmds = qw (butt booty ass попа попка); + + while (my $check = pop @cmds) { + if ($cmd eq $check) { + unless (PluginEnabled $chatid, 'obutts') { + return; + } + } + } + + $#cmds = -1; + @cmds = qw (ping пинг пинх pong понг понх coin монетка roll dice кости ver version версия хэлп halp kde кде lat + лат friday пятница proverb пословица fortune фортунка f ф anek анек анекдот buni cat кис drink праздник fox лис + frog лягушка horse лошадь лошадка monkeyuser owl сова сыч rabbit bunny кролик snail улитка tits boobs tities + boobies сиси сисечки butt booty ass попа попка xkcd); + + my $bingo = 0; + + while (my $check = pop @cmds) { + if ($cmd eq $check) { + $bingo = 1; + last; + } + } + + # TODO: Заменить на сравнение со строкой? + if (($cmd =~ /^w\s/u) || ($cmd =~ /^п\s/u) || ($cmd =~ /^weather\s/u) || ($cmd =~ /^погода\s/u) || + ($cmd =~ /^погодка\s/u) || ($cmd =~ /^погадка\s/u) || ($cmd =~ /^karma\s/u) || ($cmd =~ /карма\s/u)) { + $bingo = 1; + } + + if ($bingo) { $rmsg->{message} = $text; $self->log->debug ('[DEBUG] Sending message to redis ' . Dumper ($rmsg)); + $#cmds = -1; + @cmds = qw (fortune фортунка f ф anek анек анекдот buni cat кис fox лис frog лягушка horse лошадь + лошадка monkeyuser owl сова сыч rabbit bunny кролик snail улитка tits boobs tities boobies сиси сисечки + butt booty ass попа попка xkcd); + + while (my $check = pop @cmds) { + if ($cmd eq $check) { + $rmsg->{misc}->{msg_format} = 1; + last; + } + } + { do { my $ready = eval { $main::RCONN->is_connected; }; @@ -100,139 +120,6 @@ sub Command { $pubsub->json ($c->{'redis_router_channel'})->notify ( $c->{'redis_router_channel'} => $rmsg ); - } elsif (substr ($text, 1) eq 'anek' || substr ($text, 1) eq 'анек' || substr ($text, 1) eq 'анекдот') { - $msg->typing (); - $reply = "```\n" . Anek () . "\n```"; - sleep (irand (2) + 1); - $msg->replyMd ($reply); - return; - } elsif (length ($text) >= 2 && (substr ($text, 1, 2) eq 'w ' || substr ($text, 1, 2) eq 'п ')) { - my $city = substr $text, 3; - $reply = Weather $city; - } elsif (substr ($text, 1, 7) eq 'погода ') { - my $city = substr $text, 7; - $reply = Weather $city; - } elsif ((substr ($text, 1, 8) eq 'погодка ') || (substr ($text, 1, 8) eq 'погадка ') || (substr ($text, 1, 8) eq 'weather ')){ - my $city = substr $text, 8; - $reply = Weather $city; - } elsif (substr ($text, 1) eq 'buni') { - $msg->typing (); - $reply = Buni (); - sleep (irand (2) + 1); - $msg->replyMd ($reply); - return; - } elsif (substr ($text, 1) eq 'monkeyuser') { - $msg->typing (); - $reply = Monkeyuser (); - sleep (irand (2) + 1); - $msg->replyMd ($reply); - return; - } elsif (substr ($text, 1) eq 'cat' || substr ($text, 1) eq 'кис') { - $msg->typing (); - $reply = Kitty (); - sleep (irand (2) + 1); - $msg->replyMd ($reply); - return; - } elsif (substr ($text, 1) eq 'frog' || substr ($text, 1) eq 'toad' || substr ($text, 1) eq 'лягушка') { - $msg->typing (); - $reply = Frog (); - sleep (irand (2) + 1); - $msg->replyMd ($reply); - return; - } elsif (substr ($text, 1) eq 'horse' || substr ($text, 1) eq 'лошадка') { - $msg->typing (); - $reply = Horse (); - sleep (irand (2) + 1); - $msg->replyMd ($reply); - return; - } elsif (substr ($text, 1) eq 'snail' || substr ($text, 1) eq 'улитка') { - $msg->typing (); - $reply = Snail (); - sleep (irand (2) + 1); - $msg->replyMd ($reply); - return; - } elsif (substr ($text, 1) eq 'lat' || substr ($text, 1) eq 'лат') { - $reply = Lat (); - } elsif ( - (length ($text) >= 6 && (substr ($text, 1, 6) eq 'karma ' || substr ($text, 1, 6) eq 'карма ')) || - substr ($text, 1) eq 'karma' || substr ($text, 1) eq 'карма' - ) { - my $mytext = ''; - - if (length($text) > 6) { - $mytext = substr $text, 7; - chomp $mytext; - $mytext = trim $mytext; - } else { - $mytext = ''; - } - - $reply = KarmaGet ($chatid, $mytext); - } elsif (substr ($text, 1) eq 'xkcd') { - $msg->typing (); - $reply = Xkcd (); - sleep (irand (2) + 1); - $msg->replyMd ($reply); - return; - } elsif (substr ($text, 1) eq 'fox' || substr ($text, 1) eq 'лис') { - $msg->typing (); - $reply = Fox (); - sleep (irand (2) + 1); - $msg->replyMd ($reply); - return; - } elsif (substr ($text, 1) eq 'rabbit' || substr ($text, 1) eq 'bunny' || substr ($text, 1) eq 'кролик') { - $msg->typing (); - $reply = Rabbit (); - $msg->replyMd ($reply); - return; - } elsif (substr ($text, 1) eq 'owl' || substr ($text, 1) eq 'сова') { - $msg->typing (); - $reply = Owl (); - $msg->replyMd ($reply); - return; - } elsif ( - substr ($text, 1) eq 'tits' || - substr ($text, 1) eq 'boobs' || - substr ($text, 1) eq 'tities' || - substr ($text, 1) eq 'boobies' || - substr ($text, 1) eq 'сиси' || - substr ($text, 1) eq 'сисечки' - ) { - if (PluginEnabled $chatid, 'oboobs') { - $msg->typing (); - $reply = Oboobs (); - sleep (irand (2) + 1); - $msg->replyMd ($reply); - } - - return; - } elsif ( - substr ($text, 1) eq 'butt' || - substr ($text, 1) eq 'booty' || - substr ($text, 1) eq 'ass' || - substr ($text, 1) eq 'попа' || - substr ($text, 1) eq 'попка' - ) { - if (PluginEnabled $chatid, 'obutts') { - $msg->typing (); - $reply = Obutts (); - sleep (irand (2) + 1); - $msg->replyMd ($reply); - } - - return; - } elsif (substr ($text, 1) eq 'friday' || substr ($text, 1) eq 'пятница') { - $reply = Friday (); - } elsif (substr ($text, 1) eq 'proverb' || substr ($text, 1) eq 'пословица') { - $reply = Proverb (); - } elsif (substr ($text, 1) eq 'fortune' || substr ($text, 1) eq 'фортунка' || substr ($text, 1) eq 'f' || substr ($text, 1) eq 'ф') { - $reply = sprintf "```\n%s\n```\n", trim (Fortune ()); - $msg->replyMd ($reply); - return; - } elsif (substr ($text, 1) eq 'drink' || substr ($text, 1) eq 'праздник') { - $msg->typing (); - $reply = Drink (); - sleep (irand (2) + 1); } elsif (substr ($text, 1) eq 'dig' || substr ($text, 1) eq 'копать') { $msg->typing (); $reply = Dig $highlight; @@ -266,17 +153,17 @@ ${csign}frog | ${csign}лягушка - лягушка ${csign}horse | ${csign}лошадка - лошадка ${csign}lat | ${csign}лат - сгенерить фразу из крылатых латинских выражений ${csign}monkeyuser - рандомный стрип MonkeyUser -${csign}owl | ${csign}сова - сова +${csign}owl | ${csign}сова | ${csign}сыч - сова ${csign}proverb | ${csign}пословица - рандомная русская пословица ${csign}ping | ${csign}пинг - попинговать бота ${csign}roll | ${csign}dice | ${csign}кости - бросить кости ${csign}snail | ${csign}улитка - улитка ${csign}ver | ${csign}version | ${csign}версия - что-то про версию ПО ${csign}w город | ${csign}п город - погода в указанном городе -${csign}weather город - погода в указанном городе -${csign}погода город - погода в указанном городе -${csign}погодка город - погода в указанном городе -${csign}погадка город - погода в указанном городе +${csign}weather город - погода в указанном городе +${csign}погода город - погода в указанном городе +${csign}погодка город - погода в указанном городе +${csign}погадка город - погода в указанном городе ${csign}xkcd - рандомный стрип с сайта xkcd.ru ${csign}karma фраза | ${csign}карма фраза - посмотреть карму фразы фраза-- | фраза++ - убавить или добавить карму фразе @@ -305,6 +192,8 @@ ${csign}admin oboobs # - где 1 - вкл, 0 - выкл плагина obo ${csign}admin oboobs - показываем ли сисечки по просьбе участников чата (команды ${csign}tits, ${csign}tities, ${csign}boobs, ${csign}boobies, ${csign}сиси, ${csign}сисечки) ${csign}admin obutts # - где 1 - вкл, 0 - выкл плагина obutts ${csign}admin obutts - показываем ли попки по просьбе участников чата (команды ${csign}ass, ${csign}butt, ${csign}booty, ${csign}попа, ${csign}попка) +${csign}admin chan_msg - оставляем ли сообщения присланные от имени (других) каналов +${csign}admin chan_msg # - где 1 - оставляем, 0 - удаляем ``` Типы сообщений: audio voice photo video animation sticker dice game poll document @@ -320,7 +209,9 @@ MYADMIN # this msg should be shown only if admins of chat request it if (($member->status eq 'administrator') || ($member->status eq 'creator')) { my $command = trim (substr $text, 7); - my ($cmd, $args) = split /\s+/, $command, 2; + $cmd = undef; + my $args; + ($cmd, $args) = split /\s+/, $command, 2; if ($cmd eq '') { return; @@ -354,6 +245,16 @@ MYADMIN } else { $reply = FortuneStatus ($chatid); } + } elsif ($cmd eq 'chan_msg') { + if (defined $args) { + if ($args == 1) { + $reply = ChanMsgToggle ($chatid, 1); + } elsif ($args == 0) { + $reply = ChanMsgToggle ($chatid, 0); + } + } else { + $reply = ChanMsgStatus ($chatid); + } } elsif ($cmd eq 'oboobs') { if (defined $args) { if ($args == 1) { diff --git a/lib/BotLib/Admin.pm b/lib/BotLib/Admin.pm index 672f4d6..2485d0e 100644 --- a/lib/BotLib/Admin.pm +++ b/lib/BotLib/Admin.pm @@ -18,7 +18,7 @@ use Exporter qw (import); our @ISA = qw / Exporter /; ## no critic (ClassHierarchies::ProhibitExplicitISA) our @EXPORT_OK = qw (@ForbiddenMessageTypes @PluginList GetForbiddenTypes AddForbiddenType DelForbiddenType ListForbidden FortuneToggle FortuneToggleList FortuneStatus PluginToggle PluginStatus - PluginEnabled); + PluginEnabled ChanMsgToggle ChanMsgStatus ChanMsgEnabled); my $c = LoadConf (); my $cachedir = $c->{cachedir}; @@ -176,6 +176,107 @@ sub FortuneToggleList () { return $cache->get_keys (); } +sub ChanMsgToggle (@) { + my $chatid = shift; + my $action = shift // undef; + my $phrase = 'Сообщения, пришедшие от имени каналов '; + + my $cache = CHI->new ( + driver => 'BerkeleyDB', + root_dir => $cachedir, + namespace => __PACKAGE__ . '_' . 'chan_msg' + ); + + my $state = $cache->get ($chatid); + + if (defined $action) { + if ($action) { + $cache->set ($chatid, 1, 'never'); + $phrase .= 'не будут удаляться.'; + } else { + if (defined $state && $state) { + $cache->set ($chatid, 0, 'never'); + $phrase .= 'будут удаляться.'; + } else { + $cache->set ($chatid, 1, 'never'); + $phrase .= 'не будут удаляться.'; + } + } + } else { + if (defined $state){ + if ($state) { + $cache->set ($chatid, 0, 'never'); + $phrase .= 'будут удаляться.'; + } else { + $cache->set ($chatid, 1, 'never'); + $phrase .= 'не будут удаляться.'; + } + } else { + $cache->set ($chatid, 1, 'never'); + $phrase .= 'не будут удаляться.'; + } + } + + return $phrase; +} + +sub ChanMsgStatus ($) { + my $chatid = shift; + my $phrase = 'Сообщения, пришедшие от имени каналов '; + + my $cache = CHI->new ( + driver => 'BerkeleyDB', + root_dir => $cachedir, + namespace => __PACKAGE__ . '_' . 'chan_msg' + ); + + my $state = $cache->get ($chatid); + + if (defined $state) { + if ($state) { + $phrase .= 'не удаляются.'; + } else { + $phrase .= 'удаляются.'; + } + } else { + $phrase .= 'не удаляются.'; + } + + return $phrase; +} + +sub ChanMsgEnabled ($) { + my $chatid = shift; + + my $cache = CHI->new ( + driver => 'BerkeleyDB', + root_dir => $cachedir, + namespace => __PACKAGE__ . '_' . 'chan_msg' + ); + + my $state = $cache->get ($chatid); + + if (defined $state) { + if ($state) { + return 1; + } else { + return 0; + } + } else { + return 1; + } +} + +sub ChanMsgToggleList () { + my $cache = CHI->new ( + driver => 'BerkeleyDB', + root_dir => $cachedir, + namespace => __PACKAGE__ . '_' . 'chan_msg' + ); + + return $cache->get_keys (); +} + sub PluginStatus (@) { my $chatid = shift; my $plugin = shift; diff --git a/lib/BotLib/Anek.pm b/lib/BotLib/Anek.pm deleted file mode 100644 index e9fe658..0000000 --- a/lib/BotLib/Anek.pm +++ /dev/null @@ -1,88 +0,0 @@ -package BotLib::Anek; - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use English qw ( -no_match_vars ); -use Encode; -use HTML::TokeParser; -use JSON::XS; -use Log::Any qw ($log); -use Mojo::UserAgent; - -use version; our $VERSION = qw (1.0); -use Exporter qw (import); -our @EXPORT_OK = qw (Anek); - -sub Anek { - my $r; - my $ret = 'Все рассказчики анекдотов отдыхают'; - my $got_anek = 0; - - for (1..3) { - for (1..3) { - my $ua = Mojo::UserAgent->new->connect_timeout (3); - $ua->max_redirects(3); - $r = $ua->get ('https://www.anekdot.ru/rss/randomu.html')->result; - - if ($r->is_success) { - last; - } - - sleep 2; - } - - if ($r->is_success) { - my $json; - my $response_text = decode ('UTF-8', $r->body); - my @text = split /\n/, $response_text; - - while (my $str = pop @text) { - if ($str =~ /^var anekdot_texts \= JSON/) { - $str = (split /JSON\.parse\(\'/, $str, 2)[1]; - - if (defined $str && length ($str) > 10) { - $json = (split /\';\)/, $str, 2)[0]; - last; - } - } - } - - if (defined $json && length ($json) > 10) { - $json =~ s/\\"/"/g; - $json =~ s/\\\\"/\\"/g; - $json = substr $json, 0, -3; - - my $anek = eval { ${JSON::XS->new->relaxed->decode ($json)}[0] }; - - if (defined $anek) { - my @anek = split /
/, $anek; - $ret = join "\n", @anek; - - if (length ($ret) > 1) { - $got_anek = 1; - } - } else { - $log->warn (sprintf '[WARN] anekdot.ru server returns incorrect json, full response text message: %s', $response_text); - } - } else { - $log->warn (sprintf '[WARN] anekdot.ru server returns unexpected response text: %s', $r->body); - } - - } else { - $log->warn (sprintf '[WARN] anekdot.ru server return status %s with message: %s', $r->code, $r->message); - } - - if ($got_anek) { - last; - } - } - - return $ret; -} - -1; - -# vim: set ft=perl noet ai ts=4 sw=4 sts=4: diff --git a/lib/BotLib/Buni.pm b/lib/BotLib/Buni.pm deleted file mode 100644 index be01d66..0000000 --- a/lib/BotLib/Buni.pm +++ /dev/null @@ -1,60 +0,0 @@ -package BotLib::Buni; - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use English qw ( -no_match_vars ); -use Carp qw (cluck); -use HTML::TokeParser; -use Log::Any qw ($log); -use Mojo::UserAgent; - -use version; our $VERSION = qw (1.0); -use Exporter qw (import); -our @EXPORT_OK = qw (Buni); - -sub Buni { - my $r; - my $ret = 'Нету Buni'; - - for (1..3) { - my $ua = Mojo::UserAgent->new->connect_timeout (3); - $ua->max_redirects(3); - $r = $ua->get ('http://www.bunicomic.com/?random&nocache=1')->result; - - if ($r->is_success) { - last; - } - - sleep 2; - } - - if ($r->is_success) { - my $p = HTML::TokeParser->new(\$r->body); - my @a; - - # additional {} required in order "last" to work properly :) - { - do { - $#a = -1; - @a = $p->get_tag('meta'); ## no critic (Variables::RequireLocalizedPunctuationVars) - - if (defined $a[0][1]->{property} && $a[0][1]->{property} eq 'og:image') { - $ret = sprintf '[buni](%s)', $a[0][1]->{content}; - last; - } - - } while ($#{$a[0]} > 1); - } - } else { - $log->warn (sprintf '[WARN] Bunicomic server return status %s with message: %s', $r->code, $r->message); - } - - return $ret; -} - -1; - -# vim: set ft=perl noet ai ts=4 sw=4 sts=4: diff --git a/lib/BotLib/Drink.pm b/lib/BotLib/Drink.pm deleted file mode 100644 index 8fba940..0000000 --- a/lib/BotLib/Drink.pm +++ /dev/null @@ -1,115 +0,0 @@ -package BotLib::Drink; - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use CHI; -use CHI::Driver::BerkeleyDB; -use DateTime; -use English qw ( -no_match_vars ); -use Encode; -use Carp qw (cluck); -use HTML::TokeParser; -use Log::Any qw ($log); -use Mojo::Log; -use Mojo::UserAgent::Cached; -use POSIX qw (strftime); -use BotLib::Conf qw (LoadConf); - -use version; our $VERSION = qw (1.0); -use Exporter qw (import); -our @EXPORT_OK = qw (Drink); - -my @MONTH = qw (yanvar fevral mart aprel may iyun iyul avgust sentyabr oktyabr noyabr dekabr); -my $c = LoadConf (); -my $cachedir = $c->{cachedir}; - -sub Drink { - my $r; - my $ret = 'Не знаю праздников - вджобываю весь день на шахтах, как проклятая.'; - my ($dayNum, $monthNum) = (localtime ())[3, 4]; - my $url = sprintf 'https://kakoysegodnyaprazdnik.ru/baza/%s/%s', $MONTH[$monthNum], $dayNum; - - # Those POSIX assholes just forgot to add unix timestamps without TZ offset, so... - my ($mday, $mon, $year) = (gmtime ())[3, 4, 5]; - my $offset = strftime ('%z', gmtime ()); - my $offsetMinutes = (substr $offset, -2) * 60; - my $offsetHours = (substr $offset, 1, 2) * 60 * 60; - my $offsetSign; - - if ((substr $offset, 0, 1) eq '+') { - $offsetSign = 1; - } - - my $expirationDate = DateTime->new ( - year => $year + 1900, - month => $mon + 1, - day => $mday, - hour => 0, - minute => 0, - second => 0 - )->add (days => 1)->strftime ('%s'); - - if ((substr $offset, 0, 1) eq '+') { - $expirationDate = $expirationDate - $offsetHours - $offsetMinutes; - } else { - $expirationDate = $expirationDate + $offsetHours + $offsetMinutes; - } - - for (1..3) { - my $ua = Mojo::UserAgent::Cached->new->connect_timeout (3); - $ua->cache_agent( - CHI->new ( - driver => 'BerkeleyDB', - root_dir => $cachedir, - namespace => __PACKAGE__, - expires_at => $expirationDate, - expires_on_backend => 1, - ) - ); - # just to make Mojo::UserAgent::Cached happy - $ua->logger (Mojo::Log->new (path => '/dev/null', level => 'error')); - $r = $ua->get ($url => {'Accept-Language' => 'ru-RU', 'Accept-Charset' => 'utf-8'})->result; - - if ($r->is_success) { - last; - } - - sleep 2; - } - - if ($r->is_success) { - my $p = HTML::TokeParser->new(\$r->body); - my @a; - my @holyday; - - do { - $#a = -1; - @a = $p->get_tag('span'); ## no critic (Variables::RequireLocalizedPunctuationVars) - - if ($#{$a[0]} > 2 && defined $a[0][1]->{itemprop} && $a[0][1]->{itemprop} eq 'text') { - push @holyday,'* ' . decode ('UTF-8', $p->get_trimmed_text ('/span')); - } - - } while ($#{$a[0]} > 1); - - if ($#holyday > 0) { - # cut off something weird, definely not a "holyday" - $#holyday = $#holyday - 1; - } - - if ($#holyday > 0) { - $ret = join "\n", @holyday; - } - } else { - $log->warn (sprintf '[WARN] Kakoysegodnyaprazdnik server return status %s with message: %s', $r->code, $r->message); - } - - return $ret; -} - -1; - -# vim: set ft=perl noet ai ts=4 sw=4 sts=4: diff --git a/lib/BotLib/Fortune.pm b/lib/BotLib/Fortune.pm deleted file mode 100644 index 565aae8..0000000 --- a/lib/BotLib/Fortune.pm +++ /dev/null @@ -1,86 +0,0 @@ -package BotLib::Fortune; -# Any fortune_mod sources are suitable. Text file with "\n%\n" sentence delimeter. - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use English qw ( -no_match_vars ); -use Carp qw (cluck croak); -use File::Path qw (make_path); -use Log::Any qw ($log); -use Math::Random::Secure qw (irand); -use SQLite_File; -use BotLib::Conf qw (LoadConf); - -use version; our $VERSION = qw (1.0); -use Exporter qw (import); -our @EXPORT_OK = qw (Seed Fortune); - -my $c = LoadConf (); -my $dir = $c->{fortune}->{dir}; -my $srcdir = $c->{fortune}->{srcdir}; - -sub Seed () { - unless (-d $dir) { - make_path ($dir) || croak "Unable to create $dir: $OS_ERROR"; - } - - my $backingfile = sprintf '%s/fortune.sqlite', $dir; - - if (-f $backingfile) { - unlink $backingfile || croak "Unable to remove $backingfile: $OS_ERROR"; - } - - tie my @fortune, 'SQLite_File', $backingfile || croak "Unable to tie to $backingfile: $OS_ERROR"; - - opendir (my $srcdirhandle, $srcdir) || croak "Unable to open $srcdir: $OS_ERROR"; - - while (my $fortunefile = readdir ($srcdirhandle)) { - my $srcfile = sprintf '%s/%s', $srcdir, $fortunefile; - - unless (-f $srcfile) { - next; - } - - if ($fortunefile =~ m/^\.+$/) { - next; - } - - open (my $fh, '<', $srcfile) || croak "Unable to open $srcfile, $OS_ERROR"; - # set correct phrase delimiter - local $INPUT_RECORD_SEPARATOR = "\n%\n"; - - while (readline $fh) { - my $phrase = substr $_, 0, -3; - push @fortune, $phrase; - } - - close $fh; ## no critic (InputOutput::RequireCheckedSyscalls, InputOutput::RequireCheckedOpen) - } - - closedir $srcdirhandle; - untie @fortune; - return; -} - -# just return answer -sub Fortune () { - my $backingfile = sprintf '%s/fortune.sqlite', $dir; - - tie my @array, 'SQLite_File', $backingfile || do { - $log->error ("[ERROR] Unable to tie to $backingfile: $OS_ERROR"); - return ''; - }; - - my $phrase = $array[irand ($#array + 1)]; - # decode? - utf8::decode $phrase; - untie @array; - return $phrase; -} - -1; - -# vim: ft=perl noet ai ts=4 sw=4 sts=4: diff --git a/lib/BotLib/Friday.pm b/lib/BotLib/Friday.pm deleted file mode 100644 index fe9d14b..0000000 --- a/lib/BotLib/Friday.pm +++ /dev/null @@ -1,96 +0,0 @@ -package BotLib::Friday; -# for friday data stolen from https://raw.githubusercontent.com/isida/vi/master/data/friday.txt - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use English qw ( -no_match_vars ); -use Carp qw (cluck croak); -use File::Path qw (make_path); -use Log::Any qw ($log); -use Math::Random::Secure qw (irand); -use SQLite_File; -use BotLib::Conf qw (LoadConf); - -use version; our $VERSION = qw (1.0); -use Exporter qw (import); -our @EXPORT_OK = qw (Seed Friday); - -my $c = LoadConf (); -my $dir = $c->{friday}->{dir}; -my $srcfile = $c->{friday}->{src}; -my @dow = qw (monday tuesday wednesday thursday friday saturday sunday); - -sub Seed () { - unless (-d $dir) { - make_path ($dir) || croak "Unable to create $dir: $OS_ERROR"; - } - - my $friday; - - for (0..$#dow) { - my $backingfile = sprintf '%s/%s.sqlite', $dir, $dow[$_]; - - if (-f $backingfile) { - unlink $backingfile || croak "Unable to remove $backingfile: $OS_ERROR\n"; - } - - tie @{$friday->[$_]}, 'SQLite_File', $backingfile || croak "Unable to tie to $backingfile: $OS_ERROR\n"; - } - - open (my $fh, '<', $srcfile) || croak "Unable to open $srcfile, $OS_ERROR\n"; - - while (readline $fh) { - unless (m/ \|\| /xmsg) { - next; - } - - chomp(); - my ($phrase, $days) = split(/ \|\| /); - my @daylist = split(//, $days); - - foreach my $day (@daylist) { - unless (defined $day) { - next; - } - - unless ($day =~ /^\d$/) { - next; - } - - if (defined $phrase && ($phrase ne '') && ($phrase !~ m/^\s+$/xmsg)) { - push @{$friday->[$day - 1]}, $phrase; - } - } - } - - close $fh; ## no critic (InputOutput::RequireCheckedSyscalls, InputOutput::RequireCheckedOpen) - - for (0..$#dow) { - untie $friday->[$_]; - } - - return; -} - -# just return answer -sub Friday () { - my $today = (localtime (time))[6] - 1; - my $backingfile = sprintf '%s/%s.sqlite', $dir, $dow[$today]; - - tie my @array, 'SQLite_File', $backingfile || do { - $log->error ("[ERROR] Unable to tie to $backingfile: $OS_ERROR\n"); - return ''; - }; - - my $phrase = $array[irand ($#array + 1)]; - utf8::decode $phrase; - untie @array; - return $phrase; -} - -1; - -# vim: ft=perl noet ai ts=4 sw=4 sts=4: diff --git a/lib/BotLib/Image.pm b/lib/BotLib/Image.pm deleted file mode 100644 index b2563dc..0000000 --- a/lib/BotLib/Image.pm +++ /dev/null @@ -1,241 +0,0 @@ -package BotLib::Image; - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use English qw ( -no_match_vars ); -use Carp qw (cluck); -use Log::Any qw ($log); -use Math::Random::Secure qw (irand); -use Mojo::UserAgent; -use BotLib::Image::Flickr qw (FlickrByTags); -use BotLib::Image::Imgur qw (Imgur); -use BotLib::Util qw (urlencode); - -use version; our $VERSION = qw (1.0); -use Exporter qw (import); -our @EXPORT_OK = qw (Kitty Fox Oboobs Obutts Rabbit Owl Frog Horse Snail); - -sub Kitty { - my $r; - my $ret = 'Нету кошечек, все разбежались.'; - - for (1..3) { - my $ua = Mojo::UserAgent->new->connect_timeout (3); - $r = $ua->get ('https://api.thecatapi.com/v1/images/search')->result; - - if ($r->is_success) { - last; - } - - sleep 2; - } - - if ($r->is_success) { - my $jcat = eval { - return $r->json; - }; - - unless (defined $jcat) { - $log->warn ("[WARN] Unable to decode JSON from thecatapi: $EVAL_ERROR"); - } else { - if ($jcat->[0]->{url}) { - my @cats = ('龴ↀ◡ↀ龴', '=^..^=', '≧◔◡◔≦ ','^ↀᴥↀ^'); - $ret = sprintf '[%s](%s)', $cats[irand ($#cats + 1)], $jcat->[0]->{url}; - } - } - } else { - $log->warn (sprintf '[WARN] Thecatapi server return status %s with message: %s', $r->code, $r->message); - } - - return $ret; -} - -sub Fox { - my $r; - my $ret = 'Нету лисичек, все разбежались.'; - - for (1..3) { - my $ua = Mojo::UserAgent->new->connect_timeout (3); - $r = $ua->get ('https://randomfox.ca/floof/')->result; - - if ($r->is_success) { - last; - } - - sleep 2; - } - - if ($r->is_success) { - my $jfox = eval { - return $r->json; - }; - - unless (defined $jfox) { - $log->warn ("[WARN] Unable to decode JSON from randomfox: $EVAL_ERROR"); - } else { - if ($jfox->{image}) { - $jfox->{image} =~ s/\\//xmsg; - $ret = sprintf '[-^^,--,~](%s)', $jfox->{image}; - } - } - } else { - $log->warn (sprintf '[WARN] Randomfox server return status %s with message: %s', $r->code, $r->message); - } - - return $ret; -} - -sub Oboobs { - my $r; - my $ret = 'Нету cисичек, все разбежались.'; - - for (1..3) { - my $ua = Mojo::UserAgent->new->connect_timeout (3); - $r = $ua->get ('http://api.oboobs.ru/boobs/0/1/random')->result; - - if ($r->is_success) { - last; - } - - sleep 2; - } - - if ($r->is_success) { - my $joboobs = eval { - return $r->json; - }; - - unless (defined $joboobs) { - $log->warn ("[WARN] Unable to decode JSON from oboobs: $EVAL_ERROR"); - } else { - if ($joboobs->[0]->{preview}) { - my @boobs = ('(. )( .)', '( . Y . )', '(o)(o)', '( @ )( @ )', '(.)(.)'); - $ret = sprintf '[%s](https://media.oboobs.ru/%s)', $boobs[irand ($#boobs + 1)], $joboobs->[0]->{preview}; - } - } - } else { - $log->warn (sprintf '[WARN] Oboobs server return status %s with message: %s', $r->code, $r->message); - } - - return $ret; -} - -sub Obutts { - my $r; - my $ret = 'Нету попок, все разбежались.'; - - for (1..3) { - my $ua = Mojo::UserAgent->new->connect_timeout (3); - $r = $ua->get ('http://api.obutts.ru/butts/0/1/random')->result; - - if ($r->is_success) { - last; - } - - sleep 2; - } - - if ($r->is_success) { - my $jobutts = eval { - return $r->json; - }; - - unless (defined $jobutts) { - $log->warn ("[ERROR] Unable to decode JSON from obutts: $EVAL_ERROR"); - } else { - if ($jobutts->[0]->{preview}) { - my @butts = ('(__(__)', '(_!_)', '(__.__)'); - $ret = sprintf '[%s](http://media.obutts.ru/%s)', $butts[irand ($#butts + 1)], $jobutts->[0]->{preview}; - } - } - } else { - $log->warn (sprintf '[WARN] Obutts server return status %s with message: %s', $r->code, $r->message); - } - - return $ret; -} - -# It works but results are not particularly relevant, partially. about 20-30% miss -# So i prefer to use flickr rabbits selection :) -sub rabbit_imgur { - my @terms = ( - urlencode '?q=animals AND (rabbits OR bunnies)', - urlencode 'year?q=animals AND (rabbits OR bunnies)', - urlencode 'relevance?q=animals AND (rabbits OR bunnies)', - urlencode 'relevance/year?q=animals AND (rabbits OR bunnies)', - urlencode 'score?q_not=cat OR kitten OR kittens OR dog OR cats OR dogs OR puppy OR puppies&q_tags=bunnies,bunny,rabbits,rabbit', - ); - - my $rabbit = Imgur ($terms[irand ($#terms + 1)]); - # return just large thumbnail instead of real photo (that can be really huge) - $rabbit = sprintf '%sl%s', substr ($rabbit, 0, -4), substr ($rabbit, -4); - - if (defined $rabbit) { - return sprintf '[(\_/)](%s)', $rabbit; - } else { - return 'Нету кроликов, все разбежались.' - } -} - -sub Rabbit { - # rabbit, but bunny - my $url = FlickrByTags ('animal,bunny'); - - if (defined $url) { - return sprintf '[(\_/)](%s)', $url; - } else { - return 'Нету кроликов, все разбежались.'; - } -} - -sub Owl { - my $url = FlickrByTags ('bird,owl'); - - if (defined $url) { - return sprintf '[{ O v O }](%s)', $url; - } else { - return 'Нету сов, все разлетелись.'; - } -} - -sub Frog { - # unable to find any one-line ascii art for frog :( - my @art = qw (frog toad лягушка); - my $url = FlickrByTags ('frog,toad,amphibian'); - - if (defined $url) { - return sprintf '[%s](%s)', $art [irand ($#art + 1)], $url; - } else { - return 'Нету лягушек, все свалили.'; - } -} - -sub Horse { - # unable to find any one-line ascii art for frog :( - my @art = qw (horse лошадь лошадка); - my $url = FlickrByTags ('horse,equine,mammal'); - - if (defined $url) { - return sprintf '[%s](%s)', $art [irand ($#art + 1)], $url; - } else { - return 'Нету коняшек, все разбежались.'; - } -} - -sub Snail { - # unable to find any one-line ascii art for frog :( - my @art = qw ('-'_@_ @╜ @_'-'); - my $url = FlickrByTags ('snail,slug'); - - if (defined $url) { - return sprintf '[%s](%s)', $art [irand ($#art + 1)], $url; - } else { - return 'Нету улиток, все расползлись.'; - } -} -1; - -# vim: set ft=perl noet ai ts=4 sw=4 sts=4: diff --git a/lib/BotLib/Image/Flickr.pm b/lib/BotLib/Image/Flickr.pm deleted file mode 100644 index f2de080..0000000 --- a/lib/BotLib/Image/Flickr.pm +++ /dev/null @@ -1,599 +0,0 @@ -package BotLib::Image::Flickr; - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use English qw ( -no_match_vars ); -use Carp qw (cluck); -use CHI; -use CHI::Driver::BerkeleyDB; -use Digest::HMAC_SHA1 qw (hmac_sha1); -use Log::Any qw ($log); -use Math::Random::Secure qw (irand); -use MIME::Base64; -use Mojo::UserAgent; -use URI::Encode::XS qw (uri_encode); - -use BotLib::Conf qw (LoadConf); -use BotLib::Util qw (urlencode); - -use Data::Dumper; - -use version; our $VERSION = qw (1.0); -use Exporter qw (import); -our @EXPORT_OK = qw (FlickrInit FlickrByTags FlickrByText FlickrTestLogin); - -my $c = LoadConf (); -my $cachedir = $c->{cachedir}; - -my $flickr_consumer_key = $c->{image}->{flickr}->{consumer_key}; -my $flickr_consumer_secret = $c->{image}->{flickr}->{consumer_secret}; -my $flickr_verifier = $c->{image}->{flickr}->{verifier}; -my $flickr_request_token_url = 'https://www.flickr.com/services/oauth/request_token'; -my $flickr_authorization_url = 'https://www.flickr.com/services/oauth/authorize'; -my $flickr_access_token_url = 'https://www.flickr.com/services/oauth/access_token'; -my $flickr_callback_url = 'http://www.example.com'; -my $flickr_api_url = 'https://www.flickr.com/services/rest/'; - -sub mknonce { - # make random number, 8 symbols in length - my $nonce = sprintf '%08d', irand (99999999); - return $nonce; -} - -sub flickerSignReq { - my %p = @_; - my $string; - my $hmac; - - if ($p{type} eq 'request_token') { - my @parameters; - delete $p{type}; - push @parameters, 'oauth_signature_method=HMAC-SHA1'; - push @parameters, 'oauth_version=1.0'; - push @parameters, sprintf 'oauth_callback=%s', uri_encode ($flickr_callback_url); - push @parameters, sprintf 'oauth_consumer_key=%s', $flickr_consumer_key; - - foreach my $param (keys %p) { - push @parameters, sprintf ('%s=%s', $param, $p{$param}); - } - - $string = sprintf 'GET&%s&', uri_encode ($flickr_request_token_url); - $string .= uri_encode (join '&', sort (@parameters)); - # Thanks to twitter api dev portal, they explain this particular case: while we requesting this token - # we do not yet know access_token secret, so we just omit it in this signature - # https://developer.twitter.com/en/docs/authentication/oauth-1-0a/creating-a-signature - $hmac = Digest::HMAC_SHA1->new (sprintf '%s&', uri_encode ($flickr_consumer_secret)); - } elsif ($p{type} eq 'access_token') { - my @parameters; - my $flickr_request_token_secret = $p{oauth_token_secret}; - delete $p{oauth_token_secret}; - delete $p{type}; - push @parameters, 'oauth_signature_method=HMAC-SHA1'; - push @parameters, 'oauth_version=1.0'; - push @parameters, sprintf 'oauth_consumer_key=%s', $flickr_consumer_key; - - foreach my $param (keys %p) { - push @parameters, sprintf ('%s=%s', $param, $p{$param}); - } - - $string = sprintf 'GET&%s&', uri_encode ($flickr_access_token_url); - $string .= uri_encode (join '&', sort (@parameters)); - $hmac = Digest::HMAC_SHA1->new (sprintf '%s&%s', uri_encode ($flickr_consumer_secret), uri_encode ($flickr_request_token_secret)); - } elsif ($p{type} eq 'test_login' || $p{type} eq 'search_text' || $p{type} eq 'search_tags') { - my @parameters; - my $flickr_request_token_secret = $p{oauth_token_secret}; - delete $p{oauth_token_secret}; - delete $p{type}; - - foreach my $param (keys %p) { - push @parameters, sprintf ('%s=%s', $param, $p{$param}); - } - - $string = sprintf 'GET&%s&', uri_encode ($flickr_api_url); - $string .= uri_encode (join '&', sort (@parameters)); - $hmac = Digest::HMAC_SHA1->new (sprintf '%s&%s', uri_encode ($flickr_consumer_secret), uri_encode ($flickr_request_token_secret)); - } - - $hmac->add ($string); - return encode_base64 ($hmac->digest, ''); -} - -sub flickrRequestToken { - my $oauth_timestamp = time (); - my $oauth_nonce = mknonce (); - - my $oauth_signature = flickerSignReq ( - type => 'request_token', - oauth_timestamp => $oauth_timestamp, - oauth_nonce => $oauth_nonce - ); - - my $url = $flickr_request_token_url . sprintf ( - '?oauth_nonce=%s&oauth_timestamp=%s&oauth_consumer_key=%s&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&&oauth_signature=%s&oauth_callback=%s', - $oauth_nonce, - $oauth_timestamp, - $flickr_consumer_key, - uri_encode ($oauth_signature), - uri_encode ($flickr_callback_url) - ); - - my $ua = Mojo::UserAgent->new->connect_timeout (5); - my $r = $ua->get ($url)->result; - my %params; - - if ($r->is_success) { - # they ignore format=json, so... - %params = map {split /=/} split /&/, $r->body; - } else { - say "Something bad returns from flickr api: $r->code $r->message"; ## no critic (InputOutput::RequireCheckedSyscalls) - } - - return %params; -} - -sub flickrAccessToken { - my $flickr_request_token = shift; - my $flickr_request_token_secret = shift; - my $flickr_verifier = shift; ## no critic (Variables::ProhibitReusedNames) - - my $oauth_timestamp = time (); - my $oauth_nonce = mknonce (); - - my $oauth_signature = flickerSignReq ( - type => 'access_token', - oauth_timestamp => $oauth_timestamp, - oauth_nonce => $oauth_nonce, - oauth_token => $flickr_request_token, - oauth_token_secret => $flickr_request_token_secret, - oauth_verifier => $flickr_verifier - ); - - my $url = $flickr_access_token_url . sprintf ( - '?oauth_nonce=%s&oauth_timestamp=%s&oauth_verifier=%s&oauth_consumer_key=%s&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oauth_token=%s&oauth_signature=%s', - $oauth_nonce, - $oauth_timestamp, - $flickr_verifier, - $flickr_consumer_key, - $flickr_request_token, - uri_encode ($oauth_signature) - ); - - my $ua = Mojo::UserAgent->new->connect_timeout (5); - my $r = $ua->get ($url)->result; - my %params; - - if ($r->is_success) { - # they ignore format=json - %params = map {split /=/} split /&/, $r->body; - } else { - say "Something bad returns from flickr api: $r->code $r->message"; ## no critic (InputOutput::RequireCheckedSyscalls) - } - - return %params; -} - -sub flickrAuthorization { - my $flickr_request_token = shift; - - my $url = $flickr_authorization_url . sprintf ( - '?oauth_token=%s&perms=read', - $flickr_request_token, - ); - - my $ua = Mojo::UserAgent->new->connect_timeout (5); - my $r = $ua->get ($url)->result; - - if ($r->code == 302) { - return $r->content->headers->location; - } else { - printf "Something went wrong: %s %s\n", $r->code, $r->message; - return; - } -} - -sub flickrTestLogin { - my $flickr_access_token = shift; - my $flickr_access_token_secret = shift; - - my $oauth_timestamp = time (); - my $oauth_nonce = mknonce (); - - my $oauth_signature = flickerSignReq ( - nojsoncallback => 1, - oauth_nonce => $oauth_nonce, - format => 'json', - oauth_consumer_key => $flickr_consumer_key, - oauth_timestamp => $oauth_timestamp, - type => 'test_login', - method => 'flickr.test.login', - oauth_token => $flickr_access_token, - oauth_token_secret => $flickr_access_token_secret, - oauth_signature_method => 'HMAC-SHA1', - oauth_version => '1.0' - ); - - my $url = $flickr_api_url . sprintf ( - '?nojsoncallback=1&oauth_nonce=%s&format=json&oauth_consumer_key=%s&oauth_timestamp=%s&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oauth_token=%s&oauth_signature=%s&method=flickr.test.login', - $oauth_nonce, - $flickr_consumer_key, - $oauth_timestamp, - $flickr_access_token, - uri_encode ($oauth_signature) - ); - - my $ua = Mojo::UserAgent->new->connect_timeout (5); - my $r = $ua->get ($url)->result; - - if ($r->is_success) { - my $response = eval { - return $r->json; - }; - - if (defined $response) { - say Dumper $response; ## no critic (InputOutput::RequireCheckedSyscalls) - return 1; - } else { - say "Flickr api returns incorrect json: $r->message"; ## no critic (InputOutput::RequireCheckedSyscalls) - return 0; - } - } else { - say "HTTP status code not 200: $r->code, $r->message"; ## no critic (InputOutput::RequireCheckedSyscalls) - return 0; - } -} - -sub flickrSearchByText { - my $flickr_access_token = shift; - my $flickr_access_token_secret = shift; - my $text = shift; - - my $oauth_timestamp = time (); - my $oauth_nonce = mknonce (); - - my $oauth_signature = flickerSignReq ( - nojsoncallback => 1, - oauth_nonce => $oauth_nonce, - format => 'json', - oauth_consumer_key => $flickr_consumer_key, - oauth_timestamp => $oauth_timestamp, - type => 'search_text', - content_type => 1, - media => 'photos', - method => 'flickr.photos.search', - text => $text, - per_page => 1, - oauth_token => $flickr_access_token, - oauth_token_secret => $flickr_access_token_secret, - oauth_signature_method => 'HMAC-SHA1', - oauth_version => '1.0' - ); - - my $url = $flickr_api_url . sprintf ( - '?nojsoncallback=1&oauth_nonce=%s&format=json&oauth_consumer_key=%s&oauth_timestamp=%s&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oauth_token=%s&oauth_signature=%s&method=flickr.photos.search&content_type=1&media=photos&per_page=1&text=%s', - $oauth_nonce, - $flickr_consumer_key, - $oauth_timestamp, - $flickr_access_token, - uri_encode ($oauth_signature), - uri_encode ($text) - ); - - my $ua = Mojo::UserAgent->new->connect_timeout (5); - my $r = $ua->get ($url)->result; - - if ($r->is_success) { - my $response = eval { - return $r->json; - }; - - if (defined $response) { - # lets make another query, this time with random picture - my $page = irand int ($response->{photos}->{total} / 500); - $oauth_timestamp = time (); - $oauth_nonce = mknonce (); - $oauth_signature = flickerSignReq ( - nojsoncallback => 1, - oauth_nonce => $oauth_nonce, - format => 'json', - oauth_consumer_key => $flickr_consumer_key, - oauth_timestamp => $oauth_timestamp, - type => 'search_text', - content_type => 1, - media => 'photos', - method => 'flickr.photos.search', - text => $text, - page => $page, - per_page => 500, - oauth_token => $flickr_access_token, - oauth_token_secret => $flickr_access_token_secret, - oauth_signature_method => 'HMAC-SHA1', - oauth_version => '1.0' - ); - - $url = $flickr_api_url . sprintf ( - '?nojsoncallback=1&oauth_nonce=%s&format=json&oauth_consumer_key=%s&oauth_timestamp=%s&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oauth_token=%s&oauth_signature=%s&method=flickr.photos.search&content_type=1&media=photos&per_page=500&page=%d&text=%s', - $oauth_nonce, - $flickr_consumer_key, - $oauth_timestamp, - $flickr_access_token, - uri_encode ($oauth_signature), - $page, - uri_encode ($text) - ); - - $ua = Mojo::UserAgent->new->connect_timeout (5); - $r = $ua->get ($url)->result; - - - if ($r->is_success) { - $response = eval { - return $r->json; - }; - - if (defined $response) { - return $response; - } else { - $log->warn ("[WARN] Flickr api returns incorrect json: $r->message"); - return undef; - } - } else { - $log->warn ("[WARN] Flickr api returns incorrect json: $r->message"); - return undef; - } - } else { - $log->warn ("[WARN] Flickr api returns incorrect json: $r->message"); - return undef; - } - } else { - $log->warn ("[WARN] Flickr api HTTP status code not 200: $r->code, $r->message"); - return undef; - } -} - -sub flickrSearchByTags { - my $flickr_access_token = shift; - my $flickr_access_token_secret = shift; - my $tags = shift; - - my $oauth_timestamp = time (); - my $oauth_nonce = mknonce (); - - my $oauth_signature = flickerSignReq ( - nojsoncallback => 1, - oauth_nonce => $oauth_nonce, - format => 'json', - oauth_consumer_key => $flickr_consumer_key, - oauth_timestamp => $oauth_timestamp, - type => 'search_tags', - content_type => 1, - media => 'photos', - method => 'flickr.photos.search', - tags => $tags, - per_page => 1, - oauth_token => $flickr_access_token, - oauth_token_secret => $flickr_access_token_secret, - oauth_signature_method => 'HMAC-SHA1', - oauth_version => '1.0' - ); - - my $url = $flickr_api_url . sprintf ( - '?nojsoncallback=1&oauth_nonce=%s&format=json&oauth_consumer_key=%s&oauth_timestamp=%s&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oauth_token=%s&oauth_signature=%s&method=flickr.photos.search&content_type=1&media=photos&per_page=1&tags=%s&tag_mode=all', - $oauth_nonce, - $flickr_consumer_key, - $oauth_timestamp, - $flickr_access_token, - uri_encode ($oauth_signature), - uri_encode ($tags) - ); - - my $ua = Mojo::UserAgent->new->connect_timeout (5); - my $r = $ua->get ($url)->result; - - if ($r->is_success) { - my $response = eval { - return $r->json; - }; - - if (defined $response) { - # lets make another query, this time with random picture - my $page = irand int ($response->{photos}->{total} / 500); - $oauth_timestamp = time (); - $oauth_nonce = mknonce (); - $oauth_signature = flickerSignReq ( - nojsoncallback => 1, - oauth_nonce => $oauth_nonce, - format => 'json', - oauth_consumer_key => $flickr_consumer_key, - oauth_timestamp => $oauth_timestamp, - type => 'search_text', - content_type => 1, - media => 'photos', - method => 'flickr.photos.search', - tags => $tags, - page => $page, - per_page => 500, - oauth_token => $flickr_access_token, - oauth_token_secret => $flickr_access_token_secret, - oauth_signature_method => 'HMAC-SHA1', - oauth_version => '1.0' - ); - - $url = $flickr_api_url . sprintf ( - '?nojsoncallback=1&oauth_nonce=%s&format=json&oauth_consumer_key=%s&oauth_timestamp=%s&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oauth_token=%s&oauth_signature=%s&method=flickr.photos.search&content_type=1&media=photos&per_page=500&page=%d&tags=%s&tag_mode=all', - $oauth_nonce, - $flickr_consumer_key, - $oauth_timestamp, - $flickr_access_token, - uri_encode ($oauth_signature), - $page, - uri_encode ($tags) - ); - - $ua = Mojo::UserAgent->new->connect_timeout (5); - $r = $ua->get ($url)->result; - - if ($r->is_success) { - $response = eval { - return $r->json; - }; - - if (defined $response) { - return $response; - } else { - $log->warn ("[WARN] Flickr api returns incorrect json: $r->message"); - return undef; - } - } else { - $log->warn ("[WARN] Flickr api returns incorrect json: $r->message"); - return undef; - } - } else { - $log->warn ("[WARN] Flickr api returns incorrect json: $r->message"); - return undef; - } - } else { - $log->warn ("[WARN] Flickr api HTTP status code not 200: $r->code, $r->message"); - return undef; - } -} - -sub FlickrInit { - my $cache = CHI->new ( - driver => 'BerkeleyDB', - root_dir => $cachedir, - namespace => __PACKAGE__ - ); - - if (defined $flickr_verifier && $flickr_verifier) { - my $flickr_request_token = $cache->get ('flickr_request_token'); - my $flickr_request_token_secret = $cache->get ('flickr_request_token_secret'); - - unless (defined $flickr_request_token || defined $flickr_request_token_secret) { - say 'Looks like there is no request token or request token secret in config db.'; ## no critic (InputOutput::RequireCheckedSyscalls) - say 'Please remove verifier settings from config.json and run this script again.'; ## no critic (InputOutput::RequireCheckedSyscalls) - return 0; - } - - my %accessToken = flickrAccessToken ($flickr_request_token, $flickr_request_token_secret, $flickr_verifier); - - if (defined ($accessToken{oauth_token}) && defined ($accessToken{oauth_token_secret})) { - # TODO: check set - $cache->set ('flickr_access_token', $accessToken{oauth_token}, 'never'); - $cache->set ('flickr_access_token_secret', $accessToken{oauth_token_secret}, 'never'); - - say sprintf ( ## no critic (InputOutput::RequireCheckedSyscalls) - 'Access token (%s) and access token secret (%s) are config db', - $accessToken{oauth_token}, - $accessToken{oauth_token_secret}, - ); - - return 1; - } - } else { - my %req = flickrRequestToken (); - if (defined ($req{oauth_token}) && defined ($req{oauth_token_secret}) && defined ($req{oauth_token})) { - # TODO: check set - $cache->set ('flickr_request_token', $req{oauth_token}, 'never'); - $cache->set ('flickr_request_token_secret', $req{oauth_token_secret}, 'never'); - my $confirm_url = flickrAuthorization ($req{oauth_token}); - - if (defined $confirm_url) { - say "Please open this url in your browser and grant access for this app:\n$confirm_url"; ## no critic (InputOutput::RequireCheckedSyscalls) - say 'Do not forget to put oauth_verifier to config.json file and re-run this script to get access token'; ## no critic (InputOutput::RequireCheckedSyscalls) - say 'Note that you should be logged off from flickr account.'; ## no critic (InputOutput::RequireCheckedSyscalls) - return 1; - } - } - } - - return 0; -} - -sub FlickrTestLogin { - my $text = shift; - my $cache = CHI->new ( - driver => 'BerkeleyDB', - root_dir => $cachedir, - namespace => __PACKAGE__ - ); - - my $flickr_access_token = $cache->get ('flickr_access_token'); - my $flickr_access_token_secret = $cache->get ('flickr_access_token_secret'); - - if (flickrTestLogin ($flickr_access_token, $flickr_access_token_secret)) { - return 1; - } else { - return 0; - } -} - -sub FlickrByTags { - my $text = shift; - - my $cache = CHI->new ( - driver => 'BerkeleyDB', - root_dir => $cachedir, - namespace => __PACKAGE__ - ); - - my $flickr_access_token = $cache->get ('flickr_access_token'); - my $flickr_access_token_secret = $cache->get ('flickr_access_token_secret'); - - # NB: I honestly query random page (among number of pages) of results from api, but always got first page, - # no matter what is shown in response' "page" parameter. Looks like bug in API. Try to little bit mitigate - # this bug via query 500 results per page, then we can select random result in this heap. But anyway, let's - # make this thing future proof and leave randomizer in page select. - my $result = flickrSearchByTags ($flickr_access_token, $flickr_access_token_secret, $text); - - if ($result) { - if (defined ($result->{photos}) && defined ($result->{photos}->{photo})) { - my $item = irand int(@{$result->{photos}->{photo}}); - $item = ${$result->{photos}->{photo}}[$item]; - $item = sprintf 'https://live.staticflickr.com/%s/%s_%s_z.jpg', $item->{server}, $item->{id}, $item->{secret}; - return $item; - } else { - $log->notice ('[NOTICE] Flickr api returns empty search result list'); - return; - } - } else { - return; - } -} - -sub FlickrByText { - my $text = shift; - - my $cache = CHI->new ( - driver => 'BerkeleyDB', - root_dir => $cachedir, - namespace => __PACKAGE__ - ); - - my $flickr_access_token = $cache->get ('flickr_access_token'); - my $flickr_access_token_secret = $cache->get ('flickr_access_token_secret'); - - # NB: I honestly query random page (among number of pages) of results from api, but always got first page, - # no matter what is shown in response' "page" parameter. Looks like bug in API. Try to little bit mitigate - # this bug via query 500 results per page, then we can select random result in this heap. But anyway, let's - # make this thing future proof and leave randomizer in page select. - my $result = flickrSearchByText ($flickr_access_token, $flickr_access_token_secret, $text); - - if ($result) { - if (defined ($result->{photos}) && defined ($result->{photos}->{photo})) { - my $item = irand int(@{$result->{photos}->{photo}}); - $item = ${$result->{photos}->{photo}}[$item]; - $item = sprintf 'https://live.staticflickr.com/%s/%s_%s_z.jpg', $item->{server}, $item->{id}, $item->{secret}; - return $item; - } else { - $log->notice ('[NOTICE] Flickr api returns empty search result list'); - return; - } - } else { - return; - } -} - -1; diff --git a/lib/BotLib/Image/Imgur.pm b/lib/BotLib/Image/Imgur.pm deleted file mode 100644 index 9a23772..0000000 --- a/lib/BotLib/Image/Imgur.pm +++ /dev/null @@ -1,151 +0,0 @@ -package Botlib::Image::Imgur; - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use English qw ( -no_match_vars ); -use Carp qw (cluck); -use CHI; -use CHI::Driver::BerkeleyDB; -use Log::Any qw ($log); -use Math::Random::Secure qw (irand); -use Mojo::UserAgent; - -use BotLib::Conf qw (LoadConf); - -use version; our $VERSION = qw (1.0); -use Exporter qw (import); -our @EXPORT_OK = qw (Imgur); - -my $c = LoadConf (); -my $cachedir = $c->{cachedir}; - -sub Imgur { - my $tag = shift; - - my $refresh_url = 'https://api.imgur.com/oauth2/token'; - my $search_url = 'https://api.imgur.com/3/gallery/search/'; - - my $imgur_client_id = $c->{image}->{imgur}->{client_id} // do { - $log->error ('[ERROR] No client_id specified in config for imgur module'); - return undef; - }; - my $imgur_client_secret = $c->{image}->{imgur}->{client_secret} // do { - $log->error ('[ERROR] No client_secret specified in config for imgur module'); - return undef; - }; - my $imgur_access_token = $c->{image}->{imgur}->{access_token} // do { - $log->error ('[ERROR] No access_token specified in config for imgur module'); - return undef; - }; - my $imgur_refresh_token = $c->{image}->{imgur}->{refresh_token} // do { - $log->warn ('[WARN] No refresh_token specified in config for imgur module'); - }; - - # N.B. Both imgur_access_token and imgur_refresh_token time to time can change, so we need - # some place where we can store new values - my $cache = CHI->new ( - driver => 'BerkeleyDB', - root_dir => $cachedir, - namespace => __PACKAGE__ - ); - - $imgur_access_token = $cache->get ('imgur_access_token'); - - # if there is no access_token in db - put there one from config - unless (defined $imgur_access_token) { - $cache->set ('imgur_access_token', $c->{image}->{imgur}->{access_token}, 'never'); - } - - $imgur_refresh_token = $cache->get ('imgur_refresh_token'); - - # if there is no refresh_token in db - put there one from config - unless (defined $imgur_refresh_token) { - $cache->set ('imgur_refresh_token', $c->{image}->{imgur}->{refresh_token}, 'never'); - } - - # query api - my $ua = Mojo::UserAgent->new->connect_timeout (3); - my $r = $ua->get ($search_url . $tag => {Authorization => "Bearer $imgur_access_token"})->result; - - # looks like we need to refresh token - if (($r->code == 401) || ($r->code == 403)) { - $ua->post ( - $refresh_url => form { - refresh_token => $imgur_refresh_token, - client_id => $imgur_client_id, - client_secret => $imgur_client_secret, - grant_type => 'refresh_token', - } - ); - - unless ($r->is_success) { - $log->error ("[ERROR] Unable to refresh imgur token, please re-authorise app! or imgur experiencing api outage: $r->code $r->message"); - return undef; - } - - my $refresh = eval { return $r->json; }; - - if (defined $refresh) { - $imgur_refresh_token = $refresh->{refresh_token}; - $cache->set ('refresh_token', $refresh->{refresh_token}, 'never'); - $imgur_access_token = $refresh->{access_token}; - $cache->set ('imgur_access_token', $refresh->{access_token}, 'never'); - } else { - $log->warn ("[ERROR] Unable to refresh imgur access_token, unable to decode json: $EVAL_ERROR"); - return undef; - } - - # query api again - $r = $ua->get ($search_url . $tag => {Authorization => "Bearer $imgur_access_token"})->result; - } - - if ($r->is_success) { - my $searchResult = eval { return $r->json; }; - my @urls; - - if (defined $searchResult) { - if ($searchResult->{success}) { - foreach my $item (@{$searchResult->{data}}) { - foreach my $image (@{$item->{images}}) { - if (defined ($image->{animated}) && (0 + $image->{animated}) != 0) { - next; - } - - if (($image->{type} eq 'image/jpeg') || ($image->{type} eq 'image/png')) { - if (defined ($image->{is_ad}) && (0 + $image->{is_ad}) !=0) { - next; - } - - if (defined ($image->{nsfw}) && (0 + $image->{nsfw}) != 0) { - next; - } - - push @urls, $image->{link}; - } - } - } - - if ($#urls > 0) { - return $urls[irand ($#urls + 1)]; - } else { - $log->notice ('[NOTICE] Imgur api returned empty result.'); - return undef; - } - } else { - $log->warn ("[WARN] Unable to get results from imgur api: $r->message"); - return undef; - } - } else { - $log->warn ("[WARN] Unable to decode imgur api json: $EVAL_ERROR"); - return undef; - } - } else { - $log->warn ("[WARN] Unable to get results from imgur api: $r->code, $r->message"); - return undef; - } -} - -1; diff --git a/lib/BotLib/Karma.pm b/lib/BotLib/Karma.pm deleted file mode 100644 index e836327..0000000 --- a/lib/BotLib/Karma.pm +++ /dev/null @@ -1,104 +0,0 @@ -package BotLib::Karma; - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use English qw ( -no_match_vars ); -use Carp qw (cluck); -use CHI; -use CHI::Driver::BerkeleyDB; -use Log::Any qw ($log); -use BotLib::Conf qw (LoadConf); - -use version; our $VERSION = qw (1.0); -use Exporter qw (import); -our @EXPORT_OK = qw (KarmaSet KarmaGet); - -my $c = LoadConf (); -my $cachedir = $c->{cachedir}; -my $max = 5; - -# swallow phrase and return answer -sub KarmaSet (@) { - my $chatid = shift; - my $phrase = shift; - my $action = shift; - - if (($phrase eq '') || ($phrase =~ /^ +$/)) { - $phrase = ' '; - } - - my $cache = CHI->new ( - driver => 'BerkeleyDB', - root_dir => $cachedir, - namespace => __PACKAGE__ . '_' . $chatid - ); - - my $score = $cache->get ($phrase); - - if (defined $score) { - if ($action eq '++') { - $score++; - } else { - $score--; - } - } else { - if ($action eq '++') { - $score = 1; - } else { - $score = -1; - } - } - - if ($cache->set ($phrase, $score, 'never') != $score) { - $log->error ('[ERROR] Cache error: unable to set karma.'); - } - - if ($score < -1 && (($score % (0 - $max)) + 1) == 0) { - if ($phrase eq ' ') { - return sprintf 'Зарегистрировано пробитие дна, карма пустоты составляет %d', $score; - } else { - return sprintf 'Зарегистрировано пробитие дна, карма %s составляет %d', $phrase, $score; - } - } else { - if ($phrase eq ' ') { - return sprintf 'Карма пустоты составляет %d', $score; - } else { - return sprintf 'Карма %s составляет %d', $phrase, $score; - } - } -} - -# just return answer -sub KarmaGet (@) { - my $chatid = shift; - my $phrase = shift; - - if (($phrase eq '') || ($phrase =~ /^ +$/)) { - $phrase = ' '; - } - - my $cache = CHI->new ( - driver => 'BerkeleyDB', - root_dir => $cachedir, - namespace => __PACKAGE__ . '_' . $chatid - ); - - my $score = $cache->get ($phrase); - - unless (defined $score) { - $score = 0; - } - - if ($phrase eq ' ') { - return sprintf 'Карма пустоты составляет %d', $score; - } else { - return sprintf 'Карма %s составляет %d', $phrase, $score; - } -} - -1; - -# vim: ft=perl noet ai ts=4 sw=4 sts=4: diff --git a/lib/BotLib/Lat.pm b/lib/BotLib/Lat.pm deleted file mode 100644 index d4ee970..0000000 --- a/lib/BotLib/Lat.pm +++ /dev/null @@ -1,74 +0,0 @@ -package BotLib::Lat; -# famous latin phases taken from https://ru.wikipedia.org/wiki/Список_крылатых_латинских_выражений - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use English qw ( -no_match_vars ); -use Carp qw (cluck); -use File::Basename qw (dirname); -use File::Path qw (make_path); -use Hailo; -use Log::Any qw ($log); -use BotLib::Conf qw (LoadConf); - -use version; our $VERSION = qw (1.0); -use Exporter qw (import); -our @EXPORT_OK = qw (Train Lat); - -my $c = LoadConf (); -my $brain = $c->{lat}->{brain}; -my $srcfile = $c->{lat}->{src}; - -sub Train () { - my $braindir = dirname $brain; - - unless (-d $braindir) { - make_path ($braindir) or do { - cluck "Unable to create $braindir: $OS_ERROR"; - exit 1; - }; - } - - my $lat = Hailo->new ( - brain => $brain, - # in our case mean amount of words in phase is 3 - order => 2 - ); - - $lat->train ($srcfile); - my ($tokens, $expressions) = ($lat->stats ())[0,1]; - printf "Total tokens: %s\nTotal expressions: %s\n", $tokens, $expressions; - $lat->save (); - return; -} - -# just return answer -sub Lat () { - my $braindir = dirname $brain; - - unless (-d $braindir) { - $log->error ("[ERROR] No lat module data: $braindir is absent! Train lat first."); - return ''; - } - - unless (-f $brain) { - $log->error ("[ERROR] No lat module data: $brain is absent! Train lat first."); - return ''; - } - - my $lat = Hailo->new ( - brain => $brain, - # in our case mean amount of words in phase is 3 - order => 2, - save_on_exit => 0 - ); - - return $lat->reply (); -} - -1; - -# vim: ft=perl noet ai ts=4 sw=4 sts=4: diff --git a/lib/BotLib/Monkeyuser.pm b/lib/BotLib/Monkeyuser.pm deleted file mode 100644 index 5988ec3..0000000 --- a/lib/BotLib/Monkeyuser.pm +++ /dev/null @@ -1,63 +0,0 @@ -package BotLib::Monkeyuser; - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use English qw ( -no_match_vars ); -use Carp qw (cluck); -use HTML::TokeParser; -use Log::Any qw ($log); -use Math::Random::Secure qw (irand); -use Mojo::UserAgent; - -use version; our $VERSION = qw (1.0); -use Exporter qw (import); -our @EXPORT_OK = qw (Monkeyuser); - -sub Monkeyuser { - my $r; - my $ret = 'Нету Monkey User-ов, они все спрятались.'; - my @link; - - for (1..3) { - my $ua = Mojo::UserAgent->new->connect_timeout (3); - $r = $ua->get ('https://www.monkeyuser.com/toc/')->result; - - if ($r->is_success) { - last; - } - - sleep 2; - } - - if ($r->is_success) { - my $p = HTML::TokeParser->new(\$r->body); - my @a; - - do { - $#a = -1; - @a = $p->get_tag('a'); ## no critic (Variables::RequireLocalizedPunctuationVars) - - if (defined $a[0][1]->{class} && $a[0][1]->{class} eq 'lazyload small-image') { - if (defined $a[0][1]->{'data-src'} && ($a[0][1]->{'data-src'} !~ /adlitteram/)) { - push @link, $a[0][1]->{'data-src'}; - } - } - - } while ($#{$a[0]} > 1); - - if ($#link > 0) { - $ret = sprintf '[MonkeyUser](https://www.monkeyuser.com%s)', $link [irand (1 + $#link)]; - } - } else { - $log->warn (sprintf '[WARN] MonkeyUser server return status %s with message: %s', $r->{status}, $r->{reason}); - } - - return $ret; -} - -1; - -# vim: set ft=perl noet ai ts=4 sw=4 sts=4: diff --git a/lib/BotLib/Proverb.pm b/lib/BotLib/Proverb.pm deleted file mode 100644 index 46b90b8..0000000 --- a/lib/BotLib/Proverb.pm +++ /dev/null @@ -1,88 +0,0 @@ -package BotLib::Proverb; -# Any fortune_mod sources are suitable. Text file with "\n%\n" sentence delimeter. - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use English qw ( -no_match_vars ); -use Carp qw (cluck croak); -use File::Path qw (make_path); -use Log::Any qw ($log); -use Math::Random::Secure qw (irand); -use SQLite_File; -use BotLib::Conf qw (LoadConf); -use BotLib::Util qw (trim); - -use version; our $VERSION = qw (1.0); -use Exporter qw (import); -our @EXPORT_OK = qw (Seed Proverb); - -my $c = LoadConf (); -my $dir = $c->{proverb}->{dir}; -my $srcdir = $c->{proverb}->{srcdir}; - -sub Seed () { - unless (-d $dir) { - make_path ($dir) || croak "Unable to create $dir: $OS_ERROR"; - } - - my $backingfile = sprintf '%s/proverb.sqlite', $dir; - - if (-f $backingfile) { - unlink $backingfile || croak "Unable to remove $backingfile: $OS_ERROR"; - } - - tie my @proverb, 'SQLite_File', $backingfile || croak "Unable to tie to $backingfile: $OS_ERROR"; - opendir (my $srcdirhandle, $srcdir) || croak "Unable to open $srcdir: $OS_ERROR"; - - while (my $proverbfile = readdir ($srcdirhandle)) { - my $srcfile = sprintf '%s/%s', $srcdir, $proverbfile; - - unless (-f $srcfile) { - next; - } - - if ($proverbfile =~ m/^\.+$/) { - next; - } - - open (my $fh, '<', $srcfile) || croak "Unable to open $srcfile, $OS_ERROR"; - - while (readline $fh) { - chomp; - my $str = trim ($_); - - if ($str ne '') { - push @proverb, $str; - } - } - - close $fh; ## no critic (InputOutput::RequireCheckedSyscalls, InputOutput::RequireCheckedOpen) - } - - closedir $srcdirhandle; - untie @proverb; - return; -} - -# just return answer -sub Proverb () { - my $backingfile = sprintf '%s/proverb.sqlite', $dir; - - tie my @array, 'SQLite_File', $backingfile || do { - $log->error ("[ERROR] Unable to tie to $backingfile: $OS_ERROR"); - return ''; - }; - - my $phrase = $array[irand ($#array + 1)]; - # decode? - utf8::decode $phrase; - untie @array; - return $phrase; -} - -1; - -# vim: ft=perl noet ai ts=4 sw=4 sts=4: diff --git a/lib/BotLib/Weather.pm b/lib/BotLib/Weather.pm deleted file mode 100644 index af836f8..0000000 --- a/lib/BotLib/Weather.pm +++ /dev/null @@ -1,201 +0,0 @@ -package BotLib::Weather; - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use English qw ( -no_match_vars ); -use Carp qw (carp cluck); -use CHI; -use CHI::Driver::BerkeleyDB; -use Log::Any qw ($log); -use Mojo::Log; -use Mojo::UserAgent::Cached; -use BotLib::Conf qw (LoadConf); -use BotLib::Util qw (trim urlencode); - -use version; our $VERSION = qw (1.0); -use Exporter qw (import); -our @EXPORT_OK = qw (Weather); - -my $c = LoadConf (); -my $cachedir = $c->{cachedir}; - -sub Weather { - my $city = shift; - $city = trim $city; - - return 'Мне нужно ИМЯ города.' if ($city eq ''); - return 'Длинновато для названия города.' if (length ($city) > 80); - - $city = ucfirst $city; - - if ($city eq 'Мск' || $city eq 'Default' || $city eq 'Dc' || $city eq 'Msk' || $city eq 'Dc-universe') { - $city = 'Москва'; - } elsif ($city eq 'Спб' || $city eq 'Spb') { - $city = 'Санкт-Петербург'; - } elsif ($city eq 'Ект' || $city eq 'Ебург' || $city eq 'Ёбург' || $city eq 'Екат' || $city eq 'Ekt' || $city eq 'Eburg' || $city eq 'Ekat') { - $city = 'Екатеринбург'; - } - - my $w = __weather ($city); - my $reply; - - if ($w) { - if ($w->{temperature_min} == $w->{temperature_max}) { - $reply = sprintf ( - "Погода в городе %s, %s:\n%s, ветер %s %s м/c, температура %s°C, ощущается как %s°C, относительная влажность %s%%, давление %s мм.рт.ст", - $w->{name}, - $w->{country}, - ucfirst $w->{description}, - $w->{wind_direction}, - $w->{wind_speed}, - $w->{temperature_min}, - $w->{temperature_feelslike}, - $w->{humidity}, - $w->{pressure} - ); - } elsif ($w->{temperature_min} < 0 && $w->{temperature_max} <= 0) { - $reply = sprintf ( - "Погода в городе %s, %s:\n%s, ветер %s %s м/c, температура от %s до %s°C, ощущается как %s°C, относительная влажность %s%%, давление %s мм.рт.ст", - $w->{name}, - $w->{country}, - ucfirst $w->{description}, - $w->{wind_direction}, - $w->{wind_speed}, - $w->{temperature_max}, - $w->{temperature_min}, - $w->{temperature_feelslike}, - $w->{humidity}, - $w->{pressure} - ); - } else { - $reply = sprintf ( - "Погода в городе %s, %s:\n%s, ветер %s %s м/c, температура от %s до %s°C, ощущается как %s°C, относительная влажность %s%%, давление %s мм.рт.ст", - $w->{name}, - $w->{country}, - ucfirst $w->{description}, - $w->{wind_direction}, - $w->{wind_speed}, - $w->{temperature_min}, - $w->{temperature_max}, - $w->{temperature_feelslike}, - $w->{humidity}, - $w->{pressure} - ); - } - } else { - $reply = "Я не знаю, какая погода в $city"; - } - - return $reply; -} - -sub __weather { - my $city = shift; - $city = urlencode $city; - my $appid = $c->{openweathermap}->{appid}; - my $now = time (); - my $fc; - my $w; - - my $r; - - # try 3 times and giveup - for (1..3) { - my $ua = Mojo::UserAgent::Cached->new; - $ua->local_dir ($cachedir); - $ua->cache_agent( - CHI->new ( - driver => 'BerkeleyDB', - root_dir => $cachedir, - namespace => __PACKAGE__, - expires_in => '3 hours', - expires_on_backend => 1, - ) - ); - # just to make Mojo::UserAgent::Cached happy - $ua->logger (Mojo::Log->new (path => '/dev/null', level => 'error')); - $r = $ua->get (sprintf ('http://api.openweathermap.org/data/2.5/weather?q=%s&lang=ru&APPID=%s', $city, $appid))->result; - - if ($r->is_success) { - last; - } - - sleep 2; - } - - # all 3 times can give error, so check it here - if ($r->is_success) { - $fc = eval { - return $r->json; - }; - - unless ($fc) { - $log->warn ("[WARN] openweathermap returns corrupted json: $EVAL_ERROR"); - return undef; - }; - } else { - $log->warn (sprintf '[WARN] Server return status %s with message: %s', $r->code, $r->message); - return undef; - } - - # TODO: check all of this for existence - $w->{'name'} = $fc->{name}; - $w->{'state'} = $fc->{state}; - $w->{'country'} = $fc->{sys}->{country}; - $w->{'longitude'} = $fc->{coord}->{lon}; - $w->{'latitude'} = $fc->{coord}->{lat}; - $w->{'temperature_min'} = int ($fc->{main}->{temp_min} - 273.15); - $w->{'temperature_max'} = int ($fc->{main}->{temp_max} - 273.15); - $w->{'temperature_feelslike'} = int ($fc->{main}->{feels_like} - 273.15); - $w->{'humidity'} = $fc->{main}->{humidity}; - $w->{'pressure'} = int ($fc->{main}->{pressure} * 0.75006375541921); - $w->{'description'} = $fc->{weather}->[0]->{description}; - $w->{'wind_speed'} = $fc->{wind}->{speed}; - $w->{'wind_direction'} = 'разный'; - my $dir = int ($fc->{wind}->{deg} + 0); - - if ($dir == 0) { - $w->{'wind_direction'} = 'северный'; - } elsif ($dir > 0 && $dir <= 30) { - $w->{'wind_direction'} = 'северо-северо-восточный'; - } elsif ($dir > 30 && $dir <= 60) { - $w->{'wind_direction'} = 'северо-восточный'; - } elsif ($dir > 60 && $dir < 90) { - $w->{'wind_direction'} = 'восточно-северо-восточный'; - } elsif ($dir == 90) { - $w->{'wind_direction'} = 'восточный'; - } elsif ($dir > 90 && $dir <= 120) { - $w->{'wind_direction'} = 'восточно-юго-восточный'; - } elsif ($dir > 120 && $dir <= 150) { - $w->{'wind_direction'} = 'юговосточный'; - } elsif ($dir > 150 && $dir < 180) { - $w->{'wind_direction'} = 'юго-юго-восточный'; - } elsif ($dir == 180) { - $w->{'wind_direction'} = 'южный'; - } elsif ($dir > 180 && $dir <= 210) { - $w->{'wind_direction'} = 'юго-юго-западный'; - } elsif ($dir > 210 && $dir <= 240) { - $w->{'wind_direction'} = 'юго-западный'; - } elsif ($dir > 240 && $dir < 270) { - $w->{'wind_direction'} = 'западно-юго-западный'; - } elsif ($dir == 270) { - $w->{'wind_direction'} = 'западный'; - } elsif ($dir > 270 && $dir <= 300) { - $w->{'wind_direction'} = 'западно-северо-западный'; - } elsif ($dir > 300 && $dir <= 330) { - $w->{'wind_direction'} = 'северо-западный'; - } elsif ($dir > 330 && $dir < 360) { - $w->{'wind_direction'} = 'северо-северо-западный'; - } elsif ($dir == 360) { - $w->{'wind_direction'} = 'северный'; - } - - return $w; -} - -1; - -# vim: set ft=perl noet ai ts=4 sw=4 sts=4: diff --git a/lib/BotLib/Xkcd.pm b/lib/BotLib/Xkcd.pm deleted file mode 100644 index 52dea77..0000000 --- a/lib/BotLib/Xkcd.pm +++ /dev/null @@ -1,47 +0,0 @@ -package BotLib::Xkcd; - -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); -use Mojo::UserAgent; - -use version; our $VERSION = qw (1.0); -use Exporter qw (import); -our @EXPORT_OK = qw (Xkcd); - -sub Xkcd { - my $ua = Mojo::UserAgent->new->connect_timeout (5)->max_redirects (0); - my $location; - my $status = 400; - my $c = 0; - - do { - my $r = $ua->get ('https://xkcd.ru/random/')->result; - - if ( - defined $r->content && - defined $r->content->headers && - defined $r->content->headers->location && - $r->content->headers->location ne '' - ) { - $location = substr $r->content->headers->location, 1, -1; - $location = sprintf 'https://xkcd.ru/i/%s_v1.png', $location; - $r = $ua->head ($location)->result; - } - - $c++; - $status = $r->code; - } while ($c < 3 || $status >= 404); - - if ($status == 200) { - return sprintf '[xkcd.ru](%s)', $location; - } - - return 'Комикс-стрип нарисовать не так-то просто :('; -} - -1; - -# vim: set ft=perl noet ai ts=4 sw=4 sts=4: diff --git a/lib/Cli.pm b/lib/Cli.pm deleted file mode 100644 index c9de387..0000000 --- a/lib/Cli.pm +++ /dev/null @@ -1,45 +0,0 @@ -package Cli; - -# общие модули - синтаксис, кодировки итд -use 5.018; -use strict; -use warnings; -use utf8; -use open qw (:std :utf8); - -# модули для работы приложения -use Mojo::Redis; - -use BotLib::Conf qw (LoadConf); - -use version; our $VERSION = qw (1.0); -use Exporter qw (import); -our @EXPORT_OK = qw (RunCli); - -my $c = LoadConf (); - -sub RunCli { - my $redis = Mojo::Redis->new ( - sprintf 'redis://%s:%s/1', $c->{redis_server}, $c->{redis_port} - ); - - my $pubsub = $redis->pubsub; - my $send_to = 'telegram'; - - $pubsub->json ($send_to)->notify ( - $send_to => { - from => 'redis_msg_gen.pl', - userid => '0', - chatid => '0', - plugin => 'redis_msg_gen.pl_plugin', - message => 'ping?', - mode => 'private', - } - ); - - return; -} - -1; - -# vim: set ft=perl noet ai ts=4 sw=4 sts=4: diff --git a/lib/RedisLib.pm b/lib/RedisLib.pm index 2fbe062..88c413b 100644 --- a/lib/RedisLib.pm +++ b/lib/RedisLib.pm @@ -15,8 +15,7 @@ our @EXPORT_OK = qw (redis_parse_message); sub redis_parse_message { my $self = shift; my $m = shift; - - $log->error (Dumper $self); + my $message; # We cannot send message if we're not connected to telegram # TODO: Queue messages properly. @@ -26,12 +25,13 @@ sub redis_parse_message { } # TODO: add some checks, at least that the bot is not muted in chat - $main::TGM->sendMessage ( - { - chat_id => $m->{chatid}, - text => $m->{message} - } - ); + if ($m->{misc}->{msg_format}) { + $message->{parse_mode} = 'Markdown'; + } + + $message->{chat_id} = $m->{chatid}; + $message->{text} = $m->{message}; + $main::TGM->sendMessage ($message); return; }; diff --git a/lib/TelegramBot.pm b/lib/TelegramBot.pm index 18dd1f4..13619de 100644 --- a/lib/TelegramBot.pm +++ b/lib/TelegramBot.pm @@ -8,8 +8,8 @@ use utf8; use open qw (:std :utf8); use English qw ( -no_match_vars ); use Carp qw (cluck carp); +use Clone qw (clone); use File::Path qw (make_path); -use Hailo; use Log::Any qw ($log); use Math::Random::Secure qw (irand); use Mojo::Base 'Teapot::Bot::Brain'; @@ -17,12 +17,10 @@ use Mojo::Base 'Teapot::Bot::Brain'; use Protocol::Redis::XS; use Mojo::Redis; use Mojo::Redis::Connection; -use BotLib::Admin qw (FortuneToggleList); -use BotLib qw (RandomCommonPhrase Command Highlight BotSleep IsCensored); + +use BotLib::Admin qw (FortuneToggleList ChanMsgEnabled); +use BotLib qw (Command Highlight BotSleep IsCensored); use BotLib::Conf qw (LoadConf); -use BotLib::Fortune qw (Fortune); -use BotLib::Image qw (Oboobs Obutts); -use BotLib::Karma qw (KarmaSet); use BotLib::Util qw (trim fmatch); use RedisLib qw (redis_parse_message); @@ -31,7 +29,6 @@ use Exporter qw (import); our @EXPORT_OK = qw (RunTelegramBot); my $c = LoadConf (); -my $hailo; my $myid; my $myusername; my $myfirst_name; @@ -40,25 +37,42 @@ my $myfullname; has token => $c->{telegrambot}->{token}; +my $redismsg->{from} = 'telegram'; +$redismsg->{plugin} = 'telegram'; +$redismsg->{misc}->{answer} = 1; +$redismsg->{misc}->{csign} = $c->{telegrambot}->{csign}; +$redismsg->{misc}->{msg_format} = 0; +$redismsg->{misc}->{fwd_cnt} = 1; + sub __cron { my $self = shift; - # fortune mod - my @intro = ( - 'Сегодняшний день пройдёт под эгидой фразы:', - 'Крылатая фраза на сегодня:', - 'Сегодняшняя фраза дня:', - ); + my $rmsg = clone ($redismsg); + $rmsg->{mode} = 'public'; + # Press 'F' to pay respect + $rmsg->{message} = sprintf '%sf', $c->{telegrambot}->{csign}; + $rmsg->{misc}->{good_morning} = 1; + $rmsg->{misc}->{msg_format} = 1; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime (time); + { + do { + my $ready = eval { $main::RCONN->is_connected; }; + last if ($ready); + } while (sleep 1); + } + + my $pubsub = $main::REDIS->pubsub; + if ($hour == 8 && ($min >= 0 && $min <= 14)) { foreach my $enabledfortunechat (FortuneToggleList ()) { - my $send_args; - $send_args->{text} = sprintf "%s\n```\n%s\n```\n", $intro[irand ($#intro + 1)], trim (Fortune ()); - $send_args->{chat_id} = $enabledfortunechat; - $send_args->{parse_mode} = 'Markdown'; - $self->sendMessage ($send_args); + $rmsg->{userid} = $enabledfortunechat; + $rmsg->{chatid} = $enabledfortunechat; + + $pubsub->json ($c->{'redis_router_channel'})->notify ( + $c->{'redis_router_channel'} => $rmsg + ); } } @@ -160,23 +174,6 @@ sub __on_msg { return; } -# lazy init chat-bot brains - unless (defined $hailo->{$chatid}) { - my $brainname = sprintf '%s/%s.brain.sqlite', $c->{telegrambot}->{braindir}, $chatid; - - $hailo->{$chatid} = Hailo->new ( -# we'll got file like this: data/telegrambot-brains/-1001332512695.brain.sqlite - brain => $brainname, - order => 3 - ); - - if ($chatid < 0) { - $log->info ("[INFO] Initialized brain for public chat $chatname ($chatid): $brainname"); - } else { - $log->info ("[INFO] Initialized brain for private chat $chatname ($chatid): $brainname"); - } - } - # is this a 1-on-1 ? if ($msg->chat->type eq 'private') { unless (defined $msg->text) { @@ -185,62 +182,27 @@ sub __on_msg { my $text = $msg->text; $log->debug (sprintf ('[DEBUG] Private chat %s say to bot: %s', $vis_a_vi, $text)); + # Ответ по-умолчанию my $reply = 'Давайте ещё пообщаемся, а то я ещё не научилась от вас плохому.'; if (substr ($text, 0, 1) eq $csign) { + # Если текст похож на команду, усылаем его в BotLib.pm $reply = Command ($self, $msg, $text, $userid); } else { - my $just_message_in_chat = 0; + my $rmsg = clone ($redismsg); + $rmsg->{mode} = 'private'; + $rmsg->{message} = $text; + $rmsg->{userid} = $userid; + $rmsg->{chatid} = $userid; + my $pubsub = $main::REDIS->pubsub; + $pubsub->json ($c->{'redis_router_channel'})->notify ( + $c->{'redis_router_channel'} => $rmsg + ); - # is it karma adjustment? - if (substr ($text, -2) eq '++' || substr ($text, -2) eq '--') { - my @arr = split /\n/, $text; - - if ($#arr < 1) { - $reply = KarmaSet ($chatid, trim (substr ($text, 0, -2)), substr ($text, -2)); - } else { - $just_message_in_chat = 1; - } - } else { - $just_message_in_chat = 1; - } - - if ($just_message_in_chat) { - if ($text =~ /^ *кто +все +эти +люди *\?$/ui) { - $reply = 'Какие "люди"? Мы здесь вдвоём, только ты и я.'; - } elsif ($text =~ /^ *кто +я *\?$/ui) { - $reply = 'Где?'; - } elsif ($text =~ /^ *кто +(здесь|тут) *\?$/ui) { - $reply = 'Ты да я, да мы с тобой.'; - } elsif ($text =~ /покажи +(сиськи|сиси|титьки) *$/ui) { - $reply = Oboobs (); - } elsif ($text =~ /show +(titts|tities|boobs) *$/i) { - $reply = Oboobs (); - } elsif ($text =~ /покажи +(попку|попу) *$/ui) { - $reply = Obutts (); - } elsif ($text =~ /show +(ass|butt|butty) *$/i) { - $reply = Obutts (); - } else { - my $str = $hailo->{$msg->chat->id}->learn_reply ($text); - - if (defined ($str) && $str ne '') { - $reply = $str; - $phrase = trim $text; - - while ($phrase =~ /[\.|\,|\?|\!]$/) { - chop $phrase; - } - - $phrase = lc $phrase; - - if (fmatch (lc ($reply), $phrase)) { - $reply = RandomCommonPhrase (); - } - } - } - } + return; } + # Команды раздела Admin ответ таки возвращают if (defined $reply) { $msg->typing (); sleep 1; @@ -251,46 +213,75 @@ sub __on_msg { } elsif (($msg->chat->type eq 'supergroup') or ($msg->chat->type eq 'group')) { my $reply; + # Некоторые виды сообщений можно "зацензурить" ботом, например, голосовые сообщения, картинки итд. + # И вот тут как раз такая проверка и происходит if (IsCensored $msg) { $log->info (sprintf '[INFO] In public chat %s (%s) message from %s was censored', $chatname, $chatid, $vis_a_vi); $self->deleteMessage ({chat_id => $chatid, message_id => $msg->{message_id}}); } - # detect and log messages without text, noop here + # Некоторые рекламные товарищи пыьаются срать своими каналами в чятик это тоже можно зацензурить ботом и это + # пидорство он будет удалять asap + # 136817688 - это специальный id пользователя, который принимает облик канала, на него можно нажать и попасть + # на рекламируемый канал + if ($msg->from->id == 136817688) { + my $sender_chat = eval { $msg->sender_chat->id }; + + if (defined $sender_chat) { + unless (ChanMsgEnabled ($chatid)) { + $self->deleteMessage ({chat_id => $chatid, message_id => $msg->{message_id}}); + } + } + } + + # Если обнаруживаем здесь сообщение без текста, просто ничего не делаем и выходим из процедуры обработки + # сообщения unless (defined $msg->text) { $log->debug (sprintf ('[DEBUG] No text in message from %s', $vis_a_vi)); return; } - # we have text here! so potentially we can chit-chat + # Текст есть, потенциально можно будет поболтать! my $text = $msg->text; $log->debug (sprintf ('[DEBUG] In public chat %s (%s) %s say: %s', $chatname, $chatid, $vis_a_vi, $text)); - # are they quote something, maybe, us? + # Если это ответ на сообщение, то вдруг, на наше? if (defined ($msg->reply_to_message) && defined ($msg->reply_to_message->from) && defined ($msg->reply_to_message->from->username) && ($msg->reply_to_message->from->username eq $myusername)) { $log->debug (sprintf ('[DEBUG] In public chat %s (%s) %s quote us!', $chatname, $chatid, $vis_a_vi)); - # do not answer back if someone quote our new member greet + # Если новый участник чата ответил на наше приветствие, проигнорируем его ответ (и попробуем сойти за + # человека :) if ((substr ($msg->reply_to_message->text, 0, 9) eq 'Дратути, ') && (substr ($msg->reply_to_message->text, -61) eq 'Представьтес, пожалуйста, и расскажите, что вас сюда привело.')) { return; } else { - # remove our name from users reply, just in case + # На всякий случай, попробуем убрать наше имя из фразы. my $pat1 = quotemeta ('@' . $myusername); my $pat2 = quotemeta $myfullname; $phrase = $text; $phrase =~ s/$pat1//g; $phrase =~ s/$pat2//g; - # figure out reply :) - $reply = $hailo->{$msg->chat->id}->learn_reply ($phrase) if (length ($phrase) > 3); + # Попробуем сгенерить ответ + my $rmsg = clone ($redismsg); + $rmsg->{mode} = 'public'; + $rmsg->{message} = $phrase; + $rmsg->{userid} = $userid; + $rmsg->{chatid} = $chatid; + my $pubsub = $main::REDIS->pubsub; + $pubsub->json ($c->{'redis_router_channel'})->notify ( + $c->{'redis_router_channel'} => $rmsg + ); + + return; } - # simple commands + # Если текст похож на команду, усылаем его в BotLib.pm } elsif (substr ($text, 0, 1) eq $csign) { $reply = Command ($self, $msg, $text, $chatid); + # Похоже кто-то написал наше имя в чятике, но ничего не захотел дописывать к нему } elsif ( ($text eq $myusername) or ($text eq '@' . $myusername) or @@ -299,6 +290,7 @@ sub __on_msg { ($text eq $myfullname . ' ') ) { $reply = 'Чего?'; + # А тут кто-то к нам обратился с чем-то по имени } else { my $qname = quotemeta ('@' . $myusername); my $qtname = quotemeta $myfullname; @@ -307,63 +299,61 @@ sub __on_msg { if ((lc ($text) =~ /^${qname}[\,|\:]? (.+)/) or (lc ($text) =~ /^${qtname}[\,|\:]? (.+)/)){ $phrase = $1; - if ($phrase =~ /^ *кто +все +эти +люди *\?$/ui) { - $reply = 'Кто здесь?'; - } elsif ($phrase =~ /^ *кто +я *?$/ui){ - $reply = 'Где?'; - } elsif ($phrase =~ /^ *кто +(здесь|тут) *\?$/ui) { - $reply = 'Здесь все: Никита, Стас, Гена, Турбо и Дюша Метёлкин.'; - } else { - $reply = $hailo->{$msg->chat->id}->learn_reply ($phrase); - } + my $rmsg = clone ($redismsg); + $rmsg->{mode} = 'public'; + $rmsg->{message} = $phrase; + $rmsg->{userid} = $userid; + $rmsg->{chatid} = $chatid; + my $pubsub = $main::REDIS->pubsub; + $pubsub->json ($c->{'redis_router_channel'})->notify ( + $c->{'redis_router_channel'} => $rmsg + ); + + return; # bot mention by name } elsif ((lc ($text) =~ /.+ ${qname}[\,|\!|\?|\.| ]/) or (lc ($text) =~ / $qname$/)) { $phrase = $text; - if ($phrase =~ /^ *кто +все +эти +люди *\?$/ui) { - $reply = 'Кто здесь?'; - } elsif ($phrase =~ /^ *кто +я *?$/ui){ - $reply = 'Где?'; - } elsif ($phrase =~ /^ *кто +(здесь|тут) *\?$/ui) { - $reply = 'Здесь все: Никита, Стас, Гена, Турбо и Дюша Метёлкин.'; - } else { - $reply = $hailo->{$msg->chat->id}->learn_reply ($phrase); - } + my $rmsg = clone ($redismsg); + $rmsg->{mode} = 'public'; + $rmsg->{message} = $phrase; + $rmsg->{userid} = $userid; + $rmsg->{chatid} = $chatid; + my $pubsub = $main::REDIS->pubsub; + $pubsub->json ($c->{'redis_router_channel'})->notify ( + $c->{'redis_router_channel'} => $rmsg + ); + + return; # bot mention by telegram name } elsif ((lc ($text) =~ /.+ ${qtname}[\,|\!|\?|\.| ]/) or (lc ($text) =~ / $qtname$/)) { $phrase = $text; - if ($phrase =~ /^ *кто +все +эти +люди *\?$/ui) { - $reply = 'Кто здесь?'; - } elsif ($phrase =~ /^ *кто +я *?$/ui){ - $reply = 'Где?'; - } elsif ($phrase =~ /^ *кто +(здесь|тут) *\?$/ui) { - $reply = 'Здесь все: Никита, Стас, Гена, Турбо и Дюша Метёлкин.'; - } else { - $reply = $hailo->{$msg->chat->id}->learn_reply ($phrase); - } - # karma adjustment - } elsif (substr ($text, -2) eq '++' || substr ($text, -2) eq '--') { - my @arr = split /\n/, $text; + my $rmsg = clone ($redismsg); + $rmsg->{mode} = 'public'; + $rmsg->{message} = $phrase; + $rmsg->{userid} = $userid; + $rmsg->{chatid} = $chatid; + my $pubsub = $main::REDIS->pubsub; + $pubsub->json ($c->{'redis_router_channel'})->notify ( + $c->{'redis_router_channel'} => $rmsg + ); - if ($#arr < 1) { - $reply = KarmaSet ($chatid, trim (substr ($text, 0, -2)), substr ($text, -2)); - } else { - # just message in chat - $hailo->{$msg->chat->id}->learn ($text); - } - # just message in chat - } else { - if ($text =~ /^ *кто +все +эти +люди *\?$/ui) { - $reply = 'Кто здесь?'; - } elsif ($phrase =~ /^ *кто +я *?$/ui){ - $reply = 'Где?'; - } elsif ($phrase =~ /^ *кто +(здесь|тут) *\?$/ui) { - $reply = 'Здесь все: Никита, Стас, Гена, Турбо и Дюша Метёлкин.'; - } else { - $hailo->{$msg->chat->id}->learn ($text); - } + return; } + + my $rmsg = clone ($redismsg); + $rmsg->{mode} = 'public'; + $rmsg->{message} = $text; + $rmsg->{userid} = $userid; + $rmsg->{chatid} = $chatid; + $rmsg->{misc}->{answer} = 0; + my $pubsub = $main::REDIS->pubsub; + $pubsub->json ($c->{'redis_router_channel'})->notify ( + $c->{'redis_router_channel'} => $rmsg + ); + + return; } if (defined ($reply) && $reply ne '') { @@ -455,6 +445,24 @@ sub __redisListener { return; } +sub RandomCommonPhrase { + my @myphrase = ( + 'Так, блядь...', + '*Закатывает рукава* И ради этого ты меня позвал?', + 'Ну чего ты начинаешь, нормально же общались', + 'Повтори свой вопрос, не поняла', + 'Выйди и зайди нормально', + 'Я подумаю', + 'Даже не знаю, что на это ответить', + 'Ты упал такие вопросы девочке задавать?', + 'Можно и так, но не уверена', + 'А как ты думаешь?', + 'А ви, таки, почему интересуетесь?', + ); + + return $myphrase[irand ($#myphrase + 1)]; +} + # setup our bot sub init { my $self = shift;