// ============================================== // TELEGRAM BOT // ============================================== const TelegramBot = require('node-telegram-bot-api'); const fs = require('fs'); // ======= 8560135367:AAFiwFmMlx1Co6cp98Olztt-XZI3ZplWfrs ======= // 1) На Replit краще зробити Environment Variable: TELEGRAM_TOKEN // 2) Якщо без Environment Variable, встави токен прямо в лапки замість 'ТУТ_ТОКЕН' const token = process.env.TELEGRAM_TOKEN || 'ТУТ_ТОКЕН'; const bot = new TelegramBot(token, { polling: true }); // ======= ЗБЕРІГАННЯ ГРАВЦІВ ======= let players = {}; const DATA_FILE = 'players.json'; // Завантажуємо гравців з файлу (якщо існує) if (fs.existsSync(DATA_FILE)) { const data = fs.readFileSync(DATA_FILE, 'utf-8'); players = JSON.parse(data); } // ======= МАШИНИ ======= const cars = [ { name: "🚗 Економ", base: 100, price: 5000 }, { name: "🚕 Стандарт", base: 200, price: 10000 }, { name: "🚙 Комфорт", base: 400, price: 20000 }, { name: "🚘 Бізнес", base: 800, price: 40000 }, { name: "🚖 VIP", base: 1500, price: 80000 }, { name: "🏎 Спорт", base: 3000, price: 160000 } ]; const MAX_LEVEL = 15; // ======= ФУНКЦІЇ ======= function getPlayer(id) { if (!players[id]) { players[id] = { money: 1000, lastCollect: Date.now(), cars: [{ id: 0, level: 1 }], boosts: { x2Until: 0 }, referrals: 0, invitedBy: null, cases: 0 }; } return players[id]; } function savePlayers() { fs.writeFileSync(DATA_FILE, JSON.stringify(players, null, 2)); } function calcIncome(p) { const hours = (Date.now() - p.lastCollect) / 3600000; let perHour = 0; p.cars.forEach(c => { perHour += (cars[c.id].base * c.level) / 24; }); let multi = Date.now() < p.boosts.x2Until ? 2 : 1; return Math.floor(perHour * hours * multi); } // ======= МЕНЮ ======= function mainMenu() { return { reply_markup: { keyboard: [ ["💰 Баланс", "🌾 Зібрати"], ["🚗 Гараж", "🛒 Магазин"], ["🎁 Кейси", "🎲 Рулетка"], ["🏆 Рейтинг"] ], resize_keyboard: true } }; } // ============================================== // ОБРОБКА КОМАНД // ============================================== // START bot.onText(/\/start(.*)/, (msg, match) => { const id = msg.chat.id; const ref = match[1]?.trim(); const p = getPlayer(id); if (!p.invitedBy && ref && ref != id) { p.invitedBy = ref; const r = getPlayer(ref); r.money += 500; r.referrals++; } bot.sendMessage(id, "🚖 Taxi Idle MAX!", mainMenu()); savePlayers(); }); // Баланс bot.onText(/💰 Баланс/, msg=>{ const p = getPlayer(msg.chat.id); bot.sendMessage(msg.chat.id, `💰 Ваш баланс: ${p.money}`); }); // Зібрати гроші bot.onText(/🌾 Зібрати/, msg=>{ const p = getPlayer(msg.chat.id); const income = calcIncome(p); p.money += income; p.lastCollect = Date.now(); bot.sendMessage(msg.chat.id, `✅ Ви зібрали: ${income}💰`); savePlayers(); }); // Гараж bot.onText(/🚗 Гараж/, msg=>{ const p = getPlayer(msg.chat.id); let text = "🚗 Ваші машини:\n\n"; p.cars.forEach((c,i)=>{ text += `${i+1}. ${cars[c.id].name} lvl ${c.level}\n`; }); bot.sendMessage(msg.chat.id, text); }); // Магазин bot.onText(/🛒 Магазин/, msg=>{ let text = "🛒 Магазин:\n"; cars.forEach((c,i)=>{ text += `${i}. ${c.name} ${c.price}💰\n`; }); text += "\nДля покупки введіть: купити номер_машини"; bot.sendMessage(msg.chat.id, text); }); // Купити машину bot.onText(/купити (\d+)/, (msg, match)=>{ const p = getPlayer(msg.chat.id); const id = Number(match[1]); const c = cars[id]; if (!c) return bot.sendMessage(msg.chat.id,"❌ Такої машини немає"); if (p.money >= c.price) { p.money -= c.price; p.cars.push({id:id, level:1}); bot.sendMessage(msg.chat.id,"✅ Куплено"); } else bot.sendMessage(msg.chat.id,"❌ Недостатньо грошей"); savePlayers(); }); // Кейси bot.onText(/🎁 Кейси/, msg=>{ const p = getPlayer(msg.chat.id); if (p.money < 1000) return bot.sendMessage(msg.chat.id,"❌ Потрібно мінімум 1000💰"); p.money -= 1000; const reward = Math.random(); if (reward < 0.6) { const money = Math.floor(Math.random()*2000)+500; p.money += money; bot.sendMessage(msg.chat.id, `💰 Ви виграли: ${money}`); } else if (reward < 0.9) { p.boosts.x2Until = Date.now()+3600000; bot.sendMessage(msg.chat.id,"⚡ Подвійний дохід 1 година!"); } else { p.money += 10000; bot.sendMessage(msg.chat.id,"💎 ДЖЕКПОТ +10000!"); } savePlayers(); }); // Рулетка bot.onText(/🎲 Рулетка/, msg=>{ const p = getPlayer(msg.chat.id); bot.sendMessage(msg.chat.id,"🎲 Ставка: введіть колір (червоне/чорне/зелене) та суму, наприклад: ставка червоне 100"); }); bot.onText(/ставка (червоне|чорне|зелене) (\d+)/, (msg, match)=>{ const p = getPlayer(msg.chat.id); const color = match[1]; const sum = Number(match[2]); if (sum > p.money) return bot.sendMessage(msg.chat.id,"❌ Недостатньо грошей"); p.money -= sum; const spin = Math.floor(Math.random()*37); // 0-36 let win = 0; if ((color==="червоне" && spin%2===1) || (color==="чорне" && spin%2===0 && spin!==0) || (color==="зелене" && spin===0)) { if (color==="червоне") win = sum*2; if (color==="чорне") win = sum*2; if (color==="зелене") win = sum*32; p.money += win; bot.sendMessage(msg.chat.id, `🎲 Випало ${spin}. Ви виграли ${win}💰`); } else { bot.sendMessage(msg.chat.id, `🎲 Випало ${spin}. Ви програли ${sum}💰`); } savePlayers(); }); // ТОП bot.onText(/🏆 Рейтинг/, msg=>{ let top = Object.entries(players).sort((a,b)=>b[1].money-a[1].money).slice(0,5); let text = "🏆 ТОП гравців:\n"; top.forEach((p,i)=>{ text += `${i+1}. ${p[1].money}💰\n`; }); bot.sendMessage(msg.chat.id,text); });