openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
117 lines (116 loc) • 4.42 kB
JavaScript
import { a as normalizeLowercaseStringOrEmpty } from "./string-coerce-mnp54Vah.js";
import "./string-coerce-runtime-CEGJWkQ_.js";
import { t as requireRuntimeConfig } from "./plugin-config-runtime-CpE6DYgJ.js";
import { i as resolveSignalAccount } from "./accounts-ms-4J9iY.js";
import { n as signalRpcRequest } from "./client-adapter-Bk8RFbS1.js";
import { t as resolveSignalRpcContext } from "./rpc-context-Bh6DQHqc.js";
//#region extensions/signal/src/send-reactions.ts
function normalizeSignalId(raw) {
const trimmed = raw.trim();
if (!trimmed) return "";
return trimmed.replace(/^signal:/i, "").trim();
}
function normalizeSignalUuid(raw) {
const trimmed = normalizeSignalId(raw);
if (!trimmed) return "";
if (normalizeLowercaseStringOrEmpty(trimmed).startsWith("uuid:")) return trimmed.slice(5).trim();
return trimmed;
}
function resolveTargetAuthorParams(params) {
const candidates = [
params.targetAuthor,
params.targetAuthorUuid,
params.fallback
];
for (const candidate of candidates) {
const raw = candidate?.trim();
if (!raw) continue;
const normalized = normalizeSignalUuid(raw);
if (normalized) return { targetAuthor: normalized };
}
return {};
}
async function sendReactionSignalCore(params) {
const cfg = requireRuntimeConfig(params.opts.cfg, "Signal reactions");
const apiMode = cfg.channels?.signal?.apiMode;
const accountInfo = resolveSignalAccount({
cfg,
accountId: params.opts.accountId
});
const { baseUrl, account } = resolveSignalRpcContext(params.opts, accountInfo);
const normalizedRecipient = normalizeSignalUuid(params.recipient);
const groupId = params.opts.groupId?.trim();
if (!normalizedRecipient && !groupId) throw new Error(params.errors.missingRecipient);
if (!Number.isFinite(params.targetTimestamp) || params.targetTimestamp <= 0) throw new Error(params.errors.invalidTargetTimestamp);
const normalizedEmoji = params.emoji?.trim();
if (!normalizedEmoji) throw new Error(params.errors.missingEmoji);
const targetAuthorParams = resolveTargetAuthorParams({
targetAuthor: params.opts.targetAuthor,
targetAuthorUuid: params.opts.targetAuthorUuid,
fallback: normalizedRecipient
});
if (groupId && !targetAuthorParams.targetAuthor) throw new Error(params.errors.missingTargetAuthor);
const requestParams = {
emoji: normalizedEmoji,
targetTimestamp: params.targetTimestamp,
...params.remove ? { remove: true } : {},
...targetAuthorParams
};
if (normalizedRecipient) requestParams.recipients = [normalizedRecipient];
if (groupId) requestParams.groupIds = [groupId];
if (account) requestParams.account = account;
return {
ok: true,
timestamp: (await signalRpcRequest("sendReaction", requestParams, {
baseUrl,
timeoutMs: params.opts.timeoutMs,
apiMode
}))?.timestamp
};
}
/**
* Send a Signal reaction to a message
* @param recipient - UUID or E.164 phone number of the message author
* @param targetTimestamp - Message ID (timestamp) to react to
* @param emoji - Emoji to react with
* @param opts - Optional account/connection overrides
*/
async function sendReactionSignal(recipient, targetTimestamp, emoji, opts) {
return await sendReactionSignalCore({
recipient,
targetTimestamp,
emoji,
remove: false,
opts,
errors: {
missingRecipient: "Recipient or groupId is required for Signal reaction",
invalidTargetTimestamp: "Valid targetTimestamp is required for Signal reaction",
missingEmoji: "Emoji is required for Signal reaction",
missingTargetAuthor: "targetAuthor is required for group reactions"
}
});
}
/**
* Remove a Signal reaction from a message
* @param recipient - UUID or E.164 phone number of the message author
* @param targetTimestamp - Message ID (timestamp) to remove reaction from
* @param emoji - Emoji to remove
* @param opts - Optional account/connection overrides
*/
async function removeReactionSignal(recipient, targetTimestamp, emoji, opts) {
return await sendReactionSignalCore({
recipient,
targetTimestamp,
emoji,
remove: true,
opts,
errors: {
missingRecipient: "Recipient or groupId is required for Signal reaction removal",
invalidTargetTimestamp: "Valid targetTimestamp is required for Signal reaction removal",
missingEmoji: "Emoji is required for Signal reaction removal",
missingTargetAuthor: "targetAuthor is required for group reaction removal"
}
});
}
//#endregion
export { sendReactionSignal as n, removeReactionSignal as t };