from dataclasses import dataclass from yuxi.channel.extensions.tlon.types import TlonTarget, TlonTargetKind from yuxi.channel.extensions.tlon.utils import normalize_ship def parse_tlon_target(raw: str) -> TlonTarget | None: raw = raw.strip() if raw.startswith("tlon:"): raw = raw[5:] if raw.startswith("dm/") or raw.startswith("dm:"): ship = raw[3:] return TlonTarget(kind=TlonTargetKind.DM, ship=normalize_ship(ship)) if raw.startswith("~") and "/" not in raw: return TlonTarget(kind=TlonTargetKind.DM, ship=normalize_ship(raw)) if raw.startswith("chat/"): parts = raw.split("/") if len(parts) >= 3: return TlonTarget( kind=TlonTargetKind.GROUP, nest=raw, host_ship=parts[1], channel_name="/".join(parts[2:]), ) if raw.startswith("group:") or raw.startswith("group/"): inner = raw[6:] if inner.startswith("/chat/"): inner = inner[1:] elif inner.startswith("chat/"): pass else: inner = f"chat/{inner}" parts = inner.split("/") return TlonTarget( kind=TlonTargetKind.GROUP, nest=inner, host_ship=parts[1] if len(parts) > 1 else "", channel_name="/".join(parts[2:]) if len(parts) > 2 else "", ) return None