import re import uuid from datetime import datetime, timezone def utc_now(): return datetime.now(timezone.utc).isoformat() def sanitize_channel_part(value): return re.sub(r"[^A-Za-z0-9_.-]+", "-", str(value)).strip("-") or "unknown" class ResponseBuilder: def __init__(self, settings): self.settings = settings def reply_channel_for(self, payload): explicit = payload.get("reply_channel") or payload.get("reply_topic") if explicit: return explicit user_id = sanitize_channel_part(payload.get("user_id") or payload.get("id") or "unknown") session_id = sanitize_channel_part(payload.get("session_id") or "default") return self.settings.reply_channel_template.format(user_id=user_id, session_id=session_id) def build_success(self, payload): user_id = payload.get("user_id") or payload.get("id") if not user_id: raise ValueError("payload must include user_id") text = payload.get("message") if text is None: raise ValueError("payload must include message") display_name = payload.get("name") or payload.get("username") or user_id correlation_id = payload.get("correlation_id") or str(uuid.uuid4()) return { "type": "space.response", "ok": True, "user_id": user_id, "session_id": payload.get("session_id"), "correlation_id": correlation_id, "request": {"message": text}, "message": f"Hello {display_name}", "created_at": utc_now(), } def build_error(self, payload, error): user_id = payload.get("user_id") or payload.get("id") or "unknown" return { "type": "space.response", "ok": False, "user_id": user_id, "session_id": payload.get("session_id"), "correlation_id": payload.get("correlation_id") or str(uuid.uuid4()), "error": str(error), "created_at": utc_now(), }