1 Commits

Author SHA1 Message Date
bc87681085 fix(redstone): use plain reply in non-private chats (TEXTDRAFT_PEER_INVALID)
sendMessageDraft (Bot API 9.5) only works in private chats. Group,
supergroup and channel peers reject it with TEXTDRAFT_PEER_INVALID,
so Redstone was silently failing the entire reply path in groups
after the streaming feature landed in cab5337.

Keep replyWithStream for private chats (the typing animation is
the whole point); fall back to plain ctx.reply() everywhere else.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-13 22:59:09 +02:00

View File

@@ -1460,10 +1460,19 @@ bot.on("message:text", async (ctx) => {
// Stream the reply word-by-word so the message animates into the chat like // Stream the reply word-by-word so the message animates into the chat like
// an LLM typing. @grammyjs/stream uses sendMessageDraft (Bot API 9.5) to push // an LLM typing. @grammyjs/stream uses sendMessageDraft (Bot API 9.5) to push
// each delta as a native, animated draft and finalizes with sendMessage. // each delta as a native, animated draft and finalizes with sendMessage.
// sendMessageDraft is only supported in private chats — group / supergroup
// / channel peers return TEXTDRAFT_PEER_INVALID. Use plain reply there.
let finalMessage: { message_id: number } | undefined;
if (chatType === "private") {
const messages = await ctx.replyWithStream(streamWords(out), {}, { const messages = await ctx.replyWithStream(streamWords(out), {}, {
reply_parameters: { message_id: ctx.message.message_id }, reply_parameters: { message_id: ctx.message.message_id },
}); });
const finalMessage = messages[messages.length - 1]; finalMessage = messages[messages.length - 1];
} else {
finalMessage = await ctx.reply(out, {
reply_parameters: { message_id: ctx.message.message_id },
});
}
if (finalMessage) { if (finalMessage) {
Q.insMsg.run(chatId, finalMessage.message_id, null, "out", "text", out, ctx.message.message_id); Q.insMsg.run(chatId, finalMessage.message_id, null, "out", "text", out, ctx.message.message_id);
} }