import type { OpenClawPluginApi } from "openclaw/plugin-sdk"; import type { ChannelStore, ChannelMode } from "../core/channel-store.js"; import { parseDiscordChannelIdFromCommand } from "./command-utils.js"; const SWITCHABLE_MODES = new Set(["none", "chat", "report"]); const LOCKED_MODES = new Set(["work", "discussion"]); type Deps = { api: OpenClawPluginApi; channelStore: ChannelStore; }; export function registerSetChannelModeCommand(deps: Deps): void { const { api, channelStore } = deps; api.registerCommand({ name: "set-channel-mode", description: "Set the mode of the current Discord channel: none | chat | report", acceptsArgs: true, handler: async (cmdCtx) => { const raw = (cmdCtx.args || "").trim().toLowerCase() as ChannelMode; if (!raw) { return { text: "Usage: /set-channel-mode \n\nModes work and discussion are locked and can only be set via creation tools.", isError: true, }; } if (LOCKED_MODES.has(raw)) { return { text: `Mode "${raw}" cannot be set via command — it is locked to its creation tool (create-${raw}-channel or create-discussion-channel).`, isError: true, }; } if (!SWITCHABLE_MODES.has(raw)) { return { text: `Unknown mode "${raw}". Valid values: none, chat, report`, isError: true, }; } // Extract channel ID from command context const channelId = parseDiscordChannelIdFromCommand(cmdCtx); if (!channelId) { return { text: "Could not determine Discord channel ID. Run this command inside a Discord channel.", isError: true, }; } const current = channelStore.getMode(channelId); if (LOCKED_MODES.has(current)) { return { text: `Channel ${channelId} is in locked mode "${current}" and cannot be changed.`, isError: true, }; } try { channelStore.setMode(channelId, raw); } catch (err) { return { text: `Failed: ${String(err)}`, isError: true }; } return { text: `Channel ${channelId} mode set to "${raw}".` }; }, }); }