import { buildMessagingTarget, ensureTargetId, requireTargetKind, type MessagingTarget, type MessagingTargetKind, type MessagingTargetParseOptions, } from "../channels/targets.js"; export type DiscordTargetKind = MessagingTargetKind; export type DiscordTarget = MessagingTarget; type DiscordTargetParseOptions = MessagingTargetParseOptions; export function parseDiscordTarget( raw: string, options: DiscordTargetParseOptions = {}, ): DiscordTarget | undefined { const trimmed = raw.trim(); if (!trimmed) return undefined; const mentionMatch = trimmed.match(/^<@!?(\d+)>$/); if (mentionMatch) { return buildMessagingTarget("user", mentionMatch[1], trimmed); } if (trimmed.startsWith("user:")) { const id = trimmed.slice("user:".length).trim(); return id ? buildMessagingTarget("user", id, trimmed) : undefined; } if (trimmed.startsWith("channel:")) { const id = trimmed.slice("channel:".length).trim(); return id ? buildMessagingTarget("channel", id, trimmed) : undefined; } if (trimmed.startsWith("discord:")) { const id = trimmed.slice("discord:".length).trim(); return id ? buildMessagingTarget("user", id, trimmed) : undefined; } if (trimmed.startsWith("@")) { const candidate = trimmed.slice(1).trim(); const id = ensureTargetId({ candidate, pattern: /^\d+$/, errorMessage: "Discord DMs require a user id (use user: or a <@id> mention)", }); return buildMessagingTarget("user", id, trimmed); } if (/^\d+$/.test(trimmed)) { if (options.defaultKind) { return buildMessagingTarget(options.defaultKind, trimmed, trimmed); } throw new Error( options.ambiguousMessage ?? `Ambiguous Discord recipient "${trimmed}". Use "user:${trimmed}" for DMs or "channel:${trimmed}" for channel messages.`, ); } return buildMessagingTarget("channel", trimmed, trimmed); } export function resolveDiscordChannelId(raw: string): string { const target = parseDiscordTarget(raw, { defaultKind: "channel" }); return requireTargetKind({ platform: "Discord", target, kind: "channel" }); }