46 lines
1.6 KiB
TypeScript
46 lines
1.6 KiB
TypeScript
import type { MsgContext } from "../templating.js";
|
|
import { normalizeChatType } from "../../channels/chat-type.js";
|
|
import { listSenderLabelCandidates, resolveSenderLabel } from "../../channels/sender-label.js";
|
|
|
|
export function formatInboundBodyWithSenderMeta(params: { body: string; ctx: MsgContext }): string {
|
|
const body = params.body;
|
|
if (!body.trim()) return body;
|
|
const chatType = normalizeChatType(params.ctx.ChatType);
|
|
if (!chatType || chatType === "direct") return body;
|
|
if (hasSenderMetaLine(body, params.ctx)) return body;
|
|
|
|
const senderLabel = resolveSenderLabel({
|
|
name: params.ctx.SenderName,
|
|
username: params.ctx.SenderUsername,
|
|
tag: params.ctx.SenderTag,
|
|
e164: params.ctx.SenderE164,
|
|
id: params.ctx.SenderId,
|
|
});
|
|
if (!senderLabel) return body;
|
|
|
|
return `${body}\n[from: ${senderLabel}]`;
|
|
}
|
|
|
|
function hasSenderMetaLine(body: string, ctx: MsgContext): boolean {
|
|
if (/(^|\n)\[from:/i.test(body)) return true;
|
|
const candidates = listSenderLabelCandidates({
|
|
name: ctx.SenderName,
|
|
username: ctx.SenderUsername,
|
|
tag: ctx.SenderTag,
|
|
e164: ctx.SenderE164,
|
|
id: ctx.SenderId,
|
|
});
|
|
if (candidates.length === 0) return false;
|
|
return candidates.some((candidate) => {
|
|
const escaped = escapeRegExp(candidate);
|
|
// Envelope bodies look like "[Signal ...] Alice: hi".
|
|
// Treat the post-header sender prefix as already having sender metadata.
|
|
const pattern = new RegExp(`(^|\\n|\\]\\s*)${escaped}:\\s`, "i");
|
|
return pattern.test(body);
|
|
});
|
|
}
|
|
|
|
function escapeRegExp(value: string): string {
|
|
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
}
|