#!/usr/bin/env python3 import datetime import json import requests year = 2022 def lpad(string: str, length: int) -> str: return " " * (length - len(string)) + string session_id = open(".session", "r").readlines()[0].strip() leaderboard = json.loads( requests.get( "https://adventofcode.com/%d/leaderboard/private/view/711147.json" % year, cookies={'session': session_id} ).content ) member_score = {} max_day = 1 now = datetime.datetime.now() for member_id in leaderboard['members']: if leaderboard['members'][member_id]['local_score'] == 0: continue sort_score = leaderboard['members'][member_id]['local_score'] * 100 + leaderboard['members'][member_id]['stars'] for day in leaderboard['members'][member_id]['completion_day_level']: if int(day) > max_day: max_day = int(day) while sort_score in member_score: sort_score += 1 member_score[sort_score] = member_id member_order = [member_score[x] for x in sorted(member_score.keys(), reverse=True)] print(" Day", end="") for member_id in member_order: print( " |", leaderboard['members'][member_id]['name'] + " " * (8 - len(leaderboard['members'][member_id]['name'])), end="" ) print() print(" ", end="") for member_id in member_order: print( " |", lpad( "%2d / %3d" % ( leaderboard['members'][member_id]['stars'], leaderboard['members'][member_id]['local_score'], ), max(8, len(leaderboard['members'][member_id]['name'])) ), end="" ) print() print("-----", end="") for member_id in member_order: print("+-" + "-" * max(8, len(leaderboard['members'][member_id]['name'])) + "-", end="") print() def time_from_delta(delta: datetime.timedelta) -> str: if delta.days > 0: return "%d days" % delta.days time_str = "" if delta.seconds > 3600: time_str += "%02d:" % (delta.seconds // 3600) else: time_str += "00:" if delta.seconds % 3600 > 60: time_str += "%02d:" % (delta.seconds % 3600 // 60) else: time_str += "00:" return time_str + "%02d" % (delta.seconds % 60) for day in range(max_day, 0, -1): print(" %3d" % day, end="") day_start = datetime.datetime(year, 12, day, 6, 0, 0) for member_id in member_order: member_name = leaderboard['members'][member_id]['name'] try: star_1_time = datetime.datetime.fromtimestamp( leaderboard['members'][member_id]['completion_day_level'][str(day)]["1"]['get_star_ts'] ) except KeyError: star_1_time = None print( " |", lpad(time_from_delta(star_1_time - day_start), len(member_name)) if star_1_time is not None else lpad("not yet", max(8, len(member_name))), end="" ) print() print(" ", end="") for member_id in member_order: member_name = leaderboard['members'][member_id]['name'] try: star_2_time = datetime.datetime.fromtimestamp( leaderboard['members'][member_id]['completion_day_level'][str(day)]["2"]['get_star_ts'] ) except KeyError: star_2_time = None print( " |", lpad(time_from_delta(star_2_time - day_start), len(member_name)) if star_2_time is not None else lpad("not yet", max(8, len(member_name))), end="" ) print()