From a3d2beb54a6327bcb16b9b57ad3efd25e72f17d9 Mon Sep 17 00:00:00 2001 From: OpenClaw Assistant Date: Tue, 3 Mar 2026 00:04:55 +0300 Subject: [PATCH] fix(paradizweb): send telegram booking leads after contact capture --- .../paradiz-web/paradiz-web-agent-server.mjs | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/integrations/paradiz-web/paradiz-web-agent-server.mjs b/integrations/paradiz-web/paradiz-web-agent-server.mjs index c1bd79f..1ee64ae 100644 --- a/integrations/paradiz-web/paradiz-web-agent-server.mjs +++ b/integrations/paradiz-web/paradiz-web-agent-server.mjs @@ -4,6 +4,7 @@ import { execFile } from 'node:child_process'; import { readFileSync, existsSync } from 'node:fs'; const HUMAN_RE = /(жив[а-яёa-z]*\s*(человек|менеджер|оператор)|менеджер|оператор|свяж(ите|ись)|перезвон|позвон)/i; +const BOOK_RE = /(бро(нь|нировать|нирую|нирование)|забронировать|оформ(ить|ляю)\s*бронь)/i; const PHONE_RE = /\+?\d[\d\s()\-]{8,}\d/; const EMAIL_RE = /[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/i; @@ -74,6 +75,8 @@ function json(res, code, payload) { const OPENCLAW_BIN = env.OPENCLAW_BIN || '/home/openclaw/.npm-global/bin/openclaw'; const pendingHumanByClient = new Map(); +const pendingBookingByClient = new Map(); +const bookingLeadSentByClient = new Map(); const aiDisclosedByClient = new Map(); function hasContactInfo(text) { @@ -107,6 +110,25 @@ async function sendTelegramHumanLead(userText) { return res.ok; } +async function sendTelegramBookingLead(userText) { + if (!TG_BOT || !TG_CHAT) return false; + const phone = (String(userText).match(PHONE_RE) || [])[0] || '-'; + const email = (String(userText).match(EMAIL_RE) || [])[0] || '-'; + const text = [ + '📌 Новая заявка на бронь (сайт)', + `Телефон: ${phone}`, + `E-mail: ${email}`, + `Сообщение: ${String(userText).slice(0, 700)}` + ].join('\n'); + const body = new URLSearchParams({ chat_id: String(TG_CHAT), text, disable_web_page_preview: 'true' }).toString(); + const res = await fetch(`https://api.telegram.org/bot${TG_BOT}/sendMessage`, { + method: 'POST', + headers: { 'content-type': 'application/x-www-form-urlencoded' }, + body + }); + return res.ok; +} + function runAgent(userText) { return new Promise((resolve, reject) => { const guardrail = [ @@ -186,6 +208,19 @@ const server = http.createServer(async (req, res) => { }); } + if (BOOK_RE.test(question)) { + const hasContact = hasContactInfo(question); + if (!hasContact) { + if (clientId) pendingBookingByClient.set(clientId, true); + } else if (!clientId || !bookingLeadSentByClient.get(clientId)) { + await sendTelegramBookingLead(question).catch(() => {}); + if (clientId) { + bookingLeadSentByClient.set(clientId, true); + pendingBookingByClient.delete(clientId); + } + } + } + if (clientId && pendingHumanByClient.get(clientId) && hasContactInfo(question)) { await sendTelegramHumanLead(question).catch(() => {}); pendingHumanByClient.delete(clientId); @@ -195,6 +230,12 @@ const server = http.createServer(async (req, res) => { }); } + if (clientId && pendingBookingByClient.get(clientId) && hasContactInfo(question) && !bookingLeadSentByClient.get(clientId)) { + await sendTelegramBookingLead(question).catch(() => {}); + pendingBookingByClient.delete(clientId); + bookingLeadSentByClient.set(clientId, true); + } + if (isExternalActionRequest(question)) { return json(res, 200, { ok: true,