]> www.fi.muni.cz Git - aoc2021.git/blob - leaderboard
Day 25: pretty straightforward
[aoc2021.git] / leaderboard
1 #!/usr/bin/perl -w
2
3 use v5.16;
4 use Mojo::UserAgent -signatures;
5 use Mojo::JSON qw(from_json);
6 use Mojo::File qw(curfile);
7 use Mojo::Util qw(getopt dumper);
8 use POSIX;
9
10 my $board_id = 652041;
11 my $my_name = 'Yenya';
12 my $day = (localtime(time))[3];
13 my $mode = 'r';
14 my $force;
15 getopt
16         'n|name=s'      => \$my_name,
17         'd|day=i'       => \$day,
18         '1|first-task'  => sub { $mode = '1' },
19         '2|second-task' => sub { $mode = '2' },
20         'r|relative'    => sub { $mode = 'r' },
21         'b|board=i'     => \$board_id,
22         'f|force'       => \$force
23 or die "Usage: $0 [-n username] [-1|-2|-r] [-b board_id]\n";
24 my $cache_filename = "cache-$board_id.json";
25 my $cached = curfile->sibling($cache_filename);
26
27 if ($force || !$cached->stat || time - $cached->stat->mtime > 900) {
28         warn "Downloading $cache_filename\n";
29         chomp(my $cookie = curfile->sibling('cookie')->slurp);
30         my $res = Mojo::UserAgent->new->get(
31                 "https://adventofcode.com/2021/leaderboard/private/view/$board_id.json",
32                 { Cookie => $cookie }
33         )->result;
34
35         $cached->spurt($res->body);
36 }
37
38 my $json = from_json $cached->slurp;
39
40
41 my %times;
42 my $my_time;
43 for my $name (keys %{ $json->{members} }) {
44         my $member = $json->{members}->{$name};
45         my $level = $member->{completion_day_level}->{$day}
46                 or next;
47         my $time;
48         if ($mode eq 'r') {
49                 next if !$level->{2};
50                 $time = $level->{2}->{get_star_ts} - $level->{1}->{get_star_ts};
51         } elsif ($mode eq '1') {
52                 next if !$level->{1};
53                 $time = $level->{1}->{get_star_ts};
54         } elsif ($mode eq '2') {
55                 next if !$level->{2};
56                 $time = $level->{2}->{get_star_ts};
57         }
58         my $id_or_name = $member->{name} // 'Anonymous user #' . $member->{id};
59         $times{ $id_or_name } = $time;
60         $my_time = $time
61                 if $id_or_name eq $my_name;
62 }
63
64 for my $name (sort { $times{$a} <=> $times{$b} } keys %times) {
65         $my_time //= $times{$name};
66         printf("%6d %6d %s\n", $times{$name}, $times{$name} - $my_time, $name);
67 }