112 lines
3.4 KiB
TypeScript
112 lines
3.4 KiB
TypeScript
import type { ClawdbotConfig } from "../../config/config.js";
|
|
import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../../routing/session-key.js";
|
|
|
|
type ChannelSectionBase = {
|
|
name?: string;
|
|
accounts?: Record<string, Record<string, unknown>>;
|
|
};
|
|
|
|
function channelHasAccounts(cfg: ClawdbotConfig, channelKey: string): boolean {
|
|
const channels = cfg.channels as Record<string, unknown> | undefined;
|
|
const base = channels?.[channelKey] as ChannelSectionBase | undefined;
|
|
return Boolean(base?.accounts && Object.keys(base.accounts).length > 0);
|
|
}
|
|
|
|
function shouldStoreNameInAccounts(params: {
|
|
cfg: ClawdbotConfig;
|
|
channelKey: string;
|
|
accountId: string;
|
|
alwaysUseAccounts?: boolean;
|
|
}): boolean {
|
|
if (params.alwaysUseAccounts) return true;
|
|
if (params.accountId !== DEFAULT_ACCOUNT_ID) return true;
|
|
return channelHasAccounts(params.cfg, params.channelKey);
|
|
}
|
|
|
|
export function applyAccountNameToChannelSection(params: {
|
|
cfg: ClawdbotConfig;
|
|
channelKey: string;
|
|
accountId: string;
|
|
name?: string;
|
|
alwaysUseAccounts?: boolean;
|
|
}): ClawdbotConfig {
|
|
const trimmed = params.name?.trim();
|
|
if (!trimmed) return params.cfg;
|
|
const accountId = normalizeAccountId(params.accountId);
|
|
const channels = params.cfg.channels as Record<string, unknown> | undefined;
|
|
const baseConfig = channels?.[params.channelKey];
|
|
const base =
|
|
typeof baseConfig === "object" && baseConfig ? (baseConfig as ChannelSectionBase) : undefined;
|
|
const useAccounts = shouldStoreNameInAccounts({
|
|
cfg: params.cfg,
|
|
channelKey: params.channelKey,
|
|
accountId,
|
|
alwaysUseAccounts: params.alwaysUseAccounts,
|
|
});
|
|
if (!useAccounts && accountId === DEFAULT_ACCOUNT_ID) {
|
|
const safeBase = base ?? {};
|
|
return {
|
|
...params.cfg,
|
|
channels: {
|
|
...params.cfg.channels,
|
|
[params.channelKey]: {
|
|
...safeBase,
|
|
name: trimmed,
|
|
},
|
|
},
|
|
} as ClawdbotConfig;
|
|
}
|
|
const baseAccounts: Record<string, Record<string, unknown>> = base?.accounts ?? {};
|
|
const existingAccount = baseAccounts[accountId] ?? {};
|
|
const baseWithoutName =
|
|
accountId === DEFAULT_ACCOUNT_ID
|
|
? (({ name: _ignored, ...rest }) => rest)(base ?? {})
|
|
: (base ?? {});
|
|
return {
|
|
...params.cfg,
|
|
channels: {
|
|
...params.cfg.channels,
|
|
[params.channelKey]: {
|
|
...baseWithoutName,
|
|
accounts: {
|
|
...baseAccounts,
|
|
[accountId]: {
|
|
...existingAccount,
|
|
name: trimmed,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
} as ClawdbotConfig;
|
|
}
|
|
|
|
export function migrateBaseNameToDefaultAccount(params: {
|
|
cfg: ClawdbotConfig;
|
|
channelKey: string;
|
|
alwaysUseAccounts?: boolean;
|
|
}): ClawdbotConfig {
|
|
if (params.alwaysUseAccounts) return params.cfg;
|
|
const channels = params.cfg.channels as Record<string, unknown> | undefined;
|
|
const base = channels?.[params.channelKey] as ChannelSectionBase | undefined;
|
|
const baseName = base?.name?.trim();
|
|
if (!baseName) return params.cfg;
|
|
const accounts: Record<string, Record<string, unknown>> = {
|
|
...base?.accounts,
|
|
};
|
|
const defaultAccount = accounts[DEFAULT_ACCOUNT_ID] ?? {};
|
|
if (!defaultAccount.name) {
|
|
accounts[DEFAULT_ACCOUNT_ID] = { ...defaultAccount, name: baseName };
|
|
}
|
|
const { name: _ignored, ...rest } = base ?? {};
|
|
return {
|
|
...params.cfg,
|
|
channels: {
|
|
...params.cfg.channels,
|
|
[params.channelKey]: {
|
|
...rest,
|
|
accounts,
|
|
},
|
|
},
|
|
} as ClawdbotConfig;
|
|
}
|