From 4af7ab8cbc90fc8010c0af07a732313cda99fde8 Mon Sep 17 00:00:00 2001 From: Kazuhiro Sera Date: Thu, 24 Oct 2024 10:04:09 +0900 Subject: [PATCH 1/2] Improve metadata resolution timing in assistant app's say method --- slack_bolt/context/assistant/assistant_utilities.py | 11 +++++++---- slack_bolt/context/say/say.py | 12 +++++++++--- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/slack_bolt/context/assistant/assistant_utilities.py b/slack_bolt/context/assistant/assistant_utilities.py index 9bcb33842..53500efdb 100644 --- a/slack_bolt/context/assistant/assistant_utilities.py +++ b/slack_bolt/context/assistant/assistant_utilities.py @@ -63,14 +63,17 @@ def set_suggested_prompts(self) -> SetSuggestedPrompts: @property def say(self) -> Say: + def build_metadata() -> Optional[dict]: + thread_context = self.get_thread_context() + if thread_context is not None: + return {"event_type": "assistant_thread_context", "event_payload": thread_context} + return None + return Say( self.client, channel=self.channel_id, thread_ts=self.thread_ts, - metadata={ - "event_type": "assistant_thread_context", - "event_payload": self.get_thread_context(), - }, + build_metadata=build_metadata, ) @property diff --git a/slack_bolt/context/say/say.py b/slack_bolt/context/say/say.py index 6c0127a62..3f8eb9c27 100644 --- a/slack_bolt/context/say/say.py +++ b/slack_bolt/context/say/say.py @@ -1,4 +1,4 @@ -from typing import Optional, Union, Dict, Sequence +from typing import Optional, Union, Dict, Sequence, Callable from slack_sdk import WebClient from slack_sdk.models.attachments import Attachment @@ -15,6 +15,7 @@ class Say: channel: Optional[str] thread_ts: Optional[str] metadata: Optional[Union[Dict, Metadata]] + build_metadata: Optional[Callable[[], Union[Dict, Metadata]]] def __init__( self, @@ -22,11 +23,13 @@ def __init__( channel: Optional[str], thread_ts: Optional[str] = None, metadata: Optional[Union[Dict, Metadata]] = None, + build_metadata: Optional[Callable[[], Union[Dict, Metadata]]] = None, ): self.client = client self.channel = channel self.thread_ts = thread_ts self.metadata = metadata + self.build_metadata = build_metadata def __call__( self, @@ -52,6 +55,8 @@ def __call__( text_or_whole_response: Union[str, dict] = text if isinstance(text_or_whole_response, str): text = text_or_whole_response + if metadata is None: + metadata = self.build_metadata() if self.build_metadata is not None else self.metadata return self.client.chat_postMessage( # type: ignore[union-attr] channel=channel or self.channel, # type: ignore[arg-type] text=text, @@ -68,7 +73,7 @@ def __call__( mrkdwn=mrkdwn, link_names=link_names, parse=parse, - metadata=metadata or self.metadata, + metadata=metadata, **kwargs, ) elif isinstance(text_or_whole_response, dict): @@ -78,7 +83,8 @@ def __call__( if "thread_ts" not in message: message["thread_ts"] = thread_ts or self.thread_ts if "metadata" not in message: - message["metadata"] = metadata or self.metadata + metadata = self.build_metadata() if self.build_metadata is not None else self.metadata + message["metadata"] = metadata return self.client.chat_postMessage(**message) # type: ignore[union-attr] else: raise ValueError(f"The arg is unexpected type ({type(text_or_whole_response)})") From 96201d64676f4207d001f498f0626100a184d5e5 Mon Sep 17 00:00:00 2001 From: Kazuhiro Sera Date: Thu, 24 Oct 2024 10:12:05 +0900 Subject: [PATCH 2/2] Resolve mypy lint warnings --- slack_bolt/context/say/say.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/slack_bolt/context/say/say.py b/slack_bolt/context/say/say.py index 3f8eb9c27..6cfbcd801 100644 --- a/slack_bolt/context/say/say.py +++ b/slack_bolt/context/say/say.py @@ -15,7 +15,7 @@ class Say: channel: Optional[str] thread_ts: Optional[str] metadata: Optional[Union[Dict, Metadata]] - build_metadata: Optional[Callable[[], Union[Dict, Metadata]]] + build_metadata: Optional[Callable[[], Optional[Union[Dict, Metadata]]]] def __init__( self, @@ -23,7 +23,7 @@ def __init__( channel: Optional[str], thread_ts: Optional[str] = None, metadata: Optional[Union[Dict, Metadata]] = None, - build_metadata: Optional[Callable[[], Union[Dict, Metadata]]] = None, + build_metadata: Optional[Callable[[], Optional[Union[Dict, Metadata]]]] = None, ): self.client = client self.channel = channel