6 use Mojo::JSON qw(from_json);
7 use Mojo::Util qw(getopt dumper);
11 my $board_id = 652041;
12 my $my_name = 'Yenya';
13 my $day = (localtime(time))[3];
14 my $year = Y::AoC::year;
18 'n|name=s' => \$my_name,
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,
26 or die "Usage: $0 [-n username] [-1|-2|-r] [-b board_id]\n";
28 my $res = Y::AoC::UA::request(
29 "https://adventofcode.com/$year/leaderboard/private/view/$board_id.json",
31 max_age => $force ? 0 : 900,
33 cache_to => "board-$board_id-$year.json",
37 my $json = from_json($res);
42 for my $name (keys %{ $json->{members} }) {
43 my $member = $json->{members}->{$name};
44 my $level = $member->{completion_day_level}->{$day}
49 $time = $level->{2}->{get_star_ts} - $level->{1}->{get_star_ts};
50 } elsif ($mode eq '1') {
52 $time = $level->{1}->{get_star_ts};
53 } elsif ($mode eq '2') {
55 $time = $level->{2}->{get_star_ts};
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};
62 if $id_or_name eq $my_name;
65 my @localtime = localtime($min_time);
69 my $start = timelocal(@localtime);
70 say "Start at ", POSIX::strftime("%Y-%m-%d %H:%M:%S", @localtime);
72 for my $name (sort { $times{$a} <=> $times{$b} } keys %times) {
73 $my_time //= $times{$name};
76 $times{$name} - $my_time,
80 printf("%19.19s %9d %9d %s\n",
81 POSIX::strftime("%Y-%m-%d %H:%M:%S", localtime($times{$name})),
83 $times{$name} - $my_time,