




















@@ -268,6 +268,16 @@ function isCaptionTooLong(err: unknown): boolean {
268268return CAPTION_TOO_LONG_RE.test(formatErrorMessage(err));
269269}
270270271+function resolveVoiceFallbackText(reply: ReplyPayload): string | undefined {
272+if (reply.text?.trim()) {
273+return reply.text;
274+}
275+if (reply.spokenText?.trim()) {
276+return reply.spokenText;
277+}
278+return undefined;
279+}
280+271281async function sendTelegramVoiceFallbackText(opts: {
272282bot: Bot;
273283chatId: string;
@@ -337,8 +347,9 @@ async function deliverMediaReply(params: {
337347replyToId?: number;
338348replyToMode: ReplyToMode;
339349progress: DeliveryProgress;
340-}): Promise<number | undefined> {
350+}): Promise<{ firstDeliveredMessageId?: number; visibleFallbackText?: string }> {
341351let firstDeliveredMessageId: number | undefined;
352+let visibleFallbackText: string | undefined;
342353let first = true;
343354let pendingFollowUpText: string | undefined;
344355for (const mediaUrl of params.mediaList) {
@@ -456,7 +467,7 @@ async function deliverMediaReply(params: {
456467await sendVoiceMedia(mediaParams, (err) => !isVoiceMessagesForbidden(err));
457468} catch (voiceErr) {
458469if (isVoiceMessagesForbidden(voiceErr)) {
459-const fallbackText = params.reply.text;
470+const fallbackText = resolveVoiceFallbackText(params.reply);
460471if (!fallbackText || !fallbackText.trim()) {
461472throw voiceErr;
462473}
@@ -487,6 +498,7 @@ async function deliverMediaReply(params: {
487498if (firstDeliveredMessageId == null) {
488499firstDeliveredMessageId = fallbackMessageId;
489500}
501+visibleFallbackText = fallbackText;
490502markReplyApplied(params.progress, voiceFallbackReplyTo);
491503markDelivered(params.progress);
492504continue;
@@ -499,7 +511,7 @@ async function deliverMediaReply(params: {
499511delete noCaptionParams.caption;
500512delete noCaptionParams.parse_mode;
501513await sendVoiceMedia(noCaptionParams);
502-const fallbackText = params.reply.text;
514+const fallbackText = resolveVoiceFallbackText(params.reply);
503515if (fallbackText?.trim()) {
504516await sendTelegramVoiceFallbackText({
505517bot: params.bot,
@@ -513,6 +525,7 @@ async function deliverMediaReply(params: {
513525silent: params.silent,
514526replyMarkup: params.replyMarkup,
515527});
528+visibleFallbackText = fallbackText;
516529}
517530markReplyApplied(params.progress, replyToMessageId);
518531continue;
@@ -566,7 +579,7 @@ async function deliverMediaReply(params: {
566579pendingFollowUpText = undefined;
567580}
568581}
569-return firstDeliveredMessageId;
582+return { firstDeliveredMessageId, visibleFallbackText };
570583}
571584572585async function maybePinFirstDeliveredMessage(params: {
@@ -784,6 +797,11 @@ export async function deliverReplies(params: {
784797}
785798786799const rawContent = resolvedReplyText;
800+const spokenHookContent =
801+!rawContent && reply.audioAsVoice === true && reply.spokenText?.trim()
802+ ? reply.spokenText
803+ : undefined;
804+const hookContent = spokenHookContent ?? rawContent;
787805const replyToId =
788806params.replyToMode === "off" ? undefined : resolveTelegramReplyId(reply.replyToId);
789807const replyQuote = resolveReplyQuoteForSend({
@@ -798,7 +816,7 @@ export async function deliverReplies(params: {
798816const hookResult = await hookRunner?.runMessageSending(
799817{
800818to: params.chatId,
801-content: rawContent,
819+content: hookContent,
802820 replyToId,
803821threadId: params.thread?.id,
804822metadata: {
@@ -816,12 +834,15 @@ export async function deliverReplies(params: {
816834if (hookResult?.cancel) {
817835continue;
818836}
819-if (typeof hookResult?.content === "string" && hookResult.content !== rawContent) {
820-reply = { ...reply, text: hookResult.content };
837+if (typeof hookResult?.content === "string" && hookResult.content !== hookContent) {
838+reply = spokenHookContent
839+ ? { ...reply, spokenText: hookResult.content }
840+ : { ...reply, text: hookResult.content };
821841}
822842}
823843824-const contentForSentHook = reply.text || "";
844+let contentForSentHook =
845+reply.text || (reply.audioAsVoice === true ? resolveVoiceFallbackText(reply) : "") || "";
825846826847try {
827848const deliveredCountBeforeReply = progress.deliveredCount;
@@ -853,7 +874,7 @@ export async function deliverReplies(params: {
853874 progress,
854875});
855876} else {
856-firstDeliveredMessageId = await deliverMediaReply({
877+const mediaDelivery = await deliverMediaReply({
857878 reply,
858879 mediaList,
859880bot: params.bot,
@@ -876,6 +897,10 @@ export async function deliverReplies(params: {
876897replyToMode: params.replyToMode,
877898 progress,
878899});
900+firstDeliveredMessageId = mediaDelivery.firstDeliveredMessageId;
901+if (mediaDelivery.visibleFallbackText) {
902+contentForSentHook = mediaDelivery.visibleFallbackText;
903+}
879904}
880905await maybePinFirstDeliveredMessage({
881906pin: reply.delivery?.pin,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。