mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-30 03:11:10 +00:00
94 lines
2.8 KiB
TypeScript
94 lines
2.8 KiB
TypeScript
import {
|
|
type ChannelOutboundAdapter,
|
|
createAttachedChannelResultAdapter,
|
|
createEmptyChannelResult,
|
|
} from "openclaw/plugin-sdk/channel-send-result";
|
|
import { resolveOutboundSendDep } from "openclaw/plugin-sdk/outbound-runtime";
|
|
import {
|
|
resolveSendableOutboundReplyParts,
|
|
sendTextMediaPayload,
|
|
} from "openclaw/plugin-sdk/reply-payload";
|
|
import { chunkText } from "openclaw/plugin-sdk/reply-runtime";
|
|
import { shouldLogVerbose } from "openclaw/plugin-sdk/runtime-env";
|
|
import { resolveWhatsAppOutboundTarget } from "./runtime-api.js";
|
|
import { sendMessageWhatsApp, sendPollWhatsApp } from "./send.js";
|
|
|
|
function trimLeadingWhitespace(text: string | undefined): string {
|
|
return text?.trimStart() ?? "";
|
|
}
|
|
|
|
export const whatsappOutbound: ChannelOutboundAdapter = {
|
|
deliveryMode: "gateway",
|
|
chunker: chunkText,
|
|
chunkerMode: "text",
|
|
textChunkLimit: 4000,
|
|
pollMaxOptions: 12,
|
|
resolveTarget: ({ to, allowFrom, mode }) =>
|
|
resolveWhatsAppOutboundTarget({ to, allowFrom, mode }),
|
|
sendPayload: async (ctx) => {
|
|
const text = trimLeadingWhitespace(ctx.payload.text);
|
|
const hasMedia = resolveSendableOutboundReplyParts(ctx.payload).hasMedia;
|
|
if (!text && !hasMedia) {
|
|
return createEmptyChannelResult("whatsapp");
|
|
}
|
|
return await sendTextMediaPayload({
|
|
channel: "whatsapp",
|
|
ctx: {
|
|
...ctx,
|
|
payload: {
|
|
...ctx.payload,
|
|
text,
|
|
},
|
|
},
|
|
adapter: whatsappOutbound,
|
|
});
|
|
},
|
|
...createAttachedChannelResultAdapter({
|
|
channel: "whatsapp",
|
|
sendText: async ({ cfg, to, text, accountId, deps, gifPlayback }) => {
|
|
const normalizedText = trimLeadingWhitespace(text);
|
|
if (!normalizedText) {
|
|
return createEmptyChannelResult("whatsapp");
|
|
}
|
|
const send =
|
|
resolveOutboundSendDep<typeof import("./send.js").sendMessageWhatsApp>(deps, "whatsapp") ??
|
|
(await import("./send.js")).sendMessageWhatsApp;
|
|
return await send(to, normalizedText, {
|
|
verbose: false,
|
|
cfg,
|
|
accountId: accountId ?? undefined,
|
|
gifPlayback,
|
|
});
|
|
},
|
|
sendMedia: async ({
|
|
cfg,
|
|
to,
|
|
text,
|
|
mediaUrl,
|
|
mediaLocalRoots,
|
|
accountId,
|
|
deps,
|
|
gifPlayback,
|
|
}) => {
|
|
const normalizedText = trimLeadingWhitespace(text);
|
|
const send =
|
|
resolveOutboundSendDep<typeof import("./send.js").sendMessageWhatsApp>(deps, "whatsapp") ??
|
|
(await import("./send.js")).sendMessageWhatsApp;
|
|
return await send(to, normalizedText, {
|
|
verbose: false,
|
|
cfg,
|
|
mediaUrl,
|
|
mediaLocalRoots,
|
|
accountId: accountId ?? undefined,
|
|
gifPlayback,
|
|
});
|
|
},
|
|
sendPoll: async ({ cfg, to, poll, accountId }) =>
|
|
await sendPollWhatsApp(to, poll, {
|
|
verbose: shouldLogVerbose(),
|
|
accountId: accountId ?? undefined,
|
|
cfg,
|
|
}),
|
|
}),
|
|
};
|