50 lines
1.3 KiB
TypeScript
50 lines
1.3 KiB
TypeScript
import { splitMediaFromOutput } from "../../media/parse.js";
|
|
import { parseInlineDirectives } from "../../utils/directive-tags.js";
|
|
import { isSilentReplyText, SILENT_REPLY_TOKEN } from "../tokens.js";
|
|
|
|
export type ReplyDirectiveParseResult = {
|
|
text: string;
|
|
mediaUrls?: string[];
|
|
mediaUrl?: string;
|
|
replyToId?: string;
|
|
replyToCurrent: boolean;
|
|
replyToTag: boolean;
|
|
audioAsVoice?: boolean;
|
|
isSilent: boolean;
|
|
};
|
|
|
|
export function parseReplyDirectives(
|
|
raw: string,
|
|
options: { currentMessageId?: string; silentToken?: string } = {},
|
|
): ReplyDirectiveParseResult {
|
|
const split = splitMediaFromOutput(raw);
|
|
let text = split.text ?? "";
|
|
|
|
const replyParsed = parseInlineDirectives(text, {
|
|
currentMessageId: options.currentMessageId,
|
|
stripAudioTag: false,
|
|
stripReplyTags: true,
|
|
});
|
|
|
|
if (replyParsed.hasReplyTag) {
|
|
text = replyParsed.text;
|
|
}
|
|
|
|
const silentToken = options.silentToken ?? SILENT_REPLY_TOKEN;
|
|
const isSilent = isSilentReplyText(text, silentToken);
|
|
if (isSilent) {
|
|
text = "";
|
|
}
|
|
|
|
return {
|
|
text,
|
|
mediaUrls: split.mediaUrls,
|
|
mediaUrl: split.mediaUrl,
|
|
replyToId: replyParsed.replyToId,
|
|
replyToCurrent: replyParsed.replyToCurrent,
|
|
replyToTag: replyParsed.hasReplyTag,
|
|
audioAsVoice: split.audioAsVoice,
|
|
isSilent,
|
|
};
|
|
}
|