aoc2021/leaderboard.py
2021-12-03 08:07:06 +01:00

125 lines
3.5 KiB
Python

#!/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()