125 lines
3.5 KiB
Python
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()
|