From 59f80efe50f26c1f2e288cc85be2b24a9590a930 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Mon, 11 Jan 2021 08:00:40 -0800 Subject: [PATCH] Add a "/hunt edit" command We expect this to be useful for a situation like Mystery Hunt where we create the hunt and its channel in advance, invite all the users to it, and then only later do we learn what the URL of the hunt actually is. --- turbot/interaction.py | 130 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 129 insertions(+), 1 deletion(-) diff --git a/turbot/interaction.py b/turbot/interaction.py index 77a13ee..34aa313 100644 --- a/turbot/interaction.py +++ b/turbot/interaction.py @@ -337,6 +337,131 @@ def edit_puzzle_submission(turb, payload, metadata): return lambda_ok +def edit_hunt_command(turb, body): + """Implementation of the `/hunt edit` command + + As dispatched from the hunt() function. + """ + + channel_id = body['channel_id'][0] + trigger_id = body['trigger_id'][0] + + hunt = hunt_for_channel(turb, channel_id) + + if not hunt: + return bot_reply("Sorry, this does not appear to be a hunt channel.") + + return edit_hunt(turb, hunt, trigger_id) + +def edit_hunt_button(turb, payload): + """Handler for the action of user pressing an edit_hunt button""" + + hunt_id = payload['actions'][0]['action_id'] + response_url = payload['response_url'] + trigger_id = payload['trigger_id'] + + hunt = find_hunt_for_hunt_id(hunt_id) + + if not hunt: + requests.post(response_url, + json = {"text": "Error: Hunt not found!"}, + headers = {"Content-type": "application/json"}) + return bot_reply("Error: Hunt not found.") + + return edit_hunt(turb, hunt, trigger_id) + +actions['button']['edit_hunt'] = edit_hunt_button + +def edit_hunt(turb, hunt, trigger_id): + """Common code for implementing an edit hunt dialog + + This implementation is common whether the edit operation was invoked + by a button (edit_hunt_button) or a command (edit_hunt_command). + """ + + view = { + "type": "modal", + "private_metadata": json.dumps({ + "hunt_id": hunt["hunt_id"], + "SK": hunt["SK"], + "is_hunt": hunt["is_hunt"], + "channel_id": hunt["channel_id"], + "sheet_url": hunt["sheet_url"], + "folder_id": hunt["folder_id"], + }), + "title": { "type": "plain_text", "text": "Edit Hunt" }, + "submit": { "type": "plain_text", "text": "Save" }, + "blocks": [ + input_block("Hunt name", "name", "Name of the hunt", + initial_value=hunt["name"]), + input_block("Hunt URL", "url", "External URL of hunt", + initial_value=hunt.get("url", None), + optional=True), + checkbox_block("Is this hunt active?", "Active", "active", + checked=(hunt.get('active', False))) + ] + } + + result = turb.slack_client.views_open(trigger_id=trigger_id, + view=view) + + if result['ok']: + submission_handlers[result['view']['id']] = edit_hunt_submission + + return lambda_ok + +def edit_hunt_submission(turb, payload, metadata): + """Handler for the user submitting the edit hunt modal + + This is the modal view presented by the edit_hunt function above. + """ + + hunt={} + + # First, read all the various data from the request + meta = json.loads(metadata) + hunt['hunt_id'] = meta['hunt_id'] + hunt['SK'] = meta['SK'] + hunt['is_hunt'] = meta['is_hunt'] + hunt['channel_id'] = meta['channel_id'] + hunt['sheet_url'] = meta['sheet_url'] + hunt['folder_id'] = meta['folder_id'] + + state = payload['view']['state']['values'] + user_id = payload['user']['id'] + + hunt['name'] = state['name']['name']['value'] + url = state['url']['url']['value'] + if url: + hunt['url'] = url + + if state['active']['active']['selected_options']: + hunt['active'] = True + else: + hunt['active'] = False + + # Update the hunt in the database + turb.table.put_item(Item=hunt) + + # Inform the hunt channel about the edit + edit_message = "Hunt edited by <@{}>".format(user_id) + blocks = [ + section_block(text_block(edit_message)), + section_block(text_block("Hunt name: {}".format(hunt['name']))), + ] + + url = hunt.get('url', None) + if url: + blocks.append( + section_block(text_block("Hunt URL: {}".format(hunt['url']))) + ) + + slack_send_message( + turb.slack_client, hunt['channel_id'], + edit_message, blocks=blocks) + + return lambda_ok + def new_hunt_command(turb, body): """Implementation of the '/hunt new' command @@ -1061,10 +1186,13 @@ def hunt(turb, body, args): channel_id = body['channel_id'][0] response_url = body['response_url'][0] - # First, farm off "/hunt new" as a separate command + # First, farm off "/hunt new" and "/hunt edit" a separate commands if args == "new": return new_hunt_command(turb, body) + if args == "edit": + return edit_hunt_command(turb, body) + terms = None if args: # The first word can be a puzzle status and all remaining word -- 2.43.0