Files
openclaw/src/discord/pluralkit.ts
Shadow 8e2b17e0c5 Discord: add PluralKit sender identity resolver (#5838)
* Discord: add PluralKit sender identity resolver

* fix: resolve PluralKit sender identities (#5838) (thanks @thewilloftheshadow)
2026-01-31 19:50:06 -06:00

59 lines
1.4 KiB
TypeScript

import { resolveFetch } from "../infra/fetch.js";
const PLURALKIT_API_BASE = "https://api.pluralkit.me/v2";
export type DiscordPluralKitConfig = {
enabled?: boolean;
token?: string;
};
export type PluralKitSystemInfo = {
id: string;
name?: string | null;
tag?: string | null;
};
export type PluralKitMemberInfo = {
id: string;
name?: string | null;
display_name?: string | null;
};
export type PluralKitMessageInfo = {
id: string;
original?: string | null;
sender?: string | null;
system?: PluralKitSystemInfo | null;
member?: PluralKitMemberInfo | null;
};
export async function fetchPluralKitMessageInfo(params: {
messageId: string;
config?: DiscordPluralKitConfig;
fetcher?: typeof fetch;
}): Promise<PluralKitMessageInfo | null> {
if (!params.config?.enabled) {
return null;
}
const fetchImpl = resolveFetch(params.fetcher);
if (!fetchImpl) {
return null;
}
const headers: Record<string, string> = {};
if (params.config.token?.trim()) {
headers.Authorization = params.config.token.trim();
}
const res = await fetchImpl(`${PLURALKIT_API_BASE}/messages/${params.messageId}`, {
headers,
});
if (res.status === 404) {
return null;
}
if (!res.ok) {
const text = await res.text().catch(() => "");
const detail = text.trim() ? `: ${text.trim()}` : "";
throw new Error(`PluralKit API failed (${res.status})${detail}`);
}
return (await res.json()) as PluralKitMessageInfo;
}