Files
soleprint/artery/veins/slack/models/formatter.py
2025-12-31 08:34:18 -03:00

71 lines
2.1 KiB
Python

"""
Text formatters for Slack data (LLM-friendly output).
"""
from .message import MessageList, ChannelList, UserList, Message, Channel
def format_message(msg: Message, users: dict[str, str] | None = None) -> str:
"""Format a single message."""
user_display = msg.user
if users and msg.user and msg.user in users:
user_display = users[msg.user]
time_str = msg.timestamp.strftime("%Y-%m-%d %H:%M") if msg.timestamp else msg.ts
thread_info = f" [thread: {msg.reply_count} replies]" if msg.reply_count > 0 else ""
return f"[{time_str}] {user_display}: {msg.text}{thread_info}"
def format_message_list(data: MessageList, users: dict[str, str] | None = None) -> str:
"""Format message list for text output."""
lines = [f"Channel: {data.channel_id}", f"Messages: {len(data.messages)}", ""]
for msg in data.messages:
lines.append(format_message(msg, users))
if data.has_more:
lines.append("\n[More messages available...]")
return "\n".join(lines)
def format_channel(ch: Channel) -> str:
"""Format a single channel."""
flags = []
if ch.is_private:
flags.append("private")
if ch.is_archived:
flags.append("archived")
if ch.is_member:
flags.append("member")
flag_str = f" ({', '.join(flags)})" if flags else ""
members_str = f" [{ch.num_members} members]" if ch.num_members else ""
return f"#{ch.name} ({ch.id}){flag_str}{members_str}"
def format_channel_list(data: ChannelList) -> str:
"""Format channel list for text output."""
lines = [f"Channels: {data.total}", ""]
for ch in data.channels:
lines.append(format_channel(ch))
if ch.purpose:
lines.append(f" Purpose: {ch.purpose}")
return "\n".join(lines)
def format_user_list(data: UserList) -> str:
"""Format user list for text output."""
lines = [f"Users: {data.total}", ""]
for u in data.users:
bot_flag = " [bot]" if u.is_bot else ""
display = u.display_name or u.real_name or u.name
lines.append(f"@{u.name} ({u.id}) - {display}{bot_flag}")
return "\n".join(lines)