shared/openai-slackbot/openai_slackbot/utils/slack.py (42 lines of code) (raw):
import typing as t
RenderedSlackBlock = t.NewType("RenderedSlackBlock", t.Dict[str, t.Any])
def block_id_exists(blocks: t.List[RenderedSlackBlock], block_id: str) -> bool:
return any([block.get("block_id") == block_id for block in blocks])
def remove_block_id_if_exists(blocks: t.List[RenderedSlackBlock], block_id: str) -> t.List:
return [block for block in blocks if block.get("block_id") != block_id]
def get_block_by_id(blocks: t.Dict, block_id: str) -> t.Dict:
for block in blocks:
if block.get("block_id") == block_id:
return block
return {}
def extract_text_from_event(event) -> str:
"""Extracts text from either plaintext and block message."""
# Extract text from plaintext message.
text = event.get("text")
if text:
return text
# Extract text from message blocks.
texts = []
attachments = event.get("attachments", [])
for attachment in attachments:
attachment_message_blocks = attachment.get("message_blocks", [])
for amb in attachment_message_blocks:
message_blocks = amb.get("message", {}).get("blocks", [])
for mb in message_blocks:
mb_elements = mb.get("elements", [])
for mbe in mb_elements:
mbe_elements = mbe.get("elements", [])
for mbee in mbe_elements:
if mbee.get("type") == "text":
texts.append(mbee["text"])
return " ".join(texts).strip()
def render_slack_id_to_mention(id: str):
"""Render a usergroup or user ID to a mention."""
if not id:
return ""
elif id.startswith("U"):
return f"<@{id}>"
elif id.startswith("S"):
return f"<!subteam|{id}>"
elif id.startswith("C"):
return f"<#{id}>"
else:
raise ValueError(f"Unsupported/invalid ID type: {id}")
def render_slack_url(*, url: str, text: str) -> str:
"""Render a URL to a clickable link."""
return f"<{url}|{text}>"