101 lines
3.1 KiB
TypeScript
101 lines
3.1 KiB
TypeScript
import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime";
|
|
import {
|
|
deriveLastRoutePolicy,
|
|
resolveAgentRoute,
|
|
type ResolvedAgentRoute,
|
|
type RoutePeer,
|
|
} from "openclaw/plugin-sdk/routing";
|
|
import { resolveAgentIdFromSessionKey } from "openclaw/plugin-sdk/routing";
|
|
|
|
export function buildDiscordRoutePeer(params: {
|
|
isDirectMessage: boolean;
|
|
isGroupDm: boolean;
|
|
directUserId?: string | null;
|
|
conversationId: string;
|
|
}): RoutePeer {
|
|
return {
|
|
kind: params.isDirectMessage ? "direct" : params.isGroupDm ? "group" : "channel",
|
|
id: params.isDirectMessage
|
|
? params.directUserId?.trim() || params.conversationId
|
|
: params.conversationId,
|
|
};
|
|
}
|
|
|
|
export function resolveDiscordConversationRoute(params: {
|
|
cfg: OpenClawConfig;
|
|
accountId?: string | null;
|
|
guildId?: string | null;
|
|
memberRoleIds?: string[];
|
|
peer: RoutePeer;
|
|
parentConversationId?: string | null;
|
|
}): ResolvedAgentRoute {
|
|
return resolveAgentRoute({
|
|
cfg: params.cfg,
|
|
channel: "discord",
|
|
accountId: params.accountId,
|
|
guildId: params.guildId ?? undefined,
|
|
memberRoleIds: params.memberRoleIds,
|
|
peer: params.peer,
|
|
parentPeer: params.parentConversationId
|
|
? { kind: "channel", id: params.parentConversationId }
|
|
: undefined,
|
|
});
|
|
}
|
|
|
|
export function resolveDiscordBoundConversationRoute(params: {
|
|
cfg: OpenClawConfig;
|
|
accountId?: string | null;
|
|
guildId?: string | null;
|
|
memberRoleIds?: string[];
|
|
isDirectMessage: boolean;
|
|
isGroupDm: boolean;
|
|
directUserId?: string | null;
|
|
conversationId: string;
|
|
parentConversationId?: string | null;
|
|
boundSessionKey?: string | null;
|
|
configuredRoute?: { route: ResolvedAgentRoute } | null;
|
|
matchedBy?: ResolvedAgentRoute["matchedBy"];
|
|
}): ResolvedAgentRoute {
|
|
const route = resolveDiscordConversationRoute({
|
|
cfg: params.cfg,
|
|
accountId: params.accountId,
|
|
guildId: params.guildId,
|
|
memberRoleIds: params.memberRoleIds,
|
|
peer: buildDiscordRoutePeer({
|
|
isDirectMessage: params.isDirectMessage,
|
|
isGroupDm: params.isGroupDm,
|
|
directUserId: params.directUserId,
|
|
conversationId: params.conversationId,
|
|
}),
|
|
parentConversationId: params.parentConversationId,
|
|
});
|
|
return resolveDiscordEffectiveRoute({
|
|
route,
|
|
boundSessionKey: params.boundSessionKey,
|
|
configuredRoute: params.configuredRoute,
|
|
matchedBy: params.matchedBy,
|
|
});
|
|
}
|
|
|
|
export function resolveDiscordEffectiveRoute(params: {
|
|
route: ResolvedAgentRoute;
|
|
boundSessionKey?: string | null;
|
|
configuredRoute?: { route: ResolvedAgentRoute } | null;
|
|
matchedBy?: ResolvedAgentRoute["matchedBy"];
|
|
}): ResolvedAgentRoute {
|
|
const boundSessionKey = params.boundSessionKey?.trim();
|
|
if (!boundSessionKey) {
|
|
return params.configuredRoute?.route ?? params.route;
|
|
}
|
|
return {
|
|
...params.route,
|
|
sessionKey: boundSessionKey,
|
|
agentId: resolveAgentIdFromSessionKey(boundSessionKey),
|
|
lastRoutePolicy: deriveLastRoutePolicy({
|
|
sessionKey: boundSessionKey,
|
|
mainSessionKey: params.route.mainSessionKey,
|
|
}),
|
|
...(params.matchedBy ? { matchedBy: params.matchedBy } : {}),
|
|
};
|
|
}
|