]> git.cworth.org Git - turbot/blobdiff - turbot/interaction.py
Fix `/help me` to not give a dispatch_failed error in a private channel
[turbot] / turbot / interaction.py
index 53f45a701a9fb9bae68d41316af01fe29f518a14..546e59a70a25728b1dcdee92d60f6d5730687fda 100644 (file)
@@ -18,6 +18,7 @@ from turbot.puzzle import (
 )
 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
@@ -1336,19 +1337,37 @@ def help_command(turb, body, args):
 
     channel_id = body['channel_id'][0]
     response_url = body['response_url'][0]
+    user_id = body['user_id'][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 = "In response to <@{}> asking `/help me`:\n\n{}\n".format(
+            user_id, have_you_tried())
+
+        # We'll try first to reply directly to the channel (for the benefit
+        # of anyone else in the same channel that might be stuck too.
+        #
+        # But if this doesn't work, (direct message or private channel),
+        # then we can instead reply with an ephemeral message by using
+        # the response_url.
+        try:
+            turb.slack_client.chat_postMessage(
+                channel=channel_id, text=to_try)
+        except SlackApiError:
+            requests.post(response_url,
+                          json = {"text": to_try},
+                          headers = {"Content-type": "application/json"})
+        return lambda_ok
 
     help_string = turbot_help(args)
 
-    # The "/help me" command is special in that it reports in the
-    # current channel, (where all other commands report privately to
-    # the invoking user).
-    if args == "me":
-        turb.slack_client.chat_postMessage(
-            channel=channel_id, text=help_string)
-    else:
-        requests.post(response_url,
-                      json = {"text": help_string},
-                      headers = {"Content-type": "application/json"})
+    requests.post(response_url,
+                  json = {"text": help_string},
+                  headers = {"Content-type": "application/json"})
 
     return lambda_ok