]> www.fi.muni.cz Git - aoc.git/blob - lib/Y/AoC/UA.pm
Input downloader: use spew() instead of spurt()
[aoc.git] / lib / Y / AoC / UA.pm
1 package Y::AoC::UA;
2
3 use v5.36;
4
5 use Mojo::Base -signatures;
6 use Mojo::UserAgent;
7 use Mojo::DOM;
8 use Y::AoC qw(white red);
9
10 our $user_agent = 'kas@yenya.net https://www.fi.muni.cz/~kas/git/aoc.git';
11 our $cache_dir = '/home/kas/aoc/cache';
12 our $cookie;
13
14 sub request($url, $args) {
15         chomp($cookie //= Mojo::File->new("$cache_dir/cookie")->slurp);
16
17         my ($cache, $cachefile);
18         if ($args->{cache_to}) {
19                 $cachefile = $cache_dir . '/' . $args->{cache_to};
20                 $cache = Mojo::File->new("$cachefile");
21
22                 if (defined $args->{max_age}) {
23                         $cache->remove
24                                 if $cache->stat
25                                 && time - $cache->stat->mtime
26                                         > $args->{max_age};
27                 }
28
29                 if ($cache->stat) {
30                         say "\n", white('cached'),
31                                 " response from $cachefile";
32                         return $args->{body}
33                                 ? $cache->slurp
34                                 : Mojo::DOM->new($cache->slurp);
35                 }
36         }
37
38         my $res;
39         my %hdrs = (
40                 Cookie       => $cookie,
41                 'User-Agent' => $user_agent,
42         );
43         my $ua = Mojo::UserAgent->new;
44         if ($args->{form}) {
45                 $res = $ua->post($url => \%hdrs => form => $args->{form})
46                         ->result;
47         } else {
48                 $res = $ua->get($url => \%hdrs)->result;
49         }
50
51         if (!$res->is_success) {
52                 say $res->message;
53                 say "body:\n",  $res->body;
54                 die red("http request failed");
55         }
56
57         if ($cache) {
58                 $cache->spew($res->body);
59                 # say "Stored response to $cachefile";
60         }
61         return $args->{body} ? $res->body : $res->dom;
62 }
63
64 sub cache_del($file) {
65         my $f = Mojo::File->new("$cache_dir/$file");
66         return if !$f->stat;
67         $f->move_to("$cache_dir/old-$file");
68 }
69
70 sub is_cached($file) { Mojo::File->new("$cache_dir/$file")->stat; }
71
72 1;
73 __END__
74 package Y::AoC::UA;
75
76 sub new($class, $year, $day) {
77         eval 'require
78 }
79
80 sub get($ua) {
81 1;