from __future__ import annotations from yuxi.channels.models import DeliveryResult async def send_formatted_text( bridge, jid: str, content: str, reply_to: str | None = None, ) -> DeliveryResult: return await bridge.send_message( jid=jid, content=content, reply_to=reply_to, ) async def send_formatted_media( bridge, jid: str, media_type: str, media_path: str, caption: str = "", reply_to: str | None = None, ) -> DeliveryResult: return await bridge.send_media( jid=jid, media_type=media_type, media_path=media_path, caption=caption, reply_to=reply_to, ) async def send_chunked_text( bridge, jid: str, chunks: list[str], reply_to: str | None = None, ) -> list[DeliveryResult]: results = [] for chunk in chunks: result = await bridge.send_message( jid=jid, content=chunk, reply_to=reply_to if len(results) == 0 else None, ) results.append(result) return results def chunk_message(content: str, chunk_limit: int = 4000, mode: str = "length") -> list[str]: if len(content) <= chunk_limit: return [content] if mode == "newline": return _chunk_by_newline(content, chunk_limit) return _chunk_by_length(content, chunk_limit) def _chunk_by_length(content: str, chunk_limit: int) -> list[str]: chunks: list[str] = [] start = 0 while start < len(content): end = min(start + chunk_limit, len(content)) if end < len(content): last_space = content.rfind(" ", start, end) last_newline = content.rfind("\n", start, end) boundary = max(last_space, last_newline) if boundary > start: end = boundary + 1 chunks.append(content[start:end]) start = end return chunks def _chunk_by_newline(content: str, chunk_limit: int) -> list[str]: lines = content.split("\n") chunks: list[str] = [] current = "" for line in lines: candidate = f"{current}\n{line}" if current else line if len(candidate) > chunk_limit: if current: chunks.append(current) current = line else: chunks.append(line) current = "" else: current = candidate if current: chunks.append(current) return chunks