import { Channel, NewMessage } from './types.js'; import { formatLocalTime } from './timezone.js'; export function escapeXml(s: string): string { if (!s) return ''; return s.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); } export function formatMessages(messages: NewMessage[], timezone: string): string { const lines = messages.map((m) => { const displayTime = formatLocalTime(m.timestamp, timezone); const replyAttr = m.reply_to_message_id ? ` reply_to="${escapeXml(m.reply_to_message_id)}"` : ''; const replySnippet = m.reply_to_message_content && m.reply_to_sender_name ? `\n ${escapeXml(m.reply_to_message_content)}` : ''; return `${replySnippet}${escapeXml(m.content)}`; }); const header = `\n`; return `${header}\n${lines.join('\n')}\n`; } export function stripInternalTags(text: string): string { return text.replace(/[\s\S]*?<\/internal>/g, '').trim(); } export function formatOutbound(rawText: string): string { const text = stripInternalTags(rawText); if (!text) return ''; return text; } export function routeOutbound(channels: Channel[], jid: string, text: string): Promise { const channel = channels.find((c) => c.ownsJid(jid) && c.isConnected()); if (!channel) throw new Error(`No channel for JID: ${jid}`); return channel.sendMessage(jid, text); } export function findChannel(channels: Channel[], jid: string): Channel | undefined { return channels.find((c) => c.ownsJid(jid)); }