From 5bc25e0c9554624916d434faed8dfdccb73c30ea Mon Sep 17 00:00:00 2001 From: whekin Date: Wed, 11 Mar 2026 04:11:34 +0400 Subject: [PATCH] feat(bot): use typing indicator for dm assistant --- apps/bot/src/dm-assistant.test.ts | 12 ++----- apps/bot/src/dm-assistant.ts | 57 ++----------------------------- apps/bot/src/i18n/locales/en.ts | 1 - apps/bot/src/i18n/locales/ru.ts | 1 - apps/bot/src/i18n/types.ts | 1 - 5 files changed, 4 insertions(+), 68 deletions(-) diff --git a/apps/bot/src/dm-assistant.test.ts b/apps/bot/src/dm-assistant.test.ts index 5c8128f..541cea8 100644 --- a/apps/bot/src/dm-assistant.test.ts +++ b/apps/bot/src/dm-assistant.test.ts @@ -397,7 +397,7 @@ describe('registerDmAssistant', () => { await bot.handleUpdate(privateMessageUpdate('How much do I still owe this month?') as never) - expect(calls).toHaveLength(3) + expect(calls).toHaveLength(2) expect(calls[0]).toMatchObject({ method: 'sendChatAction', payload: { @@ -409,14 +409,6 @@ describe('registerDmAssistant', () => { method: 'sendMessage', payload: { chat_id: 123456, - text: 'Working on it...' - } - }) - expect(calls[2]).toMatchObject({ - method: 'editMessageText', - payload: { - chat_id: 123456, - message_id: 2, text: 'You still owe 350.00 GEL this cycle.' } }) @@ -555,7 +547,7 @@ describe('registerDmAssistant', () => { await bot.handleUpdate(update as never) await bot.handleUpdate(update as never) - expect(calls).toHaveLength(3) + expect(calls).toHaveLength(2) expect(usageTracker.listHouseholdUsage('household-1')).toEqual([ { householdId: 'household-1', diff --git a/apps/bot/src/dm-assistant.ts b/apps/bot/src/dm-assistant.ts index e9223dd..fe9d238 100644 --- a/apps/bot/src/dm-assistant.ts +++ b/apps/bot/src/dm-assistant.ts @@ -257,57 +257,6 @@ function paymentProposalReplyMarkup(locale: BotLocale, proposalId: string) { } } -interface PendingAssistantReply { - chatId: number - messageId: number -} - -async function sendAssistantProcessingReply( - ctx: Context, - text: string -): Promise { - const message = await ctx.reply(text) - - if (!message?.chat?.id || typeof message.message_id !== 'number') { - return null - } - - return { - chatId: message.chat.id, - messageId: message.message_id - } -} - -async function finalizeAssistantReply( - ctx: Context, - pendingReply: PendingAssistantReply | null, - text: string, - replyMarkup?: { - inline_keyboard: Array< - Array<{ - text: string - callback_data: string - }> - > - } -): Promise { - if (!pendingReply) { - await ctx.reply(text, replyMarkup ? { reply_markup: replyMarkup } : undefined) - return - } - - try { - await ctx.api.editMessageText( - pendingReply.chatId, - pendingReply.messageId, - text, - replyMarkup ? { reply_markup: replyMarkup } : {} - ) - } catch { - await ctx.reply(text, replyMarkup ? { reply_markup: replyMarkup } : undefined) - } -} - function parsePaymentProposalPayload( payload: Record ): PaymentProposalPayload | null { @@ -768,7 +717,6 @@ export function registerDmAssistant(options: { const memory = options.memoryStore.get(telegramUserId) const typingIndicator = startTypingIndicator(ctx) - let pendingReply: PendingAssistantReply | null = null const assistantStartedAt = Date.now() let stage: 'household_context' | 'assistant_response' = 'household_context' let contextBuildMs: number | null = null @@ -785,7 +733,6 @@ export function registerDmAssistant(options: { financeService }) contextBuildMs = Date.now() - contextStartedAt - pendingReply = await sendAssistantProcessingReply(ctx, t.processing) stage = 'assistant_response' const assistantResponseStartedAt = Date.now() const reply = await options.assistant.respond({ @@ -830,7 +777,7 @@ export function registerDmAssistant(options: { 'DM assistant reply generated' ) - await finalizeAssistantReply(ctx, pendingReply, reply.text) + await ctx.reply(reply.text) } catch (error) { options.logger?.error( { @@ -846,7 +793,7 @@ export function registerDmAssistant(options: { }, 'DM assistant reply failed' ) - await finalizeAssistantReply(ctx, pendingReply, t.unavailable) + await ctx.reply(t.unavailable) } finally { typingIndicator.stop() } diff --git a/apps/bot/src/i18n/locales/en.ts b/apps/bot/src/i18n/locales/en.ts index 2757a30..f455621 100644 --- a/apps/bot/src/i18n/locales/en.ts +++ b/apps/bot/src/i18n/locales/en.ts @@ -114,7 +114,6 @@ export const enBotTranslations: BotTranslationCatalog = { }, assistant: { unavailable: 'The assistant is temporarily unavailable. Try again in a moment.', - processing: 'Working on it...', noHousehold: 'I can help after your Telegram account is linked to a household. Open the household group and complete the join flow first.', multipleHouseholds: diff --git a/apps/bot/src/i18n/locales/ru.ts b/apps/bot/src/i18n/locales/ru.ts index 0626702..6f620b2 100644 --- a/apps/bot/src/i18n/locales/ru.ts +++ b/apps/bot/src/i18n/locales/ru.ts @@ -117,7 +117,6 @@ export const ruBotTranslations: BotTranslationCatalog = { }, assistant: { unavailable: 'Ассистент сейчас недоступен. Попробуйте ещё раз чуть позже.', - processing: 'Сейчас разберусь...', noHousehold: 'Я смогу помочь после того, как ваш Telegram-профиль будет привязан к дому. Сначала откройте группу дома и завершите вступление.', multipleHouseholds: diff --git a/apps/bot/src/i18n/types.ts b/apps/bot/src/i18n/types.ts index 743b8a6..8c4039d 100644 --- a/apps/bot/src/i18n/types.ts +++ b/apps/bot/src/i18n/types.ts @@ -122,7 +122,6 @@ export interface BotTranslationCatalog { } assistant: { unavailable: string - processing: string noHousehold: string multipleHouseholds: string rateLimited: (retryDelay: string) => string