const { Telegraf, Scenes, Markup } = require('telegraf') const bot = new Telegraf(process.env.BOT_TOKEN) const { slots, phones, UserModel, WorldModel, SkillsModel, PropertyModel } = require('/workspace/degradin/Dev/Telegram/CampFire Play/config') const { spaces, getSlot, giveExp, rand, random, setCooldown } = require('/workspace/degradin/Dev/Telegram/CampFire Play/utils'); const shop = new Scenes.BaseScene('SHOP_ROBBERY'); bot.on('callback_query', (ctx) => { const buttonId = ctx.update.callback_query; console.log(buttonId) }); shop.enter(async (ctx) => { let user = await UserModel.findByPk(ctx.from.id) let property = await PropertyModel.findByPk(ctx.from.id); if(user.level < 8) return ctx.editMessageText('Доступно с 8 уровня!') if(property.weapon == 0) return ctx.editMessageText('Для данного задания нужен ствол.') let shoprobcd = user.shoprobcd let cooldown = setCooldown(user, 3600, shoprobcd) if (user.shoprobcd > cooldown.currentTime) return ctx.editMessageText(`📛 Данное действие будет доступно через ${cooldown.timeLeftInMinutes} мин.`); user.shoprobcd = cooldown.endTime user.save() ctx.editMessageText('Выберите режим', Markup.inlineKeyboard([ [ {text: 'SOLO', callback_data: `SHOP_SOLO`}, {text: 'DUO', callback_data: `SHOP_DUO`}, {text: 'GROUP', callback_data: `SHOP_GROUP`}, {text: 'ADMIN', callback_data: `SHOP_ADMIN`} ] ]).resize()) }); shop.action(`SHOP_DUO`, async (ctx) => { ctx.reply(`Еще не доступно.`) }); shop.action(`SHOP_GROUP`, async (ctx) => { ctx.reply(`Еще не доступно.`) }); shop.action(`DEBUG_PVE`, async (ctx) => { let user = await UserModel.findByPk(ctx.from.id) let skill = await SkillsModel.findByPk(ctx.from.id) ctx.session.enemy = { name: 'Полицейский', hp: 100, armor: 100 } return ctx.scene.enter('NEWPVE') }); shop.action(`SHOP_ADMIN`, async (ctx) => { let user = await UserModel.findByPk(ctx.from.id) if(user.status != 'admin') return ctx.editMessageText(`Написано же ADMIN блять.`) return ctx.editMessageText('Admin Panel', Markup.inlineKeyboard([ [{text: 'New PVE', callback_data: `DEBUG_PVE`}], [{text: 'Убить охранника [Владение оружием]', callback_data: `SHOP_GUARD_KILL`}] ])) }); shop.action(`SHOP_SOLO`, async (ctx) => { let property = await PropertyModel.findByPk(ctx.from.id); if(property.equipment != 0){ ctx.session.user = { hp: 100, armor: property.equipment.armor } }else{ ctx.session.user = { hp: 100, armor: 0 } } ctx.editMessageText('Стадии:', Markup.inlineKeyboard([ [ {text: 'Вход', callback_data: `SHOP_ENTER`}, //{text: 'Охранник [DEV]', callback_data: `SHOP_ENTER`}, //{text: 'Отчет', callback_data: `SHOP_CASH_BREAK_SUCCESS`} ] ])) }); shop.action(`SHOP_ENTER`, async (ctx) => { let skill = await SkillsModel.findByPk(ctx.from.id) let chance = rand(0, 100) chance += skill.stealing.level if(chance < 70) { return ctx.editMessageText('Вы заметили охранника, с ним нужно что-то сделать...', Markup.inlineKeyboard([ [{text: 'Избавиться от охранника [Скрытность]', callback_data: `SHOP_GUARD_STEALTH`}], [{text: 'Убить охранника [Владение оружием]', callback_data: `SHOP_GUARD_KILL`}] ])) } return ctx.editMessageText('Стадии:', Markup.inlineKeyboard([ [{text: 'Убить кассира и забрать все из кассы', callback_data: `SHOP_KILL_CASHIER`}], //[{text: 'Приказать кассиру сдать кассу [Угроза]', callback_data: `SHOP_THREAT`}], //[{text: 'Приказать кассиру сдать кассу [Убеждение]', callback_data: `SHOP_CONVICTION`}] ])) }); shop.action(`SHOP_GUARD`, async (ctx) => { let skill = await SkillsModel.findByPk(ctx.from.id) let chance = rand(0, 100) chance += skill.stealing.level return ctx.editMessageText('Стадии:', Markup.inlineKeyboard([ [{text: 'Избавиться от охранника [Скрытность]', callback_data: `SHOP_GUARD_STEALTH`}], [{text: 'Убить охранника [Владение оружием]', callback_data: `SHOP_GUARD_KILL`}] ])) }); shop.action(`SHOP_GUARD_STEALTH`, async (ctx) => { let skill = await SkillsModel.findByPk(ctx.from.id) let chance = rand(0, 100) chance += skill.stealing.level if(chance < 40) { ctx.session.stage = 'SHOP_GUARD_STEALTH' ctx.reply(`Нападение!`) ctx.session.enemy = { name: 'Охранник', hp: 100, armor: 20 } return ctx.scene.enter('PVE') } return ctx.editMessageText('Охранник обезврежен, вы подходите к кассиру:', Markup.inlineKeyboard([ [{text: 'Убить кассира и забрать все из кассы', callback_data: `SHOP_KILL_CASHIER`}], //[{text: 'Приказать кассиру сдать кассу [Угроза]', callback_data: `SHOP_THREAT`}], //[{text: 'Приказать кассиру сдать кассу [Убеждение]', callback_data: `SHOP_CONVICTION`}] ])) }); shop.action(`SHOP_GUARD_KILL`, async (ctx) => { let skill = await SkillsModel.findByPk(ctx.from.id) let chance = rand(0, 100) chance += skill.stealing.level if(chance > 10) { ctx.session.stage = 'SHOP_GUARD_KILL' ctx.session.enemy = { name: 'Охранник', hp: 1000, armor: 20 } return ctx.scene.enter('PVE') } return ctx.editMessageText('Охранник обезврежен, вы подходите к кассиру:', Markup.inlineKeyboard([ [{text: 'Убить кассира и забрать все из кассы', callback_data: `SHOP_KILL_CASHIER`}], //[{text: 'Приказать кассиру сдать кассу [Угроза]', callback_data: `SHOP_THREAT`}], //[{text: 'Приказать кассиру сдать кассу [Убеждение]', callback_data: `SHOP_CONVICTION`}] ])) }); shop.action(`SHOP_KILL_CASHIER`, async (ctx) => { let skill = await SkillsModel.findByPk(ctx.from.id) let chance = rand(0, 100) chance += skill.stealing.level if(chance < 60 && !ctx.session.enemy) { ctx.session.stage = 'SHOP_KILL_CASHIER' ctx.editMessageText('Вы заметили охранника, с ним нужно что-то сделать...'); ctx.session.enemy = { name: 'Охранник', hp: 100, armor: 20 } return ctx.scene.enter('PVE') } return ctx.editMessageText('Стадии:', Markup.inlineKeyboard([ [{text: 'Взлом кассы', callback_data: `SHOP_CASH_BREAK`}], [{text: 'Разбить кассу', callback_data: `SHOP_CASH_SMASH`}] ])) }); shop.action(`SHOP_CASH_BREAK`, async (ctx) => { let user = await UserModel.findByPk(ctx.from.id) let skill = await SkillsModel.findByPk(ctx.from.id) let chance = rand(0, 100) chance += skill.lockpick.level let cashIn = rand(1000, 10000) let timer = 1000 if(chance < 99) { const keyboard = generateKeyboard(); ctx.deleteMessage() return ctx.reply('Взлом замка:', keyboard); //ctx.editMessageText('Вы начали взлом кассы.'); //return ctx.scene.enter('LOCKPICK') } for(i=0; i { cashIn += rand(1000, 10000) ctx.editMessageText(`⏏️ Вы достали из кассы: Ð${cashIn}`) }, timer) timer += 500 } setTimeout(() => { user.dirtymoney += cashIn user.save() return ctx.editMessageText(`Вы достали из кассы Ð${cashIn}, пора валить.`, Markup.inlineKeyboard([ [{text: 'Завершить ограбление', callback_data: `SHOP_END`}] ])) }, timer+300) }); shop.action(`SHOP_CASH_SMASH`, async (ctx) => { let user = await UserModel.findByPk(ctx.from.id) let skill = await SkillsModel.findByPk(ctx.from.id) let chance = rand(0, 100) let cashIn = rand(1000, 10000) let timer = 1000 if(chance < 50) { ctx.editMessageText('Вы разбили кассовый аппарат, и сработала сигнализация.') ctx.session.stage = 'SHOP_CASH_SMASH' ctx.session.enemy = { name: 'Полицейский', hp: 100, armor: 100 } for(i=0; i { cashIn += rand(1000, 10000) ctx.editMessageText(`⏏️ Вы достали из кассы: Ð${cashIn}`) }, timer) timer += 500 } setTimeout(() => { user.dirtymoney += cashIn user.save() return ctx.editMessageText(`Вы достали из кассы Ð${cashIn}, пора валить.`) }, timer+300) return ctx.scene.enter('PVE') } for(i=0; i { cashIn += rand(1000, 10000) ctx.editMessageText(`⏏️ Вы достали из кассы: Ð${cashIn}`) }, timer) timer += 500 } setTimeout(() => { user.dirtymoney += cashIn user.save() return ctx.editMessageText(`Вы достали из кассы Ð${cashIn}, пора валить.`, Markup.inlineKeyboard([ [{text: 'Завершить ограбление', callback_data: `SHOP_END`}] ])) }, timer+300) }); shop.action(`SHOP_CASH_BREAK_SUCCESS`, async (ctx) => { let user = await UserModel.findByPk(ctx.from.id) let cashIn = rand(1000, 10000) let timer = 100 for(i=0; i { cashIn += rand(1000, 10000) ctx.editMessageText(`⏏️ Вы достали из кассы: Ð${cashIn}`) }, timer) timer += 500 } setTimeout(() => { user.dirtymoney += cashIn user.save() return ctx.editMessageText(`Вы достали из кассы Ð${cashIn}, пора валить.`, Markup.inlineKeyboard([ [{text: 'Завершить ограбление', callback_data: `SHOP_END`}] ])) }, timer+300) }); shop.action(`SHOP_END`, async (ctx) => { ctx.editMessageText('Ограбление завершено!') return ctx.scene.leave(); }); shop.action(/lock_*/, (ctx) => { const buttonId = ctx.update.callback_query.data; ctx.answerCbQuery(`Штифт не сдвинулся.`); removeButton(ctx, buttonId); }); function generateKeyboard() { const buttonsCount = 10; const buttons = []; const winButton = rand(1, 10) for (let i = 1; i <= buttonsCount; i++) { if(i == winButton){ buttons.push({ text: `🔒`, callback_data: `SHOP_CASH_BREAK_SUCCESS` }) }else{ buttons.push({ text: `🔒`, callback_data: `lock_${i}` }) } } let rows = [] while (buttons.length > 0) { rows.push(buttons.splice(0, 5)) // разбиваем на подмассивы по 5 кнопок } return { reply_markup: { inline_keyboard: rows, }, }; } shop.leave((ctx) => { console.log('Завершено'); }); function removeButton(ctx, buttonId) { const keyboard = ctx.update.callback_query.message.reply_markup.inline_keyboard; for (let row of keyboard) { for (let i = 0; i < row.length; i++) { if (row[i].callback_data === buttonId) { row[i].text = `🔓` break; } } } if (keyboard.flat().length === 0) { console.log(`Lockpick completed`) } else { console.log(keyboard) ctx.editMessageText('Взлом замка:', Markup.inlineKeyboard(keyboard)); } } module.exports = shop