-
Notifications
You must be signed in to change notification settings - Fork 276
Description
I want to deploy a Slack bolt using Cloud Function, but since I can't use lazy listener, I use Thread for parallel processing. When I deploy to Cloud Function with the following code, I get duplicate messages the first time. After that, it only needs to be done once. However, after some time passes, duplicate messages are sent again.
Therefore, I would like to implement a process that only returns a response if there is an X-Slack-Retry-Num in the header, but I do not know how to get the header.
I implemented the following code in Python this way,
if "X-Slack-Retry-Num" in event["headers"]:
return {'statusCode': 200, 'body': 'this request is retry'}Ended with an error result.
if "X-Slack-Retry-Num" in event["headers"]:
KeyError: 'headers'
Please let me know if there is a better solution.
### This is my code:
import os
import logging
from slack_bolt import App
from slack_bolt import Say
from slack_bolt.adapter.socket_mode import SocketModeHandler
from slack_sdk import WebClient
import functions_framework
import deepl
import langid
import json
from slack_bolt.adapter.flask import SlackRequestHandler
logging.basicConfig(level=logging.DEBUG)
DEEPL_API_TOKEN = os.environ["DEEPL_API_TOKEN"]
SLACK_BOT_TOKEN = os.environ["SLACK_BOT_TOKEN"]
app = App(
token=SLACK_BOT_TOKEN,
signing_secret=os.environ.get("SLACK_SIGNING_SECRET"),
process_before_response=True
)
handler = SlackRequestHandler(app)
client = WebClient(SLACK_BOT_TOKEN)
translator = deepl.Translator(DEEPL_API_TOKEN)
@app.middleware
def log_request(logger, body, next):
logger.debug(body)
return next()
@app.event("reaction_added")
def show_datepicker(event,say: Say):
reaction = event["reaction"]
replies = say.client.conversations_replies(channel=event["item"]["channel"], ts=event["item"]["ts"])
print("replies is:",replies)
message = replies["messages"][0]["text"]
print("message is:",message)
lang = langid.classify(replies["messages"][0]["text"])
print("languages[0] is:",lang[0])
if reaction == "eyes":
if lang[0] == "ja":
target_lang = "EN-US"
elif lang[0] == "en":
target_lang = "JA"
else:
return
result = translator.translate_text(message, target_lang=target_lang)
query = ""
for m in message.split("\n"):
query += f">{m}\n"
say(
thread_ts=replies["messages"][0].get("ts"),
text=f"{query}{result.text}"
)
return
from threading import Thread
@functions_framework.http
def slack_bot(request):
request_data = request.form
t = Thread(target=show_datepicker, kwargs={'request_data': request_data})
t.start()
return handler.handle(request)
if __name__ == "__main__":
app.start(port=int(os.environ.get("PORT", 3000)))The slack_bolt version
slack-bolt==1.14.3
slack-sdk==3.18.3
Python runtime version
Python 3.9.12
Expected result:
I want to prevent duplicate messages.
Actual result:
Duplicate messages more than three times