diff --git a/lib/BotLib/Anek.pm b/lib/BotLib/Anek.pm
index 4143141..8916b4c 100644
--- a/lib/BotLib/Anek.pm
+++ b/lib/BotLib/Anek.pm
@@ -19,53 +19,66 @@ our @EXPORT_OK = qw (Anek);
sub Anek {
my $r;
my $ret = 'Все рассказчики анекдотов отдыхают';
+ my $got_anek = 0;
+
+ # time to time anekdot.ru can give valid but unparsable response
+ # i've no clue where's err, just fetch another response and try again :)
for (1..3) {
- my $ua = HTTP::Tiny->new (timeout => 3);
- $r = $ua->get ('https://www.anekdot.ru/rss/randomu.html');
+ for (1..3) {
+ my $ua = HTTP::Tiny->new (timeout => 3);
+ $r = $ua->get ('https://www.anekdot.ru/rss/randomu.html');
+
+ if ($r->{success}) {
+ last;
+ }
+
+ sleep 2;
+ }
if ($r->{success}) {
- last;
- }
+ my $json;
+ my $response_text = decode ('UTF-8', $r->{content});
+ my @text = split /\n/, $response_text;
- sleep 2;
- }
+ while (my $str = pop @text) {
+ if ($str =~ /^var anekdot_texts \= JSON/) {
+ $str = (split /JSON\.parse\(\'/, $str, 2)[1];
- if ($r->{success}) {
- my $json;
- my $response_text = decode ('UTF-8', $r->{content});
- 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 $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 $json && length ($json) > 10) {
+ $json =~ s/\\"/"/g;
+ $json =~ s/\\\\"/\\"/g;
+ $json = substr $json, 0, -3;
- if (defined $anek) {
- my @anek = split (/
/, $anek);
- $ret = join ("\n", @anek);
+ 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 incorrect json, full response text message: %s', $response_text);
+ $log->warn (sprintf '[WARN] anekdot.ru server returns unexpected response text: %s', $response_text);
}
+
} else {
- $log->warn (sprintf '[WARN] anekdot.ru server returns unexpected response text: %s', $response_text);
+ $log->warn (sprintf '[WARN] anekdot.ru server return status %s with message: %s', $r->code, $r->message);
}
- } else {
- $log->warn (sprintf '[WARN] anekdot.ru server return status %s with message: %s', $r->code, $r->message);
+ if ($got_anek) {
+ last;
+ }
}
return $ret;