@author: Avram Gottschlich
"""
"""
-I copied several functions from your code;
+I copied several functions from your code;
if it's easier to refer to them rather than copying them that's absolutely fine
This rewrites the html each time it is called
Requires sorttable.js, which should be included
"""
-from turbot.channel import channel_url
+import boto3
from boto3.dynamodb.conditions import Key
website = "https://halibut.cworth.org/"
#change this if we're using AWS or some other subdomain instead
-def find_hunt_for_hunt_id(turb, hunt_id):
+def channel_url(channel_id):
+ """Given a channel ID, return the URL for that channel."""
+
+ return "https://halibutthatbass.slack.com/archives/{}".format(channel_id)
+
+def find_hunt_for_hunt_id(table, hunt_id):
"""Given a hunt ID find the database item for that hunt
Returns None if hunt ID is not found, otherwise a
dictionary with all fields from the hunt's row in the table,
(channel_id, active, hunt_id, name, url, sheet_url, etc.).
"""
- response = turb.table.get_item(
+ response = table.get_item(
Key={
'hunt_id': hunt_id,
'SK': 'hunt-{}'.format(hunt_id)
else:
return None
-def hunt_puzzles_for_hunt_id(turb, hunt_id):
+def hunt_puzzles_for_hunt_id(table, hunt_id):
"""Return all puzzles that belong to the given hunt_id"""
- response = turb.table.query(
+ response = table.query(
KeyConditionExpression=(
Key('hunt_id').eq(hunt_id) &
Key('SK').begins_with('puzzle-')
#internal links, doesn't open new tab
return '<a href="{}">{}</a>'.format(lin, text)
-def hunt_info(turb, hunt):
+def hunt_info(table, hunt_id):
"""
- Retrieves list of rounds, puzzles for the given hunt
+ Retrieves list of rounds, puzzles for the given hunt
"""
+
+ hunt = find_hunt_for_hunt_id(table, hunt_id)
+
name = hunt["name"]
- hunt_id = hunt["hunt_id"]
channel_id = hunt["channel_id"]
-
- puzzles = hunt_puzzles_for_hunt_id(turb, hunt_id)
-
+
+ puzzles = hunt_puzzles_for_hunt_id(table, hunt_id)
+
rounds = set()
for puzzle in puzzles:
if "rounds" not in puzzle:
rounds.add(rnd)
rounds = list(rounds)
rounds.sort()
-
+
return puzzles, rounds
def round_stat(rnd, puzzles):
meta_solved = 0
for puzzle in puzzles:
if "rounds" not in puzzle:
- continue
+ continue
if rnd in puzzle["rounds"]:
if puzzle['type'] == 'meta':
metas.append(puzzle)
unsolved_puzzles = sorted(unsolved_puzzles, key = lambda i: i['name'])
rnd_puzzles = metas + unsolved_puzzles + solved_puzzles
return puzzle_count, solved_count, rnd_puzzles, meta_solved, len(metas)
-
-
-
+
+
+
def overview(puzzles, rounds):
#big board, main page. saves as index.html
start = ['<!DOCTYPE html>\n',
' <p>Puzzles: {}/{}</p>\n'.format(solved_count, puzzle_count),
' <p>Metas: {}/{}</p>\n'.format(meta_solved, metas),
' </div>\n']
-
+
expanding += [
' <div id="b{}" class="containerTab {}" style="display:none;">\n'.format(i, status),
' <span onclick="this.parentElement.style.display=\'none\'" class="closebtn">x</span>\n',
else:
meta = ''
slack_url = channel_url(puzzle['channel_id'])
-
+
if puzzle['status'] == 'solved':
puzzle_list += [ ' <tr>\n',
' <td>{}</td>\n'.format(elink(slack_url, puzzle['name']+meta)),
slack_url = channel_url(puzzle['channel_id'])
round_url = link(website + "_".join(rnd.split()) + "_round.html", puzzle['rounds'][0])
#assuming one round per puzzle for now
-
+
solved_code += [' <tr>\n',
' <td>{}</td>\n'.format(elink(slack_url, puzzle['name']+meta)),
' <td>{}</td>\n'.format(elink(puzzle['url'], 'Puzzle')),
slack_url = channel_url(puzzle['channel_id'])
round_url = link(website + "_".join(rnd.split()) + "_round.html", puzzle['rounds'][0])
#assuming one round per puzzle for now
-
+
unsolved_code += [' <tr>\n',
' <td>{}</td>\n'.format(elink(slack_url, puzzle['name']+meta)),
' <td>{}</td>\n'.format(elink(puzzle['url'], 'Puzzle')),
f.close()
return None
+# Initialize AWS resources to talk to database
+db = boto3.resource('dynamodb')
+table = db.Table("turbot")
+puzzles, rounds = hunt_info(table, "mh2021")
-
-puzzles, rounds = hunt_info(turb, hunt)
-#I am not sure where these come from
overview(puzzles, rounds)
for rnd in rounds:
round_overview(rnd, puzzles)