Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions slack_bolt/context/assistant/assistant_utilities.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
12 changes: 9 additions & 3 deletions slack_bolt/context/say/say.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -15,18 +15,21 @@ class Say:
channel: Optional[str]
thread_ts: Optional[str]
metadata: Optional[Union[Dict, Metadata]]
build_metadata: Optional[Callable[[], Optional[Union[Dict, Metadata]]]]

def __init__(
self,
client: Optional[WebClient],
channel: Optional[str],
thread_ts: Optional[str] = None,
metadata: Optional[Union[Dict, Metadata]] = None,
build_metadata: Optional[Callable[[], Optional[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,
Expand All @@ -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,
Expand All @@ -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):
Expand All @@ -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)})")
Expand Down