diff --git a/bot.js b/bot.js index df02e8d..cd91cc0 100644 --- a/bot.js +++ b/bot.js @@ -319,8 +319,7 @@ bot.action(/{"type": "business_invite_(accept|refuse)"*/, commands.inviteAction) bot.command('report', commands.report) bot.hears('🎰 Слоты', commands.slotsMenu) - -bot.action(/slots(1000|5000|25000|50000|100000)/, commands.slotsRun) +// bot.action(/slots(1000|5000|25000|50000|100000)/, commands.slotsRun) bot.hears('Помощь', async (ctx) => { return await ctx.replyWithMarkdownV2(`• [Функционал](https://telegra.ph/CampFire-Bot-Info-09-25)\n• [Правила](https://telegra.ph/PRAVILA-BOTA-09-25)`, { @@ -1326,6 +1325,253 @@ bot.command('force_mat', async (ctx) => { }) /////////////////////////////////////Enterprise Update end////////////////////////////////////////////////// +/////////////////////////////////////Casino Update////////////////////////////////////////////////// +const spinSlots = async (ctx, bet, user) => { + const slotIcons = ['🔥', '⚡', '⭐', '💀']; // Иконки для слотов + const spinSpeed = 500; // Скорость анимации (мс) + const spinRounds = 8; // Количество вращений + + let slotMessage = await ctx.reply('🎰 Слот-машина крутится...'); + + // Генерация случайного отображения для анимации + const getRandomIcons = () => { + return `${slotIcons[Math.floor(Math.random() * slotIcons.length)]} | ${slotIcons[Math.floor(Math.random() * slotIcons.length)]} | ${slotIcons[Math.floor(Math.random() * slotIcons.length)]}`; + }; + + // Анимация вращения + for (let i = 0; i < spinRounds; i++) { + await new Promise((resolve) => setTimeout(resolve, spinSpeed)); + const uniqueTag = `[${Date.now()}]`; // Уникальный тег для предотвращения ошибок Telegram + await ctx.telegram.editMessageText(ctx.chat.id, slotMessage.message_id, null, `🎰 ${getRandomIcons()} ${uniqueTag}`); + } + + // Определяем результат игры + const winMultiplier = determineWin(); + const finalIcons = generateVisualResult(winMultiplier, slotIcons); + + // Вычисляем выигрыш/проигрыш + let resultMessage = `🎰 Итог:\n${finalIcons.join(' | ')}\n\n`; + if (winMultiplier > 0) { + const winnings = bet * winMultiplier; + user.money += winnings; + await user.save(); + resultMessage += `🎉 Вы выиграли ₽${spaces(winnings)}! Множитель: x${winMultiplier}`; + } else { + user.money -= bet; + await user.save(); + resultMessage += `💔 Вы проиграли ₽${spaces(bet)}. Попробуйте ещё раз!`; + } + + // Финальный результат + await ctx.telegram.editMessageText(ctx.chat.id, slotMessage.message_id, null, resultMessage); +}; + +// Функция для определения выигрыша +const determineWin = () => { + const probabilities = { + 25: 0.01, // 1% шанс на x25 + 10: 0.03, // 3% шанс на x10 + 5: 0.06, // 6% шанс на x5 + 2: 0.1, // 10% шанс на x2 + 0: 0.8, // 80% шанс на проигрыш + }; + + const random = Math.random(); + let cumulativeProbability = 0; + + for (const [multiplier, probability] of Object.entries(probabilities)) { + cumulativeProbability += probability; + if (random < cumulativeProbability) { + return parseInt(multiplier, 10); + } + } + return 0; // По умолчанию проигрыш +}; + +// Генерация визуального результата на основе выигрыша +const generateVisualResult = (multiplier, slotIcons) => { + if (multiplier === 25) return ['🔥', '🔥', '🔥']; + if (multiplier === 10) return ['⚡', '⚡', '⚡']; + if (multiplier === 5) return ['⭐', '⭐', '⭐']; + if (multiplier === 2) return ['💀', '💀', '💀']; + return [ + slotIcons[Math.floor(Math.random() * slotIcons.length)], + slotIcons[Math.floor(Math.random() * slotIcons.length)], + slotIcons[Math.floor(Math.random() * slotIcons.length)], + ]; // Проигрыш: случайные иконки +}; + +// Основная команда слотов +bot.action(/slots\d+/, async (ctx) => { + try { + const data = ctx.update.callback_query.data; + const bet = parseInt(data.replace('slots', ''), 10); + + const user = await UserModel.findByPk(ctx.from.id); + + // Проверка на текущую игру + if (user.isPlayingCasino) { + return ctx.answerCbQuery('⏳ Ваша ставка уже обрабатывается. Подождите!', { show_alert: true }); + } + + if (!user || user.money < bet) { + return ctx.answerCbQuery('💸 У вас недостаточно средств для ставки.', { show_alert: true }); + } + + const timer = user.slottime; + const cooldown = utils.setCooldown(user, 10, timer); + if (user.slottime > cooldown.currentTime) { + return ctx.answerCbQuery('📛 Слоты будут доступны через пару секунд.', { show_alert: true }); + } + + // Установить флаг игры + user.isPlayingCasino = true; + user.slottime = cooldown.endTime; + await user.save(); + + // Запуск игры + await spinSlots(ctx, bet, user); + + // Сброс флага игры + user.isPlayingCasino = false; + await user.save(); + } catch (error) { + console.error('Ошибка при игре в слоты:', error); + return ctx.reply('Произошла ошибка. Попробуйте снова.'); + } +}); + +// Функция для форматирования чисел +const spaces = (number) => { + return number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ' '); +}; + + +bot.hears('🎰 Рулетка', async (ctx) => { + const user = await UserModel.findByPk(ctx.from.id); + if (user.money <= 0) { + return await ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `У вас недостаточно средств для игры.`, { show_alert: true }); + } + + // Инициализация ставки через ctx.session + if (!ctx.session.betAmount) { + ctx.session.betAmount = 10000; // Начальная ставка + } + + // Вспомогательная функция для генерации случайного числа рулетки + const spinRoulette = () => { + // Все нечетные числа (красные) + const redNumbers = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35]; + // Все четные числа (черные) + const blackNumbers = [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36]; + + // Рулетка: делаем случайный выбор + const randomIndex = Math.floor(Math.random() * 37); // от 0 до 36 + return randomIndex; + }; + + // Кнопки для выбора ставки + const buttons = [ + [{ text: 'Красный', callback_data: 'red' }], + [{ text: 'Черный', callback_data: 'black' }], + [{ text: 'Выбрать номер', callback_data: 'choose_number' }], + [{ text: `Ставка: ₽${ctx.session.betAmount}`, callback_data: 'no_action' }], + [ + { text: '⬆️ Повысить ставку', callback_data: 'increase_bet' }, + { text: '⬇️ Понизить ставку', callback_data: 'decrease_bet' } + ] + ]; + + const message = `🎰 Добро пожаловать в рулетку!\nВыберите ставку: Красный, Черный или Номер (0-36).`; + + await ctx.reply(message, Markup.inlineKeyboard(buttons)); + + // Обработчик для изменения ставки + bot.action('increase_bet', async (ctx) => { + if (ctx.session.betAmount < 50000) { + ctx.session.betAmount += 10000; // Увеличиваем ставку на 10000 + const buttons = [ + [{ text: 'Красный', callback_data: 'red' }], + [{ text: 'Черный', callback_data: 'black' }], + [{ text: 'Выбрать номер', callback_data: 'choose_number' }], + [{ text: `Ставка: ₽${ctx.session.betAmount}`, callback_data: 'no_action' }], + [ + { text: '⬆️ Повысить ставку', callback_data: 'increase_bet' }, + { text: '⬇️ Понизить ставку', callback_data: 'decrease_bet' } + ] + ]; + await ctx.editMessageText(`🎰 Добро пожаловать в рулетку!\nВыберите ставку: Красный, Черный или Номер (0-36).`, Markup.inlineKeyboard(buttons)); + } else { + await ctx.reply('Максимальная ставка - ₽50000'); + } + }); + + bot.action('decrease_bet', async (ctx) => { + if (ctx.session.betAmount > 10000) { + ctx.session.betAmount -= 10000; // Уменьшаем ставку на 10000 + const buttons = [ + [{ text: 'Красный', callback_data: 'red' }], + [{ text: 'Черный', callback_data: 'black' }], + [{ text: 'Выбрать номер', callback_data: 'choose_number' }], + [{ text: `Ставка: ₽${ctx.session.betAmount}`, callback_data: 'no_action' }], + [ + { text: '⬆️ Повысить ставку', callback_data: 'increase_bet' }, + { text: '⬇️ Понизить ставку', callback_data: 'decrease_bet' } + ] + ]; + await ctx.editMessageText(`🎰 Добро пожаловать в рулетку!\nВыберите ставку: Красный, Черный или Номер (0-36).`, Markup.inlineKeyboard(buttons)); + } else { + await ctx.reply('Минимальная ставка - ₽10000'); + } + }); + + bot.action(['red', 'black', 'choose_number'], async (ctx) => { + const data = ctx.update.callback_query.data; + if (user.money < ctx.session.betAmount) { + return await ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `У вас недостаточно средств для этой ставки.`, { show_alert: true }); + } + + let winMultiplier = 0; + let betResult = ''; + const spinResult = spinRoulette(); + + if (data === 'red') { + if ([1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35].includes(spinResult)) { + winMultiplier = 2; + betResult = `Вы выиграли! 🎉 Красный! Множитель: 2x`; + } else { + betResult = `Вы проиграли. Черный номер. 😢`; + } + } else if (data === 'black') { + if ([0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36].includes(spinResult)) { + winMultiplier = 2; + betResult = `Вы выиграли! 🎉 Черный! Множитель: 2x`; + } else { + betResult = `Вы проиграли. Красный номер. 😢`; + } + } else if (data === 'choose_number') { + const number = Math.floor(Math.random() * 37); // Игрок выбирает случайное число + if (spinResult === number) { + winMultiplier = 35; // Огромный выигрыш для точного угадывания + betResult = `Вы угадали номер! 🎉 Номер ${number}! Множитель: 35x`; + } else { + betResult = `Вы не угадали номер. Выпал номер ${spinResult}. 😢`; + } + } + + // Считаем выигрыш + let prize = ctx.session.betAmount * winMultiplier; + user.money += prize - ctx.session.betAmount; // Вычитаем ставку, если выиграли + await user.save(); + + // Отправляем результат + return await ctx.telegram.answerCbQuery(ctx.callbackQuery.id, betResult, { show_alert: true }); + }); +}); + + +/////////////////////////////////////Casino Update end////////////////////////////////////////////////////// + /////////////////////////////////////Admin Commands////////////////////////////////////////////////// diff --git a/commands/bonus.js b/commands/bonus.js index 20310ee..584f9d7 100644 --- a/commands/bonus.js +++ b/commands/bonus.js @@ -19,6 +19,7 @@ module.exports = async (ctx) => { let world = await WorldModel.findByPk(1) let text = ``; let money = [100, 200, 300, 400, 500, 1000].random(); + money *= user.level if (user.level >= 5) { money += money; } diff --git a/commands/casino/casinoMenu.js b/commands/casino/casinoMenu.js index 04dfcbf..33ee682 100644 --- a/commands/casino/casinoMenu.js +++ b/commands/casino/casinoMenu.js @@ -6,6 +6,7 @@ module.exports = async (ctx) => { return await ctx.reply('🏯 Добро пожаловать в казино "杜明"\n', Markup .keyboard([ ['🎰 Слоты'], + ['🎰 Рулетка'], ['▶️ Меню'] ]) .resize() diff --git a/commands/jobs/work.js b/commands/jobs/work.js index fb5ab2c..14544d9 100644 --- a/commands/jobs/work.js +++ b/commands/jobs/work.js @@ -26,15 +26,15 @@ module.exports = async (ctx) => { switch (user.job) { case 1: if (user.jobcheck >= 4) { - let paydayfee = job.salary / 100 * world.transactionfee - let payday = job.salary - paydayfee + let paydayfee = job.salary * user.level / 100 * world.transactionfee + let payday = job.salary * user.level - paydayfee world.balance -= payday user.money += payday giveExp(user, jobExp) user.jobcheck = 0 user.save() world.save() - return ctx.reply(`👔 Вы отработали смену дворника. \n🧾 Расчетный лист: \n⏳ Отработано часов: 4/4 \n💸 Оклад: ₽${job.salary} \nℹ️ Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ₽${payday}`) + return ctx.reply(`👔 Вы отработали смену дворника. \n🧾 Расчетный лист: \n⏳ Отработано часов: 4/4 \n💸 Оклад: ₽${job.salary * user.level} \nℹ️ Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ₽${payday}`) } else { user.save() return ctx.reply(`👔 Вы подмели дворы. \n⏳ Отработано часов: ${user.jobcheck}/4`) @@ -42,15 +42,15 @@ module.exports = async (ctx) => { break; case 2: if (user.jobcheck >= 2) { - let paydayfee = job.salary / 100 * world.transactionfee - let payday = job.salary - paydayfee + let paydayfee = job.salary * user.level / 100 * world.transactionfee + let payday = job.salary * user.level - paydayfee world.balance -= payday user.money += payday giveExp(user, jobExp) user.jobcheck = 0 user.save() world.save() - return ctx.reply(`👔 Вы отработали смену промоутера. \n🧾 Расчетный лист: \n⏳ Отработано часов: 2/2 \n💸 Оклад: ₽${job.salary} \nℹ️ Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ₽${payday}`) + return ctx.reply(`👔 Вы отработали смену промоутера. \n🧾 Расчетный лист: \n⏳ Отработано часов: 2/2 \n💸 Оклад: ₽${job.salary * user.level} \nℹ️ Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ₽${payday}`) } else { user.save() return ctx.reply(`👔 Вы раздавали листовки целый час. \n⏳ Отработано часов: ${user.jobcheck}/2`) @@ -58,8 +58,8 @@ module.exports = async (ctx) => { break; case 3: if (user.jobcheck >= 4) { - let paydayfee = job.salary / 100 * world.transactionfee - let payday = job.salary - paydayfee + let paydayfee = job.salary * user.level / 100 * world.transactionfee + let payday = job.salary * user.level - paydayfee world.balance -= payday let tips = [50, 100, 200, 500, 1000].random() user.money += tips @@ -68,7 +68,7 @@ module.exports = async (ctx) => { user.jobcheck = 0 user.save() world.save() - return ctx.reply(`👔 Вы отработали смену официанта. \n🧾 Расчетный лист: \n⏳ Отработано часов: 4/4 \n💸 Оклад: ₽${job.salary} \nℹ️ Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ₽${payday} \n💰 Получено чаевых: ₽${tips}`) + return ctx.reply(`👔 Вы отработали смену официанта. \n🧾 Расчетный лист: \n⏳ Отработано часов: 4/4 \n💸 Оклад: ₽${job.salary * user.level} \nℹ️ Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ₽${payday} \n💰 Получено чаевых: ₽${tips}`) } else { let tips = [50, 100, 200, 500, 1000].random() user.money += tips @@ -78,8 +78,8 @@ module.exports = async (ctx) => { break; case 4: if (user.jobcheck >= 5) { - let paydayfee = job.salary / 100 * world.transactionfee - let payday = job.salary - paydayfee + let paydayfee = job.salary * user.level / 100 * world.transactionfee + let payday = job.salary * user.level - paydayfee world.balance -= payday let tips = [50, 100, 200, 300, 500, 1000, 2000].random() world.balance -= tips @@ -89,7 +89,7 @@ module.exports = async (ctx) => { user.jobcheck = 0 user.save() world.save() - return ctx.reply(`👔 Вы отработали смену бармена. \n🧾 Расчетный лист: \n⏳ Отработано часов: 5/5 \n💸 Оклад: ₽${job.salary} \nℹ️ Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ₽${payday} \n💰 Получено чаевых: ₽${tips}`) + return ctx.reply(`👔 Вы отработали смену бармена. \n🧾 Расчетный лист: \n⏳ Отработано часов: 5/5 \n💸 Оклад: ₽${job.salary * user.level} \nℹ️ Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ₽${payday} \n💰 Получено чаевых: ₽${tips}`) } else { let tips = [50, 100, 200, 300, 500, 1000, 2000].random() world.balance -= tips @@ -101,15 +101,15 @@ module.exports = async (ctx) => { break; case 5: if (user.jobcheck >= 5) { - let paydayfee = job.salary / 100 * world.transactionfee - let payday = job.salary - paydayfee + let paydayfee = job.salary * user.level / 100 * world.transactionfee + let payday = job.salary * user.level - paydayfee world.balance -= payday user.money += payday giveExp(user, jobExp) user.jobcheck = 0 user.save() world.save() - return ctx.reply(`👔 Вы отработали смену кассира. \n🧾 Расчетный лист: \n⏳ Отработано часов: 5/5 \n💸 Оклад: ₽${job.salary} \nℹ️ Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ₽${payday}`) + return ctx.reply(`👔 Вы отработали смену кассира. \n🧾 Расчетный лист: \n⏳ Отработано часов: 5/5 \n💸 Оклад: ₽${job.salary * user.level} \nℹ️ Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ₽${payday}`) } else { user.save() return ctx.reply(`👔 Вы целый час обслуживали покупателей и кричали: "Гаааляяя, отмена!". \n⏳ Отработано часов: ${user.jobcheck}/5`) @@ -117,8 +117,8 @@ module.exports = async (ctx) => { break; case 6: if (user.jobcheck >= 6) { - let paydayfee = job.salary / 100 * world.transactionfee - let payday = job.salary - paydayfee + let paydayfee = job.salary * user.level / 100 * world.transactionfee + let payday = job.salary * user.level - paydayfee let stealed = [{ name: "Помада", price: 200 @@ -167,7 +167,7 @@ module.exports = async (ctx) => { user.jobcheck = 0 user.save() world.save() - return ctx.reply(`👔 Вы отработали смену в Диких Ягодах. \n🧾 Расчетный лист: \n⏳ Отработано часов: 6/6 \n💸 Оклад: ₽${job.salary} \nℹ️ Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ₽${payday} \n💰 Вы украли и продали со склада: ${stealed.name} (₽${stealed.price})`) + return ctx.reply(`👔 Вы отработали смену в Диких Ягодах. \n🧾 Расчетный лист: \n⏳ Отработано часов: 6/6 \n💸 Оклад: ₽${job.salary * user.level} \nℹ️ Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ₽${payday} \n💰 Вы украли и продали со склада: ${stealed.name} (₽${stealed.price})`) } else { user.save() return ctx.reply(`👔 Вы целый час выдавали заказы в Диких Ягодах. \n⏳ Отработано часов: ${user.jobcheck}/6`) @@ -175,15 +175,15 @@ module.exports = async (ctx) => { break; case 7: if (user.jobcheck >= 6) { - let paydayfee = job.salary / 100 * world.transactionfee - let payday = job.salary - paydayfee + let paydayfee = job.salary * user.level / 100 * world.transactionfee + let payday = job.salary * user.level - paydayfee world.balance -= payday user.money += payday giveExp(user, jobExp) user.jobcheck = 0 user.save() world.save() - return ctx.reply(`👔 Вы отработали смену слесарем. \n🧾 Расчетный лист: \n⏳ Отработано часов: 6/6 \n💸 Оклад: ₽${job.salary} \nℹ️ Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ₽${payday}`) + return ctx.reply(`👔 Вы отработали смену слесарем. \n🧾 Расчетный лист: \n⏳ Отработано часов: 6/6 \n💸 Оклад: ₽${job.salary * user.level} \nℹ️ Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ₽${payday}`) } else { user.save() return ctx.reply(`👔 Вы целый час работали на заводе, вы молодец! \n⏳ Отработано часов: ${user.jobcheck}/6`) diff --git a/config/index.js b/config/index.js index 073e4ed..3dc1693 100644 --- a/config/index.js +++ b/config/index.js @@ -27,6 +27,19 @@ module.exports = { mainChat : -1001895132127, adminList : [275416286], promoTopicId: 1807, - expToUp : [0, 10, 20, 40, 60, 100, 250, 370, 450, 575, 666, 777, 860, 999, 1000, 1177, 1234, 1350, 1488, 1515, 1610], + expToUp: [ + 0, 10, 25, 50, 85, 130, 200, 300, 420, 560, 720, 910, 1130, 1380, 1670, 2000, + 2370, 2790, 3250, 3750, 4300, 4900, 5550, 6250, 7000, 7800, 8650, 9550, 10500, + 11500, 12550, 13650, 14800, 16000, 17350, 18750, 20200, 21700, 23250, 24850, + 26500, 28200, 29950, 31750, 33600, 35500, 37450, 39450, 41500, 43600, 45750, + 47950, 50200, 52500, 54850, 57250, 59700, 62200, 64750, 67350, 70000, 72700, + 75450, 78250, 81100, 84000, 86950, 89950, 93000, 96100, 99250, 102450, 105700, + 109000, 112350, 115750, 119200, 122700, 126250, 129850, 133500, 137200, 141000, + 144850, 148750, 152700, 156700, 160750, 164850, 169000, 173200, 177450, 181750, + 186100, 190500, 195000, 199550, 204150, 208800, 213500, 218250, 223050, 228000, + 233000, 238050, 243150, 248300, 253500, 258750, 264050, 269400, 274800, 280250, + 285750, 291300, 296900, 302550, 308250, 314000, 319800, 325650, 331550, 337500, + 343500, 349550, 355650, 361800, 368000 + ], topSym : ['🥇', '🥈', '🥉', '4️⃣', '5️⃣', '6️⃣', '7️⃣', '8️⃣', '9️⃣', '🔟', '🌫️', '🌫️', '🌫️', '🌫️', '🌫️'], } \ No newline at end of file diff --git a/models/user.model.js b/models/user.model.js index 21b6cdb..dd1a561 100644 --- a/models/user.model.js +++ b/models/user.model.js @@ -27,7 +27,8 @@ const User = sequelize.define('user', { worktime: {type: DataTypes.INTEGER, defaultValue: 0}, slottime: {type: DataTypes.INTEGER, defaultValue: 0}, shoprobcd: {type: DataTypes.INTEGER, defaultValue: 0}, - pocketstealcd: {type: DataTypes.INTEGER, defaultValue: 0} + pocketstealcd: {type: DataTypes.INTEGER, defaultValue: 0}, + isPlayingCasino: {type: DataTypes.BOOLEAN, defaultValue: false} }) module.exports = User;