leaderboard time exposal
This commit is contained in:
parent
c70bcd86da
commit
0030862819
124
leaderboard.py
Normal file
124
leaderboard.py
Normal file
@ -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()
|
||||
Loading…
Reference in New Issue
Block a user