Files
openclaw/extensions/zalouser/src/message-sid.ts
2026-03-02 22:16:47 +00:00

81 lines
2.3 KiB
TypeScript

function toMessageSidPart(value?: string | number | null): string {
if (typeof value === "string") {
return value.trim();
}
if (typeof value === "number" && Number.isFinite(value)) {
return String(Math.trunc(value));
}
return "";
}
export function parseZalouserMessageSidFull(
value?: string | number | null,
): { msgId: string; cliMsgId: string } | null {
const raw = toMessageSidPart(value);
if (!raw) {
return null;
}
const [msgIdPart, cliMsgIdPart] = raw.split(":").map((entry) => entry.trim());
if (!msgIdPart || !cliMsgIdPart) {
return null;
}
return { msgId: msgIdPart, cliMsgId: cliMsgIdPart };
}
export function resolveZalouserReactionMessageIds(params: {
messageId?: string;
cliMsgId?: string;
currentMessageId?: string | number;
}): { msgId: string; cliMsgId: string } | null {
const explicitMessageId = toMessageSidPart(params.messageId);
const explicitCliMsgId = toMessageSidPart(params.cliMsgId);
if (explicitMessageId && explicitCliMsgId) {
return { msgId: explicitMessageId, cliMsgId: explicitCliMsgId };
}
const parsedFromCurrent = parseZalouserMessageSidFull(params.currentMessageId);
if (parsedFromCurrent) {
return parsedFromCurrent;
}
const currentRaw = toMessageSidPart(params.currentMessageId);
if (!currentRaw) {
return null;
}
if (explicitMessageId && !explicitCliMsgId) {
return { msgId: explicitMessageId, cliMsgId: currentRaw };
}
if (!explicitMessageId && explicitCliMsgId) {
return { msgId: currentRaw, cliMsgId: explicitCliMsgId };
}
return { msgId: currentRaw, cliMsgId: currentRaw };
}
export function formatZalouserMessageSidFull(params: {
msgId?: string | null;
cliMsgId?: string | null;
}): string | undefined {
const msgId = toMessageSidPart(params.msgId);
const cliMsgId = toMessageSidPart(params.cliMsgId);
if (!msgId && !cliMsgId) {
return undefined;
}
if (msgId && cliMsgId) {
return `${msgId}:${cliMsgId}`;
}
return msgId || cliMsgId || undefined;
}
export function resolveZalouserMessageSid(params: {
msgId?: string | null;
cliMsgId?: string | null;
fallback?: string | null;
}): string | undefined {
const msgId = toMessageSidPart(params.msgId);
const cliMsgId = toMessageSidPart(params.cliMsgId);
if (msgId || cliMsgId) {
return msgId || cliMsgId;
}
return toMessageSidPart(params.fallback) || undefined;
}