openclaw/extensions/discord/src/monitor/dm-command-decision.ts
2026-03-16 21:16:32 -07:00

49 lines
1.5 KiB
TypeScript

import { issuePairingChallenge } from "openclaw/plugin-sdk/conversation-runtime";
import { upsertChannelPairingRequest } from "openclaw/plugin-sdk/conversation-runtime";
import type { DiscordDmCommandAccess } from "./dm-command-auth.js";
export async function handleDiscordDmCommandDecision(params: {
dmAccess: DiscordDmCommandAccess;
accountId: string;
sender: {
id: string;
tag?: string;
name?: string;
};
onPairingCreated: (code: string) => Promise<void>;
onUnauthorized: () => Promise<void>;
upsertPairingRequest?: typeof upsertChannelPairingRequest;
}): Promise<boolean> {
if (params.dmAccess.decision === "allow") {
return true;
}
if (params.dmAccess.decision === "pairing") {
const upsertPairingRequest = params.upsertPairingRequest ?? upsertChannelPairingRequest;
const result = await issuePairingChallenge({
channel: "discord",
senderId: params.sender.id,
senderIdLine: `Your Discord user id: ${params.sender.id}`,
meta: {
tag: params.sender.tag,
name: params.sender.name,
},
upsertPairingRequest: async ({ id, meta }) =>
await upsertPairingRequest({
channel: "discord",
id,
accountId: params.accountId,
meta,
}),
sendPairingReply: async () => {},
});
if (result.created && result.code) {
await params.onPairingCreated(result.code);
}
return false;
}
await params.onUnauthorized();
return false;
}