diff --git a/bot/bot.ts b/bot/bot.ts index fccbca7..b43abeb 100644 --- a/bot/bot.ts +++ b/bot/bot.ts @@ -1460,10 +1460,19 @@ bot.on("message:text", async (ctx) => { // 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 // each delta as a native, animated draft and finalizes with sendMessage. - const messages = await ctx.replyWithStream(streamWords(out), {}, { - reply_parameters: { message_id: ctx.message.message_id }, - }); - const finalMessage = messages[messages.length - 1]; + // 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), {}, { + reply_parameters: { message_id: ctx.message.message_id }, + }); + finalMessage = messages[messages.length - 1]; + } else { + finalMessage = await ctx.reply(out, { + reply_parameters: { message_id: ctx.message.message_id }, + }); + } if (finalMessage) { Q.insMsg.run(chatId, finalMessage.message_id, null, "out", "text", out, ctx.message.message_id); }