Implement category leaderboards

This commit is contained in:
Zachary Talis 2021-06-25 23:05:19 -04:00
parent f3c0921728
commit d7ee56609a
7 changed files with 134 additions and 16 deletions

View file

@ -27,6 +27,16 @@ h1, h2 {
text-align: center; text-align: center;
} }
.centerHoriz {
margin: auto;
width: 80%;
}
.categoryLink { .categoryLink {
display: block; display: block;
} }
.categoryBoard {
font-weight: normal;
text-align: left;
}

View file

@ -1 +1 @@
tk_run_id,tk_run_runner,tk_run_verifier,tk_run_category_dashname,tk_run_date,tk_run_description,tk_run_link tk_run_id,tk_run_runner,tk_run_verifier,tk_run_duration,tk_run_category_dashname,tk_run_date,tk_run_description,tk_run_link

1 tk_run_id tk_run_runner tk_run_verifier tk_run_duration tk_run_category_dashname tk_run_date tk_run_description tk_run_link

View file

@ -13,10 +13,12 @@ if len(categoriesOld.keys()) == 0:
print("Add a category first (using scripts/add-category.py)") print("Add a category first (using scripts/add-category.py)")
os._exit(1) os._exit(1)
## End of: Check to see if there's at least one category ##
divider = "----------" divider = "----------"
print( print(
f"\nWe'll ask for the runner, verifier, category, run date, category, description of, and recording link of the new run.\n\n{divider}\n" f"\nWe'll ask for the runner, verifier, run duration (time), category, run date, category, description of, and recording link of the new run.\n\n{divider}\n"
) )
tk_run_id = 1 tk_run_id = 1
@ -27,7 +29,23 @@ for id in existingRuns:
tk_run_runner = input("Runner: ") tk_run_runner = input("Runner: ")
tk_run_verifier = input("Verifier: ") tk_run_verifier = input("Verifier: ")
## End of: Check to see if there's at least one category ## ## Handle input of tk_run_duration ##
doneDurationInput = False
while not doneDurationInput:
tk_run_duration = input("Duration (format - HH:MM:SS): ")
values = tk_run_duration.split(":")
if len(values) == 3:
try:
for value in values:
test = float(value)
doneDurationInput = True
except:
print("Invalid input!")
else:
print("Invalid input!")
## End of: Handle input of tk_run_duration ##
## Handle input of tk_run_category_dashname ## ## Handle input of tk_run_category_dashname ##
@ -74,6 +92,7 @@ runDict = {
"tk_run_id": tk_run_id, "tk_run_id": tk_run_id,
"tk_run_runner": tk_run_runner, "tk_run_runner": tk_run_runner,
"tk_run_verifier": tk_run_verifier, "tk_run_verifier": tk_run_verifier,
"tk_run_duration": tk_run_duration,
"tk_run_category_dashname": tk_run_category_dashname, "tk_run_category_dashname": tk_run_category_dashname,
"tk_run_date": tk_run_date, "tk_run_date": tk_run_date,
"tk_run_description": tk_run_description, "tk_run_description": tk_run_description,

View file

@ -4,6 +4,7 @@ from .. import file as util_file
from .. import csv as util_csv from .. import csv as util_csv
import shutil import shutil
import os import os
import datetime
def generate(templatedir, destinationdir, templateFilename): def generate(templatedir, destinationdir, templateFilename):
@ -14,13 +15,16 @@ def generate(templatedir, destinationdir, templateFilename):
templateFilename -- the filename of the category template (always category.html)\n templateFilename -- the filename of the category template (always category.html)\n
""" """
runIdName = "tk_run_id"
categoryIdName = "tk_category_dashname" categoryIdName = "tk_category_dashname"
runs = util_csv.dictReaderMultiRow("../csv/runs.csv", runIdName)
categories = util_csv.dictReaderMultiRow("../csv/categories.csv", categoryIdName) categories = util_csv.dictReaderMultiRow("../csv/categories.csv", categoryIdName)
config = util_csv.dictReaderFirstRow("../csv/config.csv") config = util_csv.dictReaderFirstRow("../csv/config.csv")
for category in categories: for category in categories:
path = f"{destinationdir}/{categories[category][categoryIdName]}" thisCategory = categories[category]
path = f"{destinationdir}/{thisCategory[categoryIdName]}"
currentDir = os.getcwd() currentDir = os.getcwd()
os.makedirs(path, exist_ok=True) os.makedirs(path, exist_ok=True)
@ -30,10 +34,69 @@ def generate(templatedir, destinationdir, templateFilename):
f"{currentDir}/{path}/index.html", f"{currentDir}/{path}/index.html",
) )
for key in categories[category]: for key in thisCategory:
util_file.replaceTextInFile( util_file.replaceTextInFile(f"{path}/index.html", key, thisCategory[key])
f"{path}/index.html", key, categories[category][key]
)
for key in config.keys(): for key in config.keys():
util_file.replaceTextInFile(f"{path}/index.html", key, config[key]) util_file.replaceTextInFile(f"{path}/index.html", key, config[key])
## lk_leaderboard handler ##
runsInCategory = {}
for run in runs:
thisRun = runs[run]
if (
thisRun["tk_run_category_dashname"]
== thisCategory["tk_category_dashname"]
):
runsInCategory[thisRun["tk_run_id"]] = thisRun
runDurationsInCategory = {}
for run in runsInCategory:
thisRun = runsInCategory[run]
runDurationSplit = [
float(value) for value in thisRun["tk_run_duration"].split(":")
]
runDurationsInCategory[thisRun["tk_run_id"]] = datetime.timedelta(
hours=runDurationSplit[0],
minutes=runDurationSplit[1],
seconds=runDurationSplit[2],
)
sortedRunsInCategory = {
runId: runDuration
for runId, runDuration in sorted(
runDurationsInCategory.items(), key=lambda item: item[1]
)
}
trimmedRunsInCategory = {}
runnersRepresentedInCategory = []
for run in sortedRunsInCategory:
thisRun = runs[run]
runner = thisRun["tk_run_runner"]
if runner not in runnersRepresentedInCategory:
trimmedRunsInCategory[thisRun["tk_run_id"]] = thisRun
runnersRepresentedInCategory.append(runner)
place = 1
lk_leaderboard = '<table class="categoryBoard centerHoriz">'
for run in trimmedRunsInCategory:
thisRun = trimmedRunsInCategory[run]
thisRunner = thisRun["tk_run_runner"]
thisRunId = thisRun["tk_run_id"]
thisLink = f"../../runs/{thisRunId}"
thisDuration = str(runDurationsInCategory[thisRunId])
thisDate = thisRun["tk_run_date"]
lk_leaderboard += f'<tr><th>{place}.</th><th>{thisRunner}</th><th><a href="{thisLink}">{thisDuration}</a></th><th>{thisDate}</th></tr>'
place += 1
lk_leaderboard += "</table>"
util_file.replaceTextInFile(
f"{path}/index.html", "lk_leaderboard", lk_leaderboard
)
## End of: lk_leaderboard handler ##

