From 00308628195f3601328f539b56cc299981c17daf Mon Sep 17 00:00:00 2001 From: Stefan Harmuth Date: Fri, 3 Dec 2021 08:07:06 +0100 Subject: [PATCH] leaderboard time exposal --- leaderboard.py | 124 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 leaderboard.py diff --git a/leaderboard.py b/leaderboard.py new file mode 100644 index 0000000..c235868 --- /dev/null +++ b/leaderboard.py @@ -0,0 +1,124 @@ +#!/usr/bin/env python3 +import datetime +import json +import requests + +year = 2021 + + +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()