fix(paradizweb): send telegram booking leads after contact capture
This commit is contained in:
@@ -4,6 +4,7 @@ import { execFile } from 'node:child_process';
|
|||||||
import { readFileSync, existsSync } from 'node:fs';
|
import { readFileSync, existsSync } from 'node:fs';
|
||||||
|
|
||||||
const HUMAN_RE = /(жив[а-яёa-z]*\s*(человек|менеджер|оператор)|менеджер|оператор|свяж(ите|ись)|перезвон|позвон)/i;
|
const HUMAN_RE = /(жив[а-яёa-z]*\s*(человек|менеджер|оператор)|менеджер|оператор|свяж(ите|ись)|перезвон|позвон)/i;
|
||||||
|
const BOOK_RE = /(бро(нь|нировать|нирую|нирование)|забронировать|оформ(ить|ляю)\s*бронь)/i;
|
||||||
const PHONE_RE = /\+?\d[\d\s()\-]{8,}\d/;
|
const PHONE_RE = /\+?\d[\d\s()\-]{8,}\d/;
|
||||||
const EMAIL_RE = /[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/i;
|
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 OPENCLAW_BIN = env.OPENCLAW_BIN || '/home/openclaw/.npm-global/bin/openclaw';
|
||||||
const pendingHumanByClient = new Map();
|
const pendingHumanByClient = new Map();
|
||||||
|
const pendingBookingByClient = new Map();
|
||||||
|
const bookingLeadSentByClient = new Map();
|
||||||
const aiDisclosedByClient = new Map();
|
const aiDisclosedByClient = new Map();
|
||||||
|
|
||||||
function hasContactInfo(text) {
|
function hasContactInfo(text) {
|
||||||
@@ -107,6 +110,25 @@ async function sendTelegramHumanLead(userText) {
|
|||||||
return res.ok;
|
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) {
|
function runAgent(userText) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const guardrail = [
|
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)) {
|
if (clientId && pendingHumanByClient.get(clientId) && hasContactInfo(question)) {
|
||||||
await sendTelegramHumanLead(question).catch(() => {});
|
await sendTelegramHumanLead(question).catch(() => {});
|
||||||
pendingHumanByClient.delete(clientId);
|
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)) {
|
if (isExternalActionRequest(question)) {
|
||||||
return json(res, 200, {
|
return json(res, 200, {
|
||||||
ok: true,
|
ok: true,
|
||||||
|
|||||||
Reference in New Issue
Block a user