diff --git a/src/bot/message-sender.js b/src/bot/message-sender.js index 1ad64ac0..b01f4954 100644 --- a/src/bot/message-sender.js +++ b/src/bot/message-sender.js @@ -46,58 +46,68 @@ export async function sendStreamingMessage(ctx, text, options = {}) { if (!text) return; const { - delay = 80, - minDelay = 40, - maxDelay = 150, - charMode = false // Set to true for character-by-character + delay = 50, + minDelay = 20, + maxDelay = 100, + charMode = false } = options; try { + logger.info('📡 Starting streaming for message of length:', text.length); + // Send initial placeholder message - const sentMsg = await ctx.reply('⌨️ Typing...', { parse_mode: 'Markdown' }); + const sentMsg = await ctx.reply('⌨️ ⌨️', { parse_mode: 'Markdown' }); + logger.info('📡 Initial message sent:', sentMsg.message_id); let sentText = ''; if (charMode) { // Character-by-character streaming const chars = text.split(''); + logger.info('📡 Character mode, total chars:', chars.length); for (const char of chars) { sentText += char; - // Edit the message in place - await ctx.api.editMessageText(sentText, { - message_id: sentMsg.message_id, - chat_id: sentMsg.chat.id, - parse_mode: 'Markdown' - }); + try { + await ctx.api.editMessageText(sentText, { + message_id: sentMsg.message_id, + chat_id: sentMsg.chat.id, + parse_mode: 'Markdown' + }); + } catch (editErr) { + logger.error('Edit error:', editErr.message); + } - // Random delay between min and max const delayMs = minDelay + Math.random() * (maxDelay - minDelay); await new Promise(resolve => setTimeout(resolve, delayMs)); } } else { // Word-by-word streaming const words = text.split(' '); + logger.info('📡 Word mode, total words:', words.length); for (let i = 0; i < words.length; i++) { sentText += (i > 0 ? ' ' : '') + words[i]; - // Edit the message in place - await ctx.api.editMessageText(sentText, { - message_id: sentMsg.message_id, - chat_id: sentMsg.chat.id, - parse_mode: 'Markdown' - }); + try { + await ctx.api.editMessageText(sentText, { + message_id: sentMsg.message_id, + chat_id: sentMsg.chat.id, + parse_mode: 'Markdown' + }); + } catch (editErr) { + logger.error('Edit error:', editErr.message); + } - // Variable delay based on word length - const wordDelay = Math.max(minDelay, Math.min(maxDelay, delay + words[i].length * 8)); + const wordDelay = Math.max(minDelay, Math.min(maxDelay, delay + words[i].length * 5)); await new Promise(resolve => setTimeout(resolve, wordDelay)); } } + + logger.info('📡 Streaming complete'); } catch (error) { logger.error('Streaming send failed:', error); - // Fallback to non-streaming await sendFormatted(ctx, text); } }