mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-08 11:41:24 +00:00
Bridge the agent tools layer to the Discord gateway WebSocket via a new gateway registry, allowing agents to set the bot's activity and online status. Supports playing, streaming, listening, watching, custom, and competing activity types. Custom type uses activityState as the sidebar text; other types show activityName in the sidebar and activityState in the flyout. Opt-in via channels.discord.actions.presence (default false). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
78 lines
2.1 KiB
TypeScript
78 lines
2.1 KiB
TypeScript
import type { AgentToolResult } from "@mariozechner/pi-agent-core";
|
|
import type { OpenClawConfig } from "../../config/config.js";
|
|
import { createActionGate, readStringParam } from "./common.js";
|
|
import { handleDiscordGuildAction } from "./discord-actions-guild.js";
|
|
import { handleDiscordMessagingAction } from "./discord-actions-messaging.js";
|
|
import { handleDiscordModerationAction } from "./discord-actions-moderation.js";
|
|
import { handleDiscordPresenceAction } from "./discord-actions-presence.js";
|
|
|
|
const messagingActions = new Set([
|
|
"react",
|
|
"reactions",
|
|
"sticker",
|
|
"poll",
|
|
"permissions",
|
|
"fetchMessage",
|
|
"readMessages",
|
|
"sendMessage",
|
|
"editMessage",
|
|
"deleteMessage",
|
|
"threadCreate",
|
|
"threadList",
|
|
"threadReply",
|
|
"pinMessage",
|
|
"unpinMessage",
|
|
"listPins",
|
|
"searchMessages",
|
|
]);
|
|
|
|
const guildActions = new Set([
|
|
"memberInfo",
|
|
"roleInfo",
|
|
"emojiList",
|
|
"emojiUpload",
|
|
"stickerUpload",
|
|
"roleAdd",
|
|
"roleRemove",
|
|
"channelInfo",
|
|
"channelList",
|
|
"voiceStatus",
|
|
"eventList",
|
|
"eventCreate",
|
|
"channelCreate",
|
|
"channelEdit",
|
|
"channelDelete",
|
|
"channelMove",
|
|
"categoryCreate",
|
|
"categoryEdit",
|
|
"categoryDelete",
|
|
"channelPermissionSet",
|
|
"channelPermissionRemove",
|
|
]);
|
|
|
|
const moderationActions = new Set(["timeout", "kick", "ban"]);
|
|
|
|
const presenceActions = new Set(["setPresence"]);
|
|
|
|
export async function handleDiscordAction(
|
|
params: Record<string, unknown>,
|
|
cfg: OpenClawConfig,
|
|
): Promise<AgentToolResult<unknown>> {
|
|
const action = readStringParam(params, "action", { required: true });
|
|
const isActionEnabled = createActionGate(cfg.channels?.discord?.actions);
|
|
|
|
if (messagingActions.has(action)) {
|
|
return await handleDiscordMessagingAction(action, params, isActionEnabled);
|
|
}
|
|
if (guildActions.has(action)) {
|
|
return await handleDiscordGuildAction(action, params, isActionEnabled);
|
|
}
|
|
if (moderationActions.has(action)) {
|
|
return await handleDiscordModerationAction(action, params, isActionEnabled);
|
|
}
|
|
if (presenceActions.has(action)) {
|
|
return await handleDiscordPresenceAction(action, params, isActionEnabled);
|
|
}
|
|
throw new Error(`Unknown action: ${action}`);
|
|
}
|