]> www.fi.muni.cz Git - aoc.git/blob - leaderboard
Day 25: examining the input
[aoc.git] / leaderboard
1 #!/usr/bin/perl -w
2
3 use v5.36;
4 use Y::AoC::UA;
5 use Y::AoC;
6 use Mojo::JSON qw(from_json);
7 use Mojo::Util qw(getopt dumper);
8 use POSIX;
9 use Time::Local;
10
11 my $board_id = 652041;
12 my $my_name = 'Yenya';
13 my $day = (localtime(time))[3];
14 my $year = Y::AoC::year;
15 my $mode = 'r';
16 my $force;
17 getopt
18         'n|name=s'      => \$my_name,
19         'd|day=i'       => \$day,
20         'y|year=i'      => \$year,
21         '1|first-task'  => sub { $mode = '1' },
22         '2|second-task' => sub { $mode = '2' },
23         'r|relative'    => sub { $mode = 'r' },
24         'b|board=i'     => \$board_id,
25         'f|force'       => \$force
26 or die "Usage: $0 [-n username] [-1|-2|-r] [-b board_id]\n";
27
28 my $res = Y::AoC::UA::request(
29         "https://adventofcode.com/$year/leaderboard/private/view/$board_id.json",
30         {
31                 max_age  => $force ? 0 : 900,
32                 body     => 1,
33                 cache_to => "board-$board_id-$year.json",
34         },
35 );
36
37 my $json = from_json($res);
38
39 my %times;
40 my $my_time;
41 my $min_time;
42 for my $name (keys %{ $json->{members} }) {
43         my $member = $json->{members}->{$name};
44         my $level = $member->{completion_day_level}->{$day}
45                 or next;
46         my $time;
47         if ($mode eq 'r') {
48                 next if !$level->{2};
49                 $time = $level->{2}->{get_star_ts} - $level->{1}->{get_star_ts};
50         } elsif ($mode eq '1') {
51                 next if !$level->{1};
52                 $time = $level->{1}->{get_star_ts};
53         } elsif ($mode eq '2') {
54                 next if !$level->{2};
55                 $time = $level->{2}->{get_star_ts};
56         }
57         my $id_or_name = $member->{name} // 'Anonymous user #' . $member->{id};
58         $times{ $id_or_name } = $time;
59         $min_time = $level->{1}->{get_star_ts}
60                 if !defined $min_time || $min_time > $level->{1}->{get_star_ts};
61         $my_time = $time
62                 if $id_or_name eq $my_name;
63 }
64
65 my @localtime = localtime($min_time);
66 $localtime[0] = 0;
67 $localtime[1] = 0;
68 $localtime[2] = 6;
69 my $start = timelocal(@localtime);
70 say "Start at ", POSIX::strftime("%Y-%m-%d %H:%M:%S",  @localtime);
71
72 for my $name (sort { $times{$a} <=> $times{$b} } keys %times) {
73         $my_time //= $times{$name};
74         if ($mode eq 'r') {
75                 printf("%9d %s\n",
76                         $times{$name} - $my_time,
77                         $name,
78                 );
79         } else {
80                 printf("%19.19s %9d %9d %s\n",
81                         POSIX::strftime("%Y-%m-%d %H:%M:%S", localtime($times{$name})),
82                         $times{$name}-$start,
83                         $times{$name} - $my_time,
84                         $name,
85                 );
86         }
87 }