import type { ResolvedGoogleChatAccount } from "./accounts.js"; import { findGoogleChatDirectMessage } from "./api.js"; export function normalizeGoogleChatTarget(raw?: string | null): string | undefined { const trimmed = raw?.trim(); if (!trimmed) return undefined; const withoutPrefix = trimmed.replace(/^(googlechat|google-chat|gchat):/i, ""); const normalized = withoutPrefix .replace(/^user:(users\/)?/i, "users/") .replace(/^space:(spaces\/)?/i, "spaces/"); if (isGoogleChatUserTarget(normalized)) { const suffix = normalized.slice("users/".length); return suffix.includes("@") ? `users/${suffix.toLowerCase()}` : normalized; } if (isGoogleChatSpaceTarget(normalized)) return normalized; if (normalized.includes("@")) return `users/${normalized.toLowerCase()}`; return normalized; } export function isGoogleChatUserTarget(value: string): boolean { return value.toLowerCase().startsWith("users/"); } export function isGoogleChatSpaceTarget(value: string): boolean { return value.toLowerCase().startsWith("spaces/"); } function stripMessageSuffix(target: string): string { const index = target.indexOf("/messages/"); if (index === -1) return target; return target.slice(0, index); } export async function resolveGoogleChatOutboundSpace(params: { account: ResolvedGoogleChatAccount; target: string; }): Promise { const normalized = normalizeGoogleChatTarget(params.target); if (!normalized) { throw new Error("Missing Google Chat target."); } const base = stripMessageSuffix(normalized); if (isGoogleChatSpaceTarget(base)) return base; if (isGoogleChatUserTarget(base)) { const dm = await findGoogleChatDirectMessage({ account: params.account, userName: base, }); if (!dm?.name) { throw new Error(`No Google Chat DM found for ${base}`); } return dm.name; } return base; }