X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=turbot%2Finteraction.py;h=417066aba650324fd3ff0199311552f94bb16214;hb=4ed02dad3ef9127fd1146753e93334b6c33389de;hp=d14c3d4ad07195aeefc916b9e0649ca664b9e98b;hpb=ac83e42a735ae1098ebcec783b5f816369eb3917;p=turbot diff --git a/turbot/interaction.py b/turbot/interaction.py index d14c3d4..417066a 100644 --- a/turbot/interaction.py +++ b/turbot/interaction.py @@ -138,7 +138,7 @@ def edit_puzzle(turb, payload): "Puzzle status", "Solved", "solved", checked=(puzzle.get('status', 'unsolved') == 'solved')), input_block("Solution", "solution", - "Solutions (comma-separated if multiple", + "Solution(s) (comma-separated if multiple)", initial_value=solution_str, optional=True), ] @@ -161,6 +161,84 @@ def edit_puzzle_submission(turb, payload, metadata): function above. """ + puzzle={} + + # First, read all the various data from the request + meta = json.loads(metadata) + puzzle['hunt_id'] = meta['hunt_id'] + puzzle['SK'] = meta['SK'] + puzzle['puzzle_id'] = meta['puzzle_id'] + puzzle['channel_id'] = meta['channel_id'] + puzzle['channel_url'] = meta['channel_url'] + puzzle['sheet_url'] = meta['sheet_url'] + + state = payload['view']['state']['values'] + + puzzle['name'] = state['name']['name']['value'] + url = state['url']['url']['value'] + if url: + puzzle['url'] = url + rounds = [option['value'] for option in + state['rounds']['rounds']['selected_options']] + if rounds: + puzzle['rounds'] = rounds + new_rounds = state['new_rounds']['new_rounds']['value'] + puzzle_state = state['state']['state']['value'] + if puzzle_state: + puzzle['state'] = puzzle_state + if state['solved']['solved']['selected_options']: + puzzle['status'] = 'solved' + else: + puzzle['status'] = 'unsolved' + puzzle['solution'] = [] + solution = state['solution']['solution']['value'] + if solution: + puzzle['solution'] = [ + sol.strip() for sol in solution.split(',') + ] + + # Verify that there's a solution if the puzzle is mark solved + if puzzle['status'] == 'solved' and not puzzle['solution']: + return submission_error("solution", + "A solved puzzle requires a solution.") + + if puzzle['status'] == 'unsolved' and puzzle['solution']: + return submission_error("solution", + "An unsolved puzzle should have no solution.") + + # Add any new rounds to the database + if new_rounds: + if 'rounds' not in puzzle: + puzzle['rounds'] = [] + for round in new_rounds.split(','): + # Drop any leading/trailing spaces from the round name + round = round.strip() + # Ignore any empty string + if not len(round): + continue + puzzle['rounds'].append(round) + turb.table.put_item( + Item={ + 'hunt_id': puzzle['hunt_id'], + 'SK': 'round-' + round + } + ) + + # Update the puzzle in the database + turb.table.put_item(Item=puzzle) + + # We need to set the channel topic if any of puzzle name, url, + # state, status, or solution, has changed. Let's just do that + # unconditionally here. + + # XXX: What we really want here is a single function that sets the + # channel name, the channel topic, and the sheet name. That single + # function should be called anywhere there is code changing any of + # these things. This function could then also accept an optional + # "old_puzzle" argument and avoid changing any of those things + # that are unnecessary. + set_channel_topic(turb, puzzle) + return lambda_ok def new_hunt(turb, payload):