56 lines
1.8 KiB
TypeScript
56 lines
1.8 KiB
TypeScript
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<string> {
|
|
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;
|
|
}
|