2026-03-20 09:30:16 +01:00

72 lines
2.4 KiB
TypeScript

import type { BaseTokenResolution } from "openclaw/plugin-sdk/channel-runtime";
import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime";
import { normalizeResolvedSecretInputString } from "openclaw/plugin-sdk/config-runtime";
import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "openclaw/plugin-sdk/routing";
export type DiscordTokenSource = "env" | "config" | "none";
export type DiscordTokenResolution = BaseTokenResolution & {
source: DiscordTokenSource;
};
export function normalizeDiscordToken(raw: unknown, path: string): string | undefined {
const trimmed = normalizeResolvedSecretInputString({ value: raw, path });
if (!trimmed) {
return undefined;
}
return trimmed.replace(/^Bot\s+/i, "");
}
export function resolveDiscordToken(
cfg?: OpenClawConfig,
opts: { accountId?: string | null; envToken?: string | null } = {},
): DiscordTokenResolution {
const accountId = normalizeAccountId(opts.accountId);
const discordCfg = cfg?.channels?.discord;
const resolveAccountCfg = (id: string) => {
const accounts = discordCfg?.accounts;
if (!accounts || typeof accounts !== "object" || Array.isArray(accounts)) {
return undefined;
}
const direct = accounts[id];
if (direct) {
return direct;
}
const matchKey = Object.keys(accounts).find((key) => normalizeAccountId(key) === id);
return matchKey ? accounts[matchKey] : undefined;
};
const accountCfg = resolveAccountCfg(accountId);
const hasAccountToken = Boolean(
accountCfg &&
Object.prototype.hasOwnProperty.call(accountCfg as Record<string, unknown>, "token"),
);
const accountToken = normalizeDiscordToken(
(accountCfg as { token?: unknown } | undefined)?.token ?? undefined,
`channels.discord.accounts.${accountId}.token`,
);
if (accountToken) {
return { token: accountToken, source: "config" };
}
if (hasAccountToken) {
return { token: "", source: "none" };
}
const configToken = normalizeDiscordToken(
discordCfg?.token ?? undefined,
"channels.discord.token",
);
if (configToken) {
return { token: configToken, source: "config" };
}
const allowEnv = accountId === DEFAULT_ACCOUNT_ID;
const envToken = allowEnv
? normalizeDiscordToken(opts.envToken ?? process.env.DISCORD_BOT_TOKEN, "DISCORD_BOT_TOKEN")
: undefined;
if (envToken) {
return { token: envToken, source: "env" };
}
return { token: "", source: "none" };
}