X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=turbot%2Fpuzzle.py;h=caf6cede14e0a86ea6e4020ee4abbfd2a8bed745;hb=cab4e4b9d7a0c37e988765c723a135739a3a3112;hp=1dbea5d74906c447b3e6b09df70758f4379389d5;hpb=0878d40471403513b6da016d7412d07a5d903e9b;p=turbot diff --git a/turbot/puzzle.py b/turbot/puzzle.py index 1dbea5d..caf6ced 100644 --- a/turbot/puzzle.py +++ b/turbot/puzzle.py @@ -7,11 +7,18 @@ import turbot.sheets 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( @@ -25,6 +32,34 @@ def find_puzzle_for_sort_key(turb, hunt_id, sort_key): 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 @@ -242,11 +277,21 @@ def puzzle_channel_topic(puzzle): 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']) ) @@ -290,7 +335,7 @@ def puzzle_update_channel_and_sheet(turb, puzzle, old_puzzle=None): old_sheet_name = puzzle_sheet_name(old_puzzle) if sheet_name != old_sheet_name: - turbot.sheets.renameSheet(turb, puzzle['sheet_url'], sheet_name) + turbot.sheets.rename_spreadsheet(turb, puzzle['sheet_url'], sheet_name) # Compute the Slack channel name and set it if it has changed channel_name = puzzle_channel_name(puzzle) @@ -312,4 +357,7 @@ def puzzle_copy(old_puzzle): 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