]> www.fi.muni.cz Git - aoc.git/blobdiff - leaderboard
Infrastructure cleanups
[aoc.git] / leaderboard
diff --git a/leaderboard b/leaderboard
new file mode 100755 (executable)
index 0000000..3f1e7ba
--- /dev/null
@@ -0,0 +1,87 @@
+#!/usr/bin/perl -w
+
+use v5.36;
+use Y::AoC::UA;
+use Y::AoC;
+use Mojo::JSON qw(from_json);
+use Mojo::Util qw(getopt dumper);
+use POSIX;
+use Time::Local;
+
+my $board_id = 652041;
+my $my_name = 'Yenya';
+my $day = (localtime(time))[3];
+my $year = Y::AoC::year;
+my $mode = 'r';
+my $force;
+getopt
+       'n|name=s'      => \$my_name,
+       'd|day=i'       => \$day,
+       'y|year=i'      => \$year,
+       '1|first-task'  => sub { $mode = '1' },
+       '2|second-task' => sub { $mode = '2' },
+       'r|relative'    => sub { $mode = 'r' },
+       'b|board=i'     => \$board_id,
+       'f|force'       => \$force
+or die "Usage: $0 [-n username] [-1|-2|-r] [-b board_id]\n";
+
+my $res = Y::AoC::UA::request(
+       "https://adventofcode.com/$year/leaderboard/private/view/$board_id.json",
+       {
+               max_age  => $force ? 0 : 900,
+               body     => 1,
+               cache_to => "board-$board_id-$year.json",
+       },
+);
+
+my $json = from_json($res);
+
+my %times;
+my $my_time;
+my $min_time;
+for my $name (keys %{ $json->{members} }) {
+        my $member = $json->{members}->{$name};
+       my $level = $member->{completion_day_level}->{$day}
+               or next;
+       my $time;
+       if ($mode eq 'r') {
+               next if !$level->{2};
+               $time = $level->{2}->{get_star_ts} - $level->{1}->{get_star_ts};
+       } elsif ($mode eq '1') {
+               next if !$level->{1};
+               $time = $level->{1}->{get_star_ts};
+       } elsif ($mode eq '2') {
+               next if !$level->{2};
+               $time = $level->{2}->{get_star_ts};
+       }
+       my $id_or_name = $member->{name} // 'Anonymous user #' . $member->{id};
+       $times{ $id_or_name } = $time;
+       $min_time = $level->{1}->{get_star_ts}
+               if !defined $min_time || $min_time > $level->{1}->{get_star_ts};
+       $my_time = $time
+               if $id_or_name eq $my_name;
+}
+
+my @localtime = localtime($min_time);
+$localtime[0] = 0;
+$localtime[1] = 0;
+$localtime[2] = 6;
+my $start = timelocal(@localtime);
+say "Start at ", POSIX::strftime("%Y-%m-%d %H:%M:%S",  @localtime);
+
+for my $name (sort { $times{$a} <=> $times{$b} } keys %times) {
+       $my_time //= $times{$name};
+       if ($mode eq 'r') {
+               printf("%9d %s\n",
+                       $times{$name} - $my_time,
+                       $name,
+               );
+       } else {
+               printf("%19.19s %9d %9d %s\n",
+                       POSIX::strftime("%Y-%m-%d %H:%M:%S", localtime($times{$name})),
+                       $times{$name}-$start,
+                       $times{$name} - $my_time,
+                       $name,
+               );
+       }
+}