View file

@ -25,7 +25,8 @@ def generate(templatedir, destinationdir, templateFilename):
tk_category_dashname = "tk_category_dashname" tk_category_dashname = "tk_category_dashname"
tk_category_name = "tk_category_name" tk_category_name = "tk_category_name"
# lk_categories handler ## lk_categories handler ##
for category in categories: for category in categories:
util_file.replaceTextInFile( util_file.replaceTextInFile(
@ -33,4 +34,7 @@ def generate(templatedir, destinationdir, templateFilename):
"lk_categories", "lk_categories",
f'<a class="categoryLink" href="categories/{categories[category][tk_category_dashname]}">{categories[category][tk_category_name]}</a>lk_categories', f'<a class="categoryLink" href="categories/{categories[category][tk_category_dashname]}">{categories[category][tk_category_name]}</a>lk_categories',
) )
util_file.replaceTextInFile(f"{destinationdir}/index.html", "lk_categories", "") util_file.replaceTextInFile(f"{destinationdir}/index.html", "lk_categories", "")
## End of: lk_categories handler ##

View file

@ -4,6 +4,7 @@ from .. import file as util_file
from .. import csv as util_csv from .. import csv as util_csv
import shutil import shutil
import os import os
import datetime
def generate(templatedir, destinationdir, templateFilename): def generate(templatedir, destinationdir, templateFilename):
@ -22,7 +23,8 @@ def generate(templatedir, destinationdir, templateFilename):
for run in runs: for run in runs:
path = f"{destinationdir}/{runs[run][runIdName]}" thisRun = runs[run]
path = f"{destinationdir}/{thisRun[runIdName]}"
currentDir = os.getcwd() currentDir = os.getcwd()
os.makedirs(path, exist_ok=True) os.makedirs(path, exist_ok=True)
@ -33,22 +35,25 @@ def generate(templatedir, destinationdir, templateFilename):
) )
tk_run_link = "" tk_run_link = ""
for key in runs[run]: for key in thisRun:
util_file.replaceTextInFile(f"{path}/index.html", key, runs[run][key]) util_file.replaceTextInFile(f"{path}/index.html", key, thisRun[key])
if key == "tk_run_link": if key == "tk_run_link":
tk_run_link = runs[run][key] tk_run_link = thisRun[key]
elif key == "tk_run_duration":
tk_run_duration = thisRun[key]
for key in categories[runs[run]["tk_run_category_dashname"]]: for key in categories[thisRun["tk_run_category_dashname"]]:
util_file.replaceTextInFile( util_file.replaceTextInFile(
f"{path}/index.html", f"{path}/index.html",
key, key,
categories[runs[run]["tk_run_category_dashname"]][key], categories[thisRun["tk_run_category_dashname"]][key],
) )
for key in config.keys(): for key in config.keys():
util_file.replaceTextInFile(f"{path}/index.html", key, config[key]) util_file.replaceTextInFile(f"{path}/index.html", key, config[key])
# lk_run_link handler ## lk_run_link handler ##
if tk_run_link == "": if tk_run_link == "":
util_file.replaceTextInFile( util_file.replaceTextInFile(
f"{path}/index.html", "lk_run_link", "No recording available" f"{path}/index.html", "lk_run_link", "No recording available"
@ -59,3 +64,19 @@ def generate(templatedir, destinationdir, templateFilename):
"lk_run_link", "lk_run_link",
f'<a class="runLink" href="{tk_run_link}">Run recording</a>', f'<a class="runLink" href="{tk_run_link}">Run recording</a>',
) )
## End of: lk_run_link handler ##
## lk_run_duration handler ##
runDurationSplit = [float(value) for value in tk_run_duration.split(":")]
lk_run_duration = datetime.timedelta(
hours=runDurationSplit[0],
minutes=runDurationSplit[1],
seconds=runDurationSplit[2],
)
util_file.replaceTextInFile(
f"{path}/index.html", "lk_run_duration", str(lk_run_duration)
)
## End of: lk_run_duration handler ##

View file

@ -24,6 +24,7 @@
<body> <body>
<h1><a href="../../">tk_game_name</a> - tk_run_runner's run</h1> <h1><a href="../../">tk_game_name</a> - tk_run_runner's run</h1>
<h2><a href="../../categories/tk_category_dashname">tk_category_name<a></h2> <h2><a href="../../categories/tk_category_dashname">tk_category_name<a></h2>
<p>lk_run_duration</p>
<p>Verified by <strong>tk_run_verifier</strong></p> <p>Verified by <strong>tk_run_verifier</strong></p>
<p>Took place on <strong>tk_run_date</strong></p> <p>Took place on <strong>tk_run_date</strong></p>
lk_run_link lk_run_link