From 5b2350dd5a6136e1218aebdf964aa3cb22c69ea8 Mon Sep 17 00:00:00 2001 From: rajchales-monito Date: Thu, 30 Jul 2026 11:39:47 +0200 Subject: [PATCH] Add Telegram reply button --- server.js | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/server.js b/server.js index 58cd1fe..84fe8a1 100644 --- a/server.js +++ b/server.js @@ -1169,7 +1169,10 @@ async function notifyTelegramVisitorMessage(conversation, messageId) { const sent = await telegramSendMessage(settings, { text: telegramVisitorMessageText(details.conversation, message, attachmentCount), replyMarkup: { - inline_keyboard: [[{ text: "Otevrit BO", url: `${PUBLIC_BASE_URL}/admin` }]] + inline_keyboard: [[ + { text: "Reply", callback_data: `reply:${conversation.public_id}` }, + { text: "Otevrit BO", url: `${PUBLIC_BASE_URL}/admin` } + ]] } }); const telegramMessageId = sent?.result?.message_id; @@ -1183,6 +1186,10 @@ async function notifyTelegramVisitorMessage(conversation, messageId) { } async function handleTelegramUpdate(update, settings) { + if (update?.callback_query) { + await handleTelegramCallback(update.callback_query, settings); + return; + } const message = update?.message; if (!message || !message.text || !message.reply_to_message) return; const chatId = String(message.chat?.id || ""); @@ -1212,6 +1219,28 @@ async function handleTelegramUpdate(update, settings) { await telegramSendMessage(settings, { chatId, text: "MaalFlows: odpoved odeslana zakaznikovi." }); } +async function handleTelegramCallback(callbackQuery, settings) { + const data = String(callbackQuery?.data || ""); + if (!data.startsWith("reply:")) return; + const chatId = String(callbackQuery.message?.chat?.id || ""); + if (String(settings.chatId) && chatId !== String(settings.chatId)) return; + const conversation = findConversation(data.slice("reply:".length)); + await telegramAnswerCallback(settings, callbackQuery.id, conversation ? "Napis odpoved." : "Konverzace nenalezena."); + if (!conversation) return; + const sent = await telegramSendMessage(settings, { + chatId, + text: "Napis odpoved pro zakaznika:", + replyMarkup: { force_reply: true, selective: true } + }); + const promptMessageId = sent?.result?.message_id; + if (!promptMessageId) return; + db.prepare(` + INSERT OR REPLACE INTO telegram_message_links + (site_id, conversation_id, telegram_chat_id, telegram_message_id, source_message_id) + VALUES (?, ?, ?, ?, ?) + `).run(conversation.site_id, conversation.id, chatId, promptMessageId, null); +} + async function telegramSendMessage(settings, options) { const token = settings.botToken; const chatId = options.chatId || settings.chatId; @@ -1232,6 +1261,23 @@ async function telegramSendMessage(settings, options) { return data; } +async function telegramAnswerCallback(settings, callbackQueryId, text) { + if (!callbackQueryId) return; + const response = await fetch(`https://api.telegram.org/bot${settings.botToken}/answerCallbackQuery`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + callback_query_id: callbackQueryId, + text + }) + }); + const data = await response.json().catch(() => ({})); + if (!response.ok || data.ok === false) { + throw new Error(data.description || `Telegram callback HTTP ${response.status}`); + } + return data; +} + async function telegramSetWebhook(settings) { const response = await fetch(`https://api.telegram.org/bot${settings.botToken}/setWebhook`, { method: "POST",