DoSoapCalc/backend/bot.js

91 lines
3.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// backend/bot.js
// ───────────────────────────────────────────────────────────────────────────────
// 1) Устанавливаем зависимости:
// npm install express body-parser node-telegram-bot-api
//
// 2) Запуск:
// node bot.js
// (или: npx nodemon bot.js — для auto-reload при изменениях)
// ───────────────────────────────────────────────────────────────────────────────
const express = require('express');
const bodyParser = require('body-parser');
const TelegramBot = require('node-telegram-bot-api');
const crypto = require('crypto');
// Загружаем переменные окружения
const config = require('./config/env');
// Импортируем маршруты API
const apiRoutes = require('./routes/api');
const app = express();
const HTTP_PORT = config.HTTP_PORT;
const BOT_TOKEN = config.BOT_TOKEN;
const WEBAPP_BASE_URL = config.WEBAPP_BASE_URL;
// 1) Запускаем бота (polling)
const bot = new TelegramBot(BOT_TOKEN, { polling: true });
// Сохраняем бота в app.locals для использования в роутах
app.locals.bot = bot;
// 3) Разрешаем CORS для фронтенда
app.use((req, res, next) => {
const origin = req.headers.origin;
if (config.CORS_ORIGINS.includes('*') || (origin && config.CORS_ORIGINS.includes(origin))) {
res.header('Access-Control-Allow-Origin', origin || '*');
}
res.header('Access-Control-Allow-Headers', 'Content-Type');
next();
});
// 4) JSON-парсер (не обязателен для multipart/form-data)
app.use(bodyParser.json());
// 5) Подключаем API маршруты
app.use('/api', apiRoutes);
// 6) Команда /menu — отправляем inline-кнопку с chat_id
bot.setMyCommands([
{ command: 'menu', description: 'Открыть калькулятор' },
]);
bot.onText(/\/menu/, (msg) => {
try {
const chatId = msg.chat.id;
// По умолчанию открываем калькулятор мыла
const url = `${WEBAPP_BASE_URL}/soap?chat_id=${chatId}`;
bot.sendMessage(
chatId,
'Нажмите кнопку ниже, чтобы открыть калькулятор:',
{
reply_markup: {
inline_keyboard: [
[
{
text: 'Открыть калькулятор мыла',
web_app: { url },
},
],
],
},
}
);
} catch (err) {
console.error('Ошибка в обработчике /menu:', err);
}
});
// 7) Ловим ошибки polling-а и логируем детали
bot.on('polling_error', (err) => {
console.error('Polling error:', err);
});
// 8) Запускаем Express-сервер на порту 3001
app.listen(HTTP_PORT, () => {
console.log(`Bot+API запущены, слушаем порт ${HTTP_PORT}`);
});