]> git.cworth.org Git - turbot/blobdiff - turbot/interaction.py
Implement a new "/help me" command that suggests something to try
[turbot] / turbot / interaction.py
index 05bbbb88d3c09f5eade01318604df40d330484e1..f784a0266203862711d4c20f16656195f712a09f 100644 (file)
@@ -17,6 +17,8 @@ from turbot.puzzle import (
     puzzle_copy
 )
 from turbot.round import round_quoted_puzzles_titles_answers
+from turbot.help import turbot_help
+from turbot.have_you_tried import have_you_tried
 import turbot.rot
 import turbot.sheets
 import turbot.slack
@@ -86,16 +88,42 @@ def edit(turb, body, args):
 
     """Implementation of the `/edit` command
 
-    This can be used as `/edit hunt` or `/edit puzzle`, (and if issued as
-    just `/edit` will default to editing the current puzzle.
+    This can be used as `/edit` (with no arguments) in either a hunt
+    or a puzzle channel to edit that hunt or puzzle. It can also be
+    called explicitly as `/edit hunt` to edit a hunt even from a
+    puzzle channel.
 
-    These are simply shortcuts for `/hunt edit` and `/puzzle edit`.
+    In any case, the operation is identical to `/hunt edit` or
+    `/puzzle edit`.
     """
 
+    # If we have an explicit argument, do what it says to do
     if args == "hunt":
         return edit_hunt_command(turb, body)
 
-    return edit_puzzle_command(turb, body)
+    if args == "puzzle":
+        return edit_puzzle_command(turb, body)
+
+    # Any other argument string is an error
+    if args:
+        return bot_reply("Error: Unexpected argument: {}\n".format(args) +
+                         "Usage: `/edit puzzle`, `/edit hunt`, or " +
+                         "`/edit` (to choose based on channel)"
+                         )
+
+    # No explicit argument, so select what to edit based on the current channel
+    channel_id = body['channel_id'][0]
+    trigger_id = body['trigger_id'][0]
+
+    puzzle = puzzle_for_channel(turb, channel_id)
+    if puzzle:
+        return edit_puzzle(turb, puzzle, trigger_id)
+
+    hunt = hunt_for_channel(turb, channel_id)
+    if hunt:
+        return edit_hunt(turb, hunt, trigger_id)
+
+    return bot_reply("Sorry, `/edit` only works in a hunt or puzzle channel.")
 
 commands["/edit"] = edit
 
@@ -120,7 +148,6 @@ def edit_puzzle_button(turb, payload):
     """Handler for the action of user pressing an edit_puzzle button"""
 
     action_id = payload['actions'][0]['action_id']
-    response_url = payload['response_url']
     trigger_id = payload['trigger_id']
 
     (hunt_id, sort_key) = action_id.split('-', 1)
@@ -128,9 +155,6 @@ def edit_puzzle_button(turb, payload):
     puzzle = find_puzzle_for_sort_key(turb, hunt_id, sort_key)
 
     if not puzzle:
-        requests.post(response_url,
-                      json = {"text": "Error: Puzzle not found!"},
-                      headers = {"Content-type": "application/json"})
         return bot_reply("Error: Puzzle not found.")
 
     return edit_puzzle(turb, puzzle, trigger_id)
@@ -361,15 +385,11 @@ 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)
+    hunt = find_hunt_for_hunt_id(turb, 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)
@@ -1308,3 +1328,42 @@ def round(turb, body, args):
     return lambda_ok
 
 commands["/round"] = round
+
+def help_command(turb, body, args):
+    """Implementation of the /help command
+
+    Displays help on how to use Turbot.
+    """
+
+    channel_name = body['channel_name'][0]
+    channel_id = body['channel_id'][0]
+    response_url = body['response_url'][0]
+
+    # Process "/help me" first. It calls out to have_you_tried rather
+    # than going through our help system.
+    #
+    # Also, it reports in the current channel, (where all other help
+    # output is reported privately to the invoking user).
+    if args == "me":
+        to_try = have_you_tried()
+
+        # If this is a direct message then there's not a usable channel_id
+        # and we have to use the response_url instead
+        if channel_name == "directmessage":
+            requests.post(response_url,
+                          json = {"text": to_try},
+                          headers = {"Content-type": "application/json"})
+        else:
+            turb.slack_client.chat_postMessage(
+                channel=channel_id, text=to_try)
+        return lambda_ok
+
+    help_string = turbot_help(args)
+
+    requests.post(response_url,
+                  json = {"text": help_string},
+                  headers = {"Content-type": "application/json"})
+
+    return lambda_ok
+
+commands["/help"] = help_command