mirror of
https://github.com/AmanIbrash-brsh/finance-website.git
synced 2026-11-09 09:35:10 +00:00
добавил кнопки в тг бота
This commit is contained in:
+23
-4
@@ -86,7 +86,9 @@ export async function initBot() {
|
|||||||
`• Используй команду /stats для быстрой сводки расходов.\n` +
|
`• Используй команду /stats для быстрой сводки расходов.\n` +
|
||||||
`• Или открой полноценный Dashboard с графиками по кнопке ниже! 👇`,
|
`• Или открой полноценный Dashboard с графиками по кнопке ниже! 👇`,
|
||||||
Markup.keyboard([
|
Markup.keyboard([
|
||||||
[Markup.button.webApp('📊 Открыть Dashboard', webAppLink)]
|
['➕ Доход', '➖ Расход'],
|
||||||
|
['📊 Статистика', '🛒 Покупки'],
|
||||||
|
['📅 Подписки', Markup.button.webApp('📊 Открыть Dashboard', webAppLink)]
|
||||||
]).resize()
|
]).resize()
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
@@ -111,8 +113,7 @@ export async function initBot() {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
// /stats command - Show summary of expenses for current month
|
const statsHandler = async (ctx) => {
|
||||||
bot.command('stats', async (ctx) => {
|
|
||||||
const db = getDb();
|
const db = getDb();
|
||||||
const currentMonth = new Date().toISOString().slice(0, 7); // YYYY-MM
|
const currentMonth = new Date().toISOString().slice(0, 7); // YYYY-MM
|
||||||
|
|
||||||
@@ -159,7 +160,11 @@ export async function initBot() {
|
|||||||
await ctx.replyWithMarkdownV2(
|
await ctx.replyWithMarkdownV2(
|
||||||
message.replace(/\./g, '\\.').replace(/-/g, '\\-').replace(/\+/g, '\\+')
|
message.replace(/\./g, '\\.').replace(/-/g, '\\-').replace(/\+/g, '\\+')
|
||||||
);
|
);
|
||||||
});
|
};
|
||||||
|
|
||||||
|
// /stats command - Show summary of expenses for current month
|
||||||
|
bot.command('stats', statsHandler);
|
||||||
|
bot.hears('📊 Статистика', statsHandler);
|
||||||
|
|
||||||
// /buy command - Adds item to shopping list
|
// /buy command - Adds item to shopping list
|
||||||
bot.command('buy', async (ctx) => {
|
bot.command('buy', async (ctx) => {
|
||||||
@@ -229,6 +234,20 @@ export async function initBot() {
|
|||||||
const db = getDb();
|
const db = getDb();
|
||||||
const today = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
|
const today = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
|
||||||
|
|
||||||
|
// Handle interactive button text replies
|
||||||
|
if (text === '➕ Доход') {
|
||||||
|
return ctx.reply('Введите сумму и описание дохода, начиная с "+", например:\n\n`+ 15000 Зарплата`', { parse_mode: 'Markdown' });
|
||||||
|
}
|
||||||
|
if (text === '➖ Расход') {
|
||||||
|
return ctx.reply('Введите сумму и описание расхода, например:\n\n`450 Кофе и круассан`', { parse_mode: 'Markdown' });
|
||||||
|
}
|
||||||
|
if (text === '🛒 Покупки') {
|
||||||
|
return ctx.reply('Чтобы добавить покупку, используй команду /buy, например:\n\n`/buy Молоко 90`', { parse_mode: 'Markdown' });
|
||||||
|
}
|
||||||
|
if (text === '📅 Подписки') {
|
||||||
|
return ctx.reply('Чтобы добавить подписку, используй команду /sub, например:\n\n`/sub Netflix 800`', { parse_mode: 'Markdown' });
|
||||||
|
}
|
||||||
|
|
||||||
// 1. Check for Income (starts with '+' or '+ ')
|
// 1. Check for Income (starts with '+' or '+ ')
|
||||||
const incomeMatch = text.match(/^\+\s*(\d+(?:\.\d+)?)\s+(.+)$/);
|
const incomeMatch = text.match(/^\+\s*(\d+(?:\.\d+)?)\s+(.+)$/);
|
||||||
if (incomeMatch) {
|
if (incomeMatch) {
|
||||||
|
|||||||
@@ -0,0 +1,49 @@
|
|||||||
|
import { TelegramBot } from 'node-telegram-bot-api';
|
||||||
|
|
||||||
|
const token = '8434157336:AAHH9YoOvcJuG_PQR2h5RDKmri_nN9MezFc';
|
||||||
|
const bot = new TelegramBot(token, { polling: true });
|
||||||
|
|
||||||
|
bot.on('message', (msg) => {
|
||||||
|
try {
|
||||||
|
if (msg.text === '/start') {
|
||||||
|
const keyboard = [
|
||||||
|
[
|
||||||
|
{ text: 'Add Expense', callback_data: 'add_expense' }
|
||||||
|
]
|
||||||
|
];
|
||||||
|
const replyMarkup = { reply_markup: { inline_keyboard: keyboard } };
|
||||||
|
bot.sendMessage(msg.chat.id, 'Welcome to the finance bot!', replyMarkup);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
bot.sendMessage(msg.chat.id, 'An error occurred. Please try again later.');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
bot.on('callback_query', (callbackQuery) => {
|
||||||
|
try {
|
||||||
|
const chatId = callbackQuery.message.chat.id;
|
||||||
|
const messageId = callbackQuery.message.message_id;
|
||||||
|
const data = callbackQuery.data;
|
||||||
|
|
||||||
|
if (data === 'add_expense') {
|
||||||
|
try {
|
||||||
|
bot.sendMessage(chatId, 'Please enter the expense amount and description:');
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
bot.sendMessage(chatId, 'An error occurred. Please try again later.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
bot.sendMessage(callbackQuery.message.chat.id, 'An error occurred. Please try again later.');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
bot.on('error', (error) => {
|
||||||
|
console.error(error);
|
||||||
|
});
|
||||||
|
|
||||||
|
bot.on('polling_error', (error) => {
|
||||||
|
console.error(error);
|
||||||
|
});
|
||||||
+47
-50
@@ -1,50 +1,47 @@
|
|||||||
// Telegram WebApp SDK Wrapper
|
{
|
||||||
|
"// Telegram WebApp SDK Wrapper": "",
|
||||||
export const tg = window.Telegram?.WebApp || null;
|
"export const tg = window.Telegram?.WebApp || null;": "",
|
||||||
|
"export function initTelegram() {": "",
|
||||||
export function initTelegram() {
|
" if (tg) {": "",
|
||||||
if (tg) {
|
" tg.ready();": "",
|
||||||
tg.ready();
|
" tg.expand();": "",
|
||||||
tg.expand();
|
" console.log('Telegram WebApp SDK initialized');": "",
|
||||||
console.log('Telegram WebApp SDK initialized');
|
" } else {": "",
|
||||||
} else {
|
" console.warn('Telegram WebApp SDK not found. Running in browser mode.');": "",
|
||||||
console.warn('Telegram WebApp SDK not found. Running in browser mode.');
|
" }": "",
|
||||||
}
|
"}": "",
|
||||||
}
|
"export function getTelegramUser() {": "",
|
||||||
|
" return tg?.initDataUnsafe?.user || null;": "",
|
||||||
export function getTelegramUser() {
|
"}": "",
|
||||||
return tg?.initDataUnsafe?.user || null;
|
"export function getAuthHeaders() {": "",
|
||||||
}
|
" const headers = {};": "",
|
||||||
|
" if (tg && tg.initData) {": "",
|
||||||
export function getAuthHeaders() {
|
" headers['X-Telegram-Init-Data'] = tg.initData;": "",
|
||||||
const headers = {};
|
" }": "",
|
||||||
|
" // Also check if we have a token stored in localStorage (for desktop browser access)": "",
|
||||||
if (tg && tg.initData) {
|
" const token = localStorage.getItem('finance_auth_token');": "",
|
||||||
headers['X-Telegram-Init-Data'] = tg.initData;
|
" if (token) {": "",
|
||||||
}
|
" headers['Authorization'] = `Bearer ${token}`;": "",
|
||||||
|
" }": "",
|
||||||
// Also check if we have a token stored in localStorage (for desktop browser access)
|
" return headers;": "",
|
||||||
const token = localStorage.getItem('finance_auth_token');
|
"}": "",
|
||||||
if (token) {
|
"export function saveTokenFromUrl() {": "",
|
||||||
headers['Authorization'] = `Bearer ${token}`;
|
" const params = new URLSearchParams(window.location.search);": "",
|
||||||
}
|
" const token = params.get('token');": "",
|
||||||
|
" if (token) {": "",
|
||||||
return headers;
|
" localStorage.setItem('finance_auth_token', token);": "",
|
||||||
}
|
" // Clean up url": "",
|
||||||
|
" window.history.replaceState({}, document.title, window.location.pathname);": "",
|
||||||
export function saveTokenFromUrl() {
|
" return token;": "",
|
||||||
const params = new URLSearchParams(window.location.search);
|
" }": "",
|
||||||
const token = params.get('token');
|
" return localStorage.getItem('finance_auth_token');": "",
|
||||||
if (token) {
|
"}": "",
|
||||||
localStorage.setItem('finance_auth_token', token);
|
"export function logout() {": "",
|
||||||
// Clean up url
|
" localStorage.removeItem('finance_auth_token');": "",
|
||||||
window.history.replaceState({}, document.title, window.location.pathname);
|
" window.location.reload();": "",
|
||||||
return token;
|
"}": "",
|
||||||
}
|
"/**\n * Generates markup for a Telegram message with an 'Add Expense' button.\n */": "",
|
||||||
return localStorage.getItem('finance_auth_token');
|
"export function getExpenseButtonMarkup() {": "",
|
||||||
}
|
" return `\n <telegram>\n <message>\n Please enter the expense amount and description:\n <button data-action=\"add_expense\">Add Expense</button>\n </message>\n </telegram>\n`;": "",
|
||||||
|
"}": ""
|
||||||
export function logout() {
|
}
|
||||||
localStorage.removeItem('finance_auth_token');
|
|
||||||
window.location.reload();
|
|
||||||
}
|
|
||||||
Generated
+21
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"name": "Finance-bot",
|
||||||
|
"lockfileVersion": 3,
|
||||||
|
"requires": true,
|
||||||
|
"packages": {
|
||||||
|
"": {
|
||||||
|
"dependencies": {
|
||||||
|
"node-telegram-bot-api": "^1.2.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/node-telegram-bot-api": {
|
||||||
|
"version": "1.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/node-telegram-bot-api/-/node-telegram-bot-api-1.2.0.tgz",
|
||||||
|
"integrity": "sha512-M6S61LZn1FQMQnZSdFlc4oV+mwDGlPTbLzq/GUaSH4ew40wGTaKPtAaLp5oOhl/C3k0ylGqMIppJsVulwTCePg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"dependencies": {
|
||||||
|
"node-telegram-bot-api": "^1.2.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user