import re
def find_puzzle_for_sort_key(turb, hunt_id, sort_key):
- """Given a hunt_id and puzzle_id, return that puzzle
+ """Given a hunt_id and sort_key, return that puzzle
- Returns None if no puzzle with the given hunt_id and puzzle_id
+ Returns None if no puzzle with the given hunt_id and sort_key
exists in the database, otherwise a dictionary with all fields
from the puzzle's row in the database.
+
+ Note: The sort_key is a modified version of the puzzle_id, (used
+ to make metapuzzles appear in the ordering before non-metapuzzles).
+ If you've been handed a sort_key, then looking up a puzzle by
+ sort_key is the right thing to do. But if you instead have just
+ a puzzle_id, see find_puzzle_for_puzzle_id rather than trying
+ to convert the puzzle_id into a sort_key to use this function.
"""
response = turb.table.get_item(
else:
return None
+def find_puzzle_for_puzzle_id(turb, hunt_id, puzzle_id):
+ """Given a hunt_id and puzzle_id, return that puzzle
+
+ Returns None if no puzzle with the given hunt_id and puzzle_id
+ exists in the database, otherwise a dictionary with all fields
+ from the puzzle's row in the database.
+
+ Note: The sort_key is a modified version of the puzzle_id, (used
+ to make metapuzzles appear in the ordering before non-metapuzzles).
+ If you've been handed a sort_key, then looking up a puzzle by
+ sort_key is the right thing to do. But if you instead have just
+ a puzzle_id, see find_puzzle_for_puzzle_id rather than trying
+ to convert the puzzle_id into a sort_key to use this function.
+ """
+
+ response = turb.table.query(
+ IndexName='puzzle_id_index',
+ KeyConditionExpression=(
+ Key('hunt_id').eq(hunt_id) &
+ Key('puzzle_id').eq(puzzle_id)
+ )
+ )
+
+ if response['Count'] == 0:
+ return None
+
+ return response['Items'][0]
+
def find_puzzle_for_url(turb, hunt_id, url):
"""Given a hunt_id and URL, return the puzzle with that URL
def puzzle_channel_name(puzzle):
"""Compute the channel name for a puzzle"""
+ round = ''
+ if 'rounds' in puzzle:
+ round = '-' + puzzle_id_from_name(puzzle['rounds'][0])
+
+ meta = ''
+ if puzzle.get('type', 'plain') == 'meta':
+ meta = '--m'
+
# Note: We don't use puzzle['puzzle_id'] here because we're keeping
# that as a persistent identifier in the database. Instead we
# create a new ID-like identifier from the current name.
- channel_name = "{}-{}".format(
+ channel_name = "{}{}{}-{}".format(
puzzle['hunt_id'],
+ round,
+ meta,
puzzle_id_from_name(puzzle['name'])
)
if 'tags' in old_puzzle:
new_puzzle['tags'] = old_puzzle['tags'].copy()
+ if 'solution' in old_puzzle:
+ new_puzzle['solution'] = old_puzzle['solution'].copy()
+
return new_puzzle