91 lines
3.0 KiB
TypeScript
91 lines
3.0 KiB
TypeScript
import { formatAllowFromLowercase } from "openclaw/plugin-sdk/allow-from";
|
|
import {
|
|
createScopedAccountConfigAccessors,
|
|
createScopedChannelConfigBase,
|
|
} from "openclaw/plugin-sdk/channel-config-helpers";
|
|
import { getChatChannelMeta, type ChannelPlugin } from "openclaw/plugin-sdk/core";
|
|
import { inspectDiscordAccount } from "./account-inspect.js";
|
|
import {
|
|
listDiscordAccountIds,
|
|
resolveDefaultDiscordAccountId,
|
|
resolveDiscordAccount,
|
|
type ResolvedDiscordAccount,
|
|
} from "./accounts.js";
|
|
import { createDiscordSetupWizardProxy } from "./setup-core.js";
|
|
|
|
export const DISCORD_CHANNEL = "discord" as const;
|
|
|
|
async function loadDiscordChannelRuntime() {
|
|
return await import("./channel.runtime.js");
|
|
}
|
|
|
|
export const discordSetupWizard = createDiscordSetupWizardProxy(async () => ({
|
|
discordSetupWizard: (await loadDiscordChannelRuntime()).discordSetupWizard,
|
|
}));
|
|
|
|
export const discordConfigAccessors = createScopedAccountConfigAccessors({
|
|
resolveAccount: ({ cfg, accountId }) => resolveDiscordAccount({ cfg, accountId }),
|
|
resolveAllowFrom: (account: ResolvedDiscordAccount) => account.config.dm?.allowFrom,
|
|
formatAllowFrom: (allowFrom) => formatAllowFromLowercase({ allowFrom }),
|
|
resolveDefaultTo: (account: ResolvedDiscordAccount) => account.config.defaultTo,
|
|
});
|
|
|
|
export const discordConfigBase = createScopedChannelConfigBase<ResolvedDiscordAccount>({
|
|
sectionKey: DISCORD_CHANNEL,
|
|
listAccountIds: listDiscordAccountIds,
|
|
resolveAccount: (cfg, accountId) => resolveDiscordAccount({ cfg, accountId }),
|
|
inspectAccount: (cfg, accountId) => inspectDiscordAccount({ cfg, accountId }),
|
|
defaultAccountId: resolveDefaultDiscordAccountId,
|
|
clearBaseFields: ["token", "name"],
|
|
});
|
|
|
|
export function createDiscordPluginBase(params: {
|
|
configSchema: Pick<ChannelPlugin<ResolvedDiscordAccount>, "configSchema">["configSchema"];
|
|
setup: NonNullable<ChannelPlugin<ResolvedDiscordAccount>["setup"]>;
|
|
}): Pick<
|
|
ChannelPlugin<ResolvedDiscordAccount>,
|
|
| "id"
|
|
| "meta"
|
|
| "setupWizard"
|
|
| "capabilities"
|
|
| "streaming"
|
|
| "reload"
|
|
| "configSchema"
|
|
| "config"
|
|
| "setup"
|
|
> {
|
|
return {
|
|
id: DISCORD_CHANNEL,
|
|
meta: {
|
|
...getChatChannelMeta(DISCORD_CHANNEL),
|
|
},
|
|
setupWizard: discordSetupWizard,
|
|
capabilities: {
|
|
chatTypes: ["direct", "channel", "thread"],
|
|
polls: true,
|
|
reactions: true,
|
|
threads: true,
|
|
media: true,
|
|
nativeCommands: true,
|
|
},
|
|
streaming: {
|
|
blockStreamingCoalesceDefaults: { minChars: 1500, idleMs: 1000 },
|
|
},
|
|
reload: { configPrefixes: ["channels.discord"] },
|
|
configSchema: params.configSchema,
|
|
config: {
|
|
...discordConfigBase,
|
|
isConfigured: (account) => Boolean(account.token?.trim()),
|
|
describeAccount: (account) => ({
|
|
accountId: account.accountId,
|
|
name: account.name,
|
|
enabled: account.enabled,
|
|
configured: Boolean(account.token?.trim()),
|
|
tokenSource: account.tokenSource,
|
|
}),
|
|
...discordConfigAccessors,
|
|
},
|
|
setup: params.setup,
|
|
};
|
|
}
|