import { Router } from "express"; import { confirmTelegramFromBot } from "../services/auth.service.js"; const router = Router(); const BOT_TOKEN = process.env.TELEGRAM_BOT_TOKEN; const WEBHOOK_SECRET = process.env.TELEGRAM_WEBHOOK_SECRET; async function tgSendMessage(chatId, text) { if (!BOT_TOKEN) return; try { await fetch(`https://api.telegram.org/bot${BOT_TOKEN}/sendMessage`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ chat_id: chatId, text, parse_mode: "HTML" }), }); } catch (err) { console.error("[tg] sendMessage failed", err.message); } } router.post("/webhook", async (req, res) => { // Telegram добавит заголовок если мы установили secret_token при setWebhook if (WEBHOOK_SECRET) { const got = req.get("x-telegram-bot-api-secret-token"); if (got !== WEBHOOK_SECRET) { console.warn("[tg] webhook: bad secret token"); return res.status(401).json({ ok: false }); } } // Всегда отвечаем 200 — иначе Telegram будет ретраить res.json({ ok: true }); try { const update = req.body || {}; const msg = update.message; if (!msg || !msg.text || !msg.from || !msg.chat) return; const text = String(msg.text).trim(); const m = text.match(/^\/start\s+(\S+)/); if (!m) { // /start без параметра или другая команда — приветствие if (text === "/start" || text === "/help") { await tgSendMessage(msg.chat.id, "Привет! Это бот авторизации One Click.\n\nЧтобы войти на сайт, нажмите кнопку «Войти через Telegram» на сайте — она пришлёт вам сюда специальную ссылку."); } return; } const token = m[1]; const result = await confirmTelegramFromBot({ token, telegramUser: msg.from }); await tgSendMessage(msg.chat.id, result.message || (result.ok ? "Готово!" : "Не получилось войти.")); } catch (err) { console.error("[tg] webhook handler error:", err); } }); export default router;