From 7147b785e786d608771435041fd41c225fd8bbdc Mon Sep 17 00:00:00 2001 From: eleksir Date: Thu, 29 Jul 2021 21:26:59 +0300 Subject: [PATCH] =?UTF-8?q?Add=20!anek=20!=D0=B0=D0=BD=D0=B5=D0=BA=20!?= =?UTF-8?q?=D0=B0=D0=BD=D0=B5=D0=BA=D0=B4=D0=BE=D1=82=20commands?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/BotLib.pm | 8 +++++ lib/BotLib/Anek.pm | 79 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 lib/BotLib/Anek.pm diff --git a/lib/BotLib.pm b/lib/BotLib.pm index 36550ae..2dcc476 100644 --- a/lib/BotLib.pm +++ b/lib/BotLib.pm @@ -14,6 +14,7 @@ use BotLib::Conf qw (LoadConf); use BotLib::Admin qw (@ForbiddenMessageTypes GetForbiddenTypes AddForbiddenType DelForbiddenType ListForbidden FortuneToggle FortuneStatus PluginToggle PluginStatus PluginEnabled); +use BotLib::Anek qw (Anek); use BotLib::Archeologist qw (Dig); use BotLib::Buni qw (Buni); use BotLib::Drink qw (Drink); @@ -71,6 +72,12 @@ sub Command { $reply = 'Шта?'; } elsif (substr ($text, 1) eq 'ver' || substr ($text, 1) eq 'version' || substr ($text, 1) eq 'версия') { $reply = 'Версия: Нуль.Чего-то_там.Чего-то_там'; + } 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; @@ -208,6 +215,7 @@ sub Command { $reply = << "MYHELP"; ``` ${csign}help | ${csign}помощь - список команд +${csign}anek | ${csign}анек | ${csign}анекдот - рандомный анекдот с anekdot.ru ${csign}buni - рандомный стрип hapi buni ${csign}bunny | ${csign}rabbit | ${csign}кролик - кролик ${csign}cat | ${csign}кис - кошечка diff --git a/lib/BotLib/Anek.pm b/lib/BotLib/Anek.pm new file mode 100644 index 0000000..5629d1d --- /dev/null +++ b/lib/BotLib/Anek.pm @@ -0,0 +1,79 @@ +package BotLib::Anek; + +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 Encode; +use HTML::TokeParser; +use JSON::XS; +use Log::Any qw ($log); +use Mojo::UserAgent; +use Data::Dumper; + +use version; our $VERSION = qw (1.0); +use Exporter qw (import); +our @EXPORT_OK = qw (Anek); + +sub Anek { + my $r; + my $ret = 'Все рассказчики анекдотов отдыхают'; + 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; + chop $json; + chop $json; + chop $json; + my $anek = eval { ${JSON::XS->new->relaxed->decode ($json)}[0] }; + + if (defined $anek) { + my @anek = split (/
/, $anek); + $ret = join ("\n", @anek); + } 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); + } + + return $ret; +} + +1; + +# vim: set ft=perl noet ai ts=4 sw=4 sts=4: