345 lines
11 KiB
JavaScript
345 lines
11 KiB
JavaScript
const {
|
||
Telegraf,
|
||
Scenes,
|
||
Markup
|
||
} = require('telegraf')
|
||
const bot = new Telegraf(process.env.BOT_TOKEN)
|
||
const {
|
||
slots,
|
||
phones,
|
||
UserModel,
|
||
WorldModel,
|
||
SkillsModel,
|
||
PropertyModel
|
||
} = global.config
|
||
const {
|
||
spaces,
|
||
getSlot,
|
||
giveExp,
|
||
rand,
|
||
random,
|
||
setCooldown
|
||
} = global.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<rand(6,15);i++){
|
||
setTimeout(() => {
|
||
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<rand(3,10);i++){
|
||
setTimeout(() => {
|
||
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<rand(3,10);i++){
|
||
setTimeout(() => {
|
||
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<rand(6,15);i++){
|
||
setTimeout(() => {
|
||
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 |