X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=turbot%2Finteraction.py;h=d7e8da6ff905bd086046ce499e82e47be319192a;hb=b7be5feac00a7e3ff5ceadbf7c5ab1bc5e3259d8;hp=507da76741730f2944962b10306a1de42c2696d6;hpb=7d98a0d74781c4771907952b0a2dcaf06d638664;p=turbot diff --git a/turbot/interaction.py b/turbot/interaction.py index 507da76..d7e8da6 100644 --- a/turbot/interaction.py +++ b/turbot/interaction.py @@ -267,10 +267,11 @@ def edit_puzzle_submission(turb, payload, metadata): puzzle['type'] = 'meta' else: puzzle['type'] = 'plain' - rounds = [option['value'] for option in - state['rounds']['rounds']['selected_options']] - if rounds: - puzzle['rounds'] = rounds + if 'rounds' in state: + 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: @@ -282,9 +283,10 @@ def edit_puzzle_submission(turb, payload, metadata): puzzle['solution'] = [] solution = state['solution']['solution']['value'] if solution: - puzzle['solution'] = [ + # Construct a list from a set to avoid any duplicates + puzzle['solution'] = list({ 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']: @@ -319,7 +321,7 @@ def edit_puzzle_submission(turb, payload, metadata): puzzle['SK']) # If we are changing puzzle type (meta -> plain or plain -> meta) - # the the sort key has to change, so compute the new one and delete + # then the sort key has to change, so compute the new one and delete # the old item from the database. # # XXX: We should really be using a transaction here to combine the @@ -534,7 +536,7 @@ def new_hunt(turb, trigger_id): return lambda_ok -actions['button']['new_hunt'] = new_hunt +actions['button']['new_hunt'] = new_hunt_button def new_hunt_submission(turb, payload, metadata): """Handler for the user submitting the new hunt modal @@ -928,13 +930,20 @@ def new_puzzle(turb, body): return bot_reply("Sorry, this channel doesn't appear to " + "be a hunt or puzzle channel") + # We used puzzle (if available) to select the initial round(s) + puzzle = puzzle_for_channel(turb, channel_id) + initial_rounds = None + if puzzle: + initial_rounds=puzzle.get("rounds", None) + round_options = hunt_rounds(turb, hunt['hunt_id']) if len(round_options): round_options_block = [ multi_select_block("Round(s)", "rounds", "Existing round(s) this puzzle belongs to", - round_options) + round_options, + initial_options=initial_rounds) ] else: round_options_block = [] @@ -1176,7 +1185,10 @@ def solved(turb, body, args): # Set the status and solution fields in the database puzzle['status'] = 'solved' - puzzle['solution'].append(args) + + # Don't append a duplicate solution + if args not in puzzle['solution']: + puzzle['solution'].append(args) if 'state' in puzzle: del puzzle['state'] turb.table.put_item(Item=puzzle) @@ -1184,7 +1196,7 @@ def solved(turb, body, args): # Report the solution to the puzzle's channel slack_send_message( turb.slack_client, channel_id, - "Puzzle mark solved by <@{}>: `{}`".format(user_id, args)) + "Puzzle marked solved by <@{}>: `{}`".format(user_id, args)) # Also report the solution to the hunt channel hunt = find_hunt_for_hunt_id(turb, puzzle['hunt_id']) @@ -1202,6 +1214,50 @@ def solved(turb, body, args): commands["/solved"] = solved +def delete(turb, body, args): + """Implementation of the /delete command + + The argument to this command is the ID of a hunt. + + The command will report an error if the specified hunt is active. + + If the hunt is inactive, this command will archive all channels + from the hunt. + """ + + if not args: + return bot_reply("Error, no hunt provided. Usage: `/delete HUNT_ID`") + + hunt_id = args + hunt = find_hunt_for_hunt_id(turb, hunt_id) + + if not hunt: + return bot_reply("Error, no hunt named \"{}\" exists.".format(hunt_id)) + + if hunt['active']: + return bot_reply( + "Error, refusing to delete active hunt \"{}\".".format(hunt_id) + ) + + if hunt['hunt_id'] != hunt_id: + return bot_reply( + "Error, expected hunt ID of \"{}\" but found \"{}\".".format( + hunt_id, hunt['hunt_id'] + ) + ) + + puzzles = hunt_puzzles_for_hunt_id(turb, hunt_id) + + for puzzle in puzzles: + channel_id = puzzle['channel_id'] + turb.slack_client.conversations_archive(channel=channel_id) + + turb.slack_client.conversations_archive(channel=hunt['channel_id']) + + return lambda_ok + +commands["/delete"] = delete + def hunt(turb, body, args): """Implementation of the /hunt command @@ -1262,10 +1318,13 @@ def hunt(turb, body, args): blocks = hunt_blocks(turb, hunt, puzzle_status=status, search_terms=terms) - requests.post(response_url, - json = { 'blocks': blocks }, - headers = {'Content-type': 'application/json'} - ) + for block in blocks: + if len(block) > 100: + block = block[:100] + requests.post(response_url, + json = { 'blocks': block }, + headers = {'Content-type': 'application/json'} + ) return lambda_ok @@ -1336,10 +1395,13 @@ def round(turb, body, args): limit_to_rounds=puzzle.get('rounds', []) ) - requests.post(response_url, - json = { 'blocks': blocks }, - headers = {'Content-type': 'application/json'} - ) + for block in blocks: + if len(block) > 100: + block = block[:100] + requests.post(response_url, + json = { 'blocks': block }, + headers = {'Content-type': 'application/json'} + ) return lambda_ok