]> git.cworth.org Git - turbot/blobdiff - turbot/puzzle.py
puzzle_copy: Copy the solution list as well
[turbot] / turbot / puzzle.py
index 08e86218738bbfba6cdeff598ded4acdfb758cec..caf6cede14e0a86ea6e4020ee4abbfd2a8bed745 100644 (file)
@@ -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
 
@@ -248,7 +283,7 @@ def puzzle_channel_name(puzzle):
 
     meta = ''
     if puzzle.get('type', 'plain') == 'meta':
-        meta = '-m'
+        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
@@ -322,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