From a891c7ed6f15e82dd9149669cba653ce73f743e8 Mon Sep 17 00:00:00 2001 From: eleksir Date: Wed, 25 May 2022 20:40:14 +0300 Subject: [PATCH] Fix !drink command, kind of --- lib/WebApp/Client.pm | 97 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/lib/WebApp/Client.pm b/lib/WebApp/Client.pm index 905368c..acb68fa 100644 --- a/lib/WebApp/Client.pm +++ b/lib/WebApp/Client.pm @@ -190,6 +190,103 @@ sub Buni { } sub Drink { + my $r; + my $ret = 'Не знаю праздников - вджобываю весь день на шахтах, как проклятая.'; + my ($dayNum, $monthNum) = (localtime ())[3, 4]; + my $url = 'https://prazdniki-segodnya.ru/'; + + # 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 => File::Spec->devnull, level => 'error')); + my $useragent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36'; + + if ($#useragents > 0) { + $useragent = $useragents [ (localtime ()) [3] ]; + } + + $ua->transactor->name ($useragent); + + $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 ('div'); ## no critic (Variables::RequireLocalizedPunctuationVars) + + if ($#{$a[0]} > 2) { + my @shitty_array = $a[0]; + foreach my $item (@shitty_array) { + if (ref $item) { + foreach my $item1 (@{$item}) { + my %h = eval { %{$item1} }; + + if (defined ($h{class}) && $h{class} eq 'list-group-item text-monospace') { + $holyday {'* ' . decode ('UTF-8', $p->get_trimmed_text ('/div'))} = 1; + } + } + } + } + } + } while ($#{$a[0]} > 1); + + if (int (keys (%holyday)) > 0) { + $ret = join "\n", sort (keys ($holyday)); + } + } else { + $log->warn (sprintf '[WARN] prazdniki-segodnya.ru server return status %s with message: %s', $r->code, $r->message); + } + + return $ret; +} + +sub Drink1 { my $r; my $ret = 'Не знаю праздников - вджобываю весь день на шахтах, как проклятая.'; my ($dayNum, $monthNum) = (localtime ())[3, 4];