Files
app_umbrix/app/api/telegram-webhook/route.ts

190 lines
5.8 KiB
TypeScript
Raw Normal View History

// Telegram Bot Webhook Handler
// POST /api/telegram-webhook
// Принимает вебхуки от Telegram и обрабатывает команды
import { NextRequest, NextResponse } from 'next/server';
import { logger } from '@/lib/logger';
const BOT_TOKEN = process.env.TELEGRAM_BOT_TOKEN || '';
const WEBAPP_URL = process.env.NEXT_PUBLIC_APP_URL || 'https://app.umbrix.net';
interface TelegramUpdate {
message?: {
message_id: number;
from: {
id: number;
first_name: string;
last_name?: string;
username?: string;
};
chat: {
id: number;
};
text?: string;
};
}
interface InlineKeyboardButton {
text: string;
web_app?: { url: string };
url?: string;
}
async function sendMessage(
chatId: number,
text: string,
replyMarkup?: { inline_keyboard: InlineKeyboardButton[][] }
) {
const url = `https://api.telegram.org/bot${BOT_TOKEN}/sendMessage`;
const body = {
chat_id: chatId,
text: text,
parse_mode: 'HTML',
reply_markup: replyMarkup,
};
try {
const response = await fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(body),
});
if (!response.ok) {
logger.error('Telegram API error:', await response.text());
}
} catch (error) {
logger.error('Failed to send Telegram message:', error);
}
}
export async function POST(request: NextRequest) {
try {
const update: TelegramUpdate = await request.json();
logger.debug('📨 Telegram webhook received:', update);
if (!update.message || !update.message.text) {
return NextResponse.json({ ok: true });
}
const { message } = update;
const { chat, from } = message;
const text = message.text!;
// Обработка команды /start
if (text.startsWith('/start')) {
const parts = text.split(' ');
const startParam = parts[1]; // Например: "ref_john_doe"
let webAppUrl = WEBAPP_URL;
let welcomeText = `👋 Привет, ${from.first_name}!\n\n`;
// Если есть реферальный параметр
if (startParam && startParam.startsWith('ref_')) {
const referrerId = startParam.replace('ref_', '');
webAppUrl = `${WEBAPP_URL}?ref=${encodeURIComponent(referrerId)}`;
welcomeText += `🎁 Вы перешли по реферальной ссылке от <b>${referrerId}</b>!\n\n`;
welcomeText += `При регистрации вы получите:\n`;
welcomeText += `✅ <b>7 дней бесплатно</b>\n`;
welcomeText += `А ваш друг получит <b>+7 дней</b> к подписке!\n\n`;
logger.info(`🎁 Referral link opened: ${from.id} -> ${referrerId}`);
} else {
welcomeText += `🚀 <b>Umbrix VPN</b> - быстрый и безопасный VPN!\n\n`;
welcomeText += `✅ Надежная защита данных\n`;
welcomeText += `✅ Высокая скорость соединения\n`;
welcomeText += `✅ Простая настройка\n\n`;
}
welcomeText += `Нажмите кнопку ниже, чтобы начать:`;
const keyboard = {
inline_keyboard: [
[
{
text: '🚀 Открыть Umbrix',
web_app: { url: webAppUrl },
},
],
],
};
await sendMessage(chat.id, welcomeText, keyboard);
return NextResponse.json({ ok: true });
}
// Обработка других команд
if (text === '/help') {
const helpText = `
<b>Доступные команды:</b>
/start - Открыть приложение
/help - Показать эту справку
/referral - Получить свою реферальную ссылку
<b>Как получить реферальную ссылку?</b>
1. Откройте приложение
2. Перейдите в раздел "Реферальная программа"
3. Скопируйте ссылку и отправьте друзьям!
<b>Условия реферальной программы:</b>
За каждого друга: <b>+7 дней</b> бесплатно
За 5 друзей: <b>1 месяц в подарок</b>
При оплате: <b>10% скидка</b>
`;
await sendMessage(chat.id, helpText.trim());
return NextResponse.json({ ok: true });
}
if (text === '/referral') {
const referralText = `
🎁 <b>Ваша реферальная ссылка:</b>
Чтобы получить ссылку, откройте приложение и перейдите в раздел "Пригласить друга".
Там вы найдете свою уникальную ссылку и сможете поделиться ей!
`;
const keyboard = {
inline_keyboard: [
[
{
text: '🚀 Открыть приложение',
web_app: { url: WEBAPP_URL },
},
],
],
};
await sendMessage(chat.id, referralText.trim(), keyboard);
return NextResponse.json({ ok: true });
}
// Неизвестная команда
await sendMessage(
chat.id,
'Неизвестная команда. Используйте /help для списка команд.'
);
return NextResponse.json({ ok: true });
} catch (error) {
logger.error('❌ Telegram webhook error:', error);
return NextResponse.json(
{ ok: false, error: 'Internal server error' },
{ status: 500 }
);
}
}
// Для проверки что webhook работает
export async function GET() {
return NextResponse.json({
status: 'ok',
message: 'Telegram webhook endpoint is running'
});
}