// Discord plugin module implements conversation identity behavior. import { normalizeOptionalLowercaseString, normalizeOptionalString, } from "openclaw/plugin-sdk/string-coerce-runtime"; import { parseDiscordTarget } from "./target-parsing.js"; function normalizeDiscordTarget( raw: string | null | undefined, defaultKind: "user" | "channel", ): string | undefined { const trimmed = normalizeOptionalString(raw); if (!trimmed) { return undefined; } return parseDiscordTarget(trimmed, { defaultKind })?.normalized; } function buildDiscordConversationIdentity( kind: "user" | "channel", rawId: string | null | undefined, ): string | undefined { const trimmed = normalizeOptionalString(rawId); return trimmed ? `${kind}:${trimmed}` : undefined; } export function resolveDiscordConversationIdentity(params: { isDirectMessage: boolean; userId?: string | null; channelId?: string | null; }): string | undefined { return params.isDirectMessage ? buildDiscordConversationIdentity("user", params.userId) : buildDiscordConversationIdentity("channel", params.channelId); } export function resolveDiscordCurrentConversationIdentity(params: { chatType?: string | null; from?: string | null; originatingTo?: string | null; commandTo?: string | null; fallbackTo?: string | null; }): string | undefined { if (normalizeOptionalLowercaseString(params.chatType) === "direct") { const senderTarget = normalizeDiscordTarget(params.from, "user"); if (senderTarget?.startsWith("user:")) { return senderTarget; } } for (const candidate of [params.originatingTo, params.commandTo, params.fallbackTo]) { const target = normalizeDiscordTarget(candidate, "channel"); if (target) { return target; } } return undefined; }