aboutsummaryrefslogtreecommitdiffstats
path: root/slack/slack_thread.py
diff options
context:
space:
mode:
Diffstat (limited to 'slack/slack_thread.py')
-rw-r--r--slack/slack_thread.py87
1 files changed, 87 insertions, 0 deletions
diff --git a/slack/slack_thread.py b/slack/slack_thread.py
new file mode 100644
index 0000000..f92dfc4
--- /dev/null
+++ b/slack/slack_thread.py
@@ -0,0 +1,87 @@
+from __future__ import annotations
+
+from itertools import chain
+from typing import TYPE_CHECKING, Dict, Mapping, Tuple
+
+from slack.slack_buffer import SlackBuffer
+from slack.slack_message import SlackMessage, SlackTs
+from slack.task import gather
+
+if TYPE_CHECKING:
+ from typing_extensions import Literal
+
+ from slack.slack_workspace import SlackWorkspace
+
+
+class SlackThread(SlackBuffer):
+ def __init__(self, parent: SlackMessage) -> None:
+ super().__init__()
+ self.parent = parent
+
+ @property
+ def workspace(self) -> SlackWorkspace:
+ return self.parent.workspace
+
+ @property
+ def context(self) -> Literal["conversation", "thread"]:
+ return "thread"
+
+ @property
+ def messages(self) -> Mapping[SlackTs, SlackMessage]:
+ return self.parent.replies
+
+ async def get_name_and_buffer_props(self) -> Tuple[str, Dict[str, str]]:
+ conversation_name = await self.parent.conversation.name_with_prefix("full_name")
+ name = f"{conversation_name}.${self.parent.hash}"
+ short_name = f" ${self.parent.hash}"
+
+ return name, {
+ "short_name": short_name,
+ "title": "topic",
+ "input_multiline": "1",
+ "localvar_set_type": self.parent.conversation.buffer_type,
+ "localvar_set_slack_type": "thread",
+ "localvar_set_nick": self.workspace.my_user.nick(),
+ "localvar_set_channel": name,
+ "localvar_set_server": self.workspace.name,
+ }
+
+ async def buffer_switched_to(self):
+ await self.fill_history()
+
+ async def print_history(self):
+ if self.history_filled:
+ return
+
+ self.history_filled = True
+
+ with self.loading():
+ messages = chain([self.parent], self.parent.replies.values())
+ for message in messages:
+ await self.print_message(message, backlog=True)
+
+ async def fill_history(self):
+ if self.history_pending:
+ return
+
+ if self.parent.reply_history_filled:
+ await self.print_history()
+ return
+
+ with self.loading():
+ self.history_pending = True
+
+ messages = await self.parent.conversation.fetch_replies(self.parent)
+ if messages is None:
+ return
+
+ sender_user_ids = [m.sender_user_id for m in messages if m.sender_user_id]
+ self.workspace.users.initialize_items(sender_user_ids)
+
+ sender_bot_ids = [m.sender_bot_id for m in messages if m.sender_bot_id]
+ self.workspace.bots.initialize_items(sender_bot_ids)
+
+ await gather(*(message.render(self.context) for message in messages))
+ await self.print_history()
+
+ self.history_pending = False