diff --git a/index.js b/index.js index 4d68d51..a54b701 100644 --- a/index.js +++ b/index.js @@ -4,10 +4,14 @@ const { Markup } = require('telegraf') const shortid = require('shortid'); +const voucher_codes = require('voucher-code-generator'); +const { createCanvas, loadImage } = require('canvas'); const fs = require('fs') const bot = new Telegraf(process.env.BOT_TOKEN) const weaponshop = require('./json/weaponshop.json') const slots = require('./json/slots.json') +const rarecars = require('./json/rarecars.json') +const simplecars = require('./json/simplecars.json') const houses = require('./presets/houses.json') const cars = require('./presets/cars.json') const phones = require('./presets/mobiles.json') @@ -23,8 +27,9 @@ const BusinessModel = require('./models/business.model'); const ReportModel = require('./models/report.model'); const BlockModel = require('./models/block.model'); const PromocodeModel = require('./models/promocode.model'); +const mainChat = -1001895132127 const adminList = [275416286] -const expToUp = [0, 10, 20, 40, 60, 80, 120, 150, 200, 500, 1000] +const expToUp = [0, 10, 20, 40, 60, 100, 250, 370, 450, 575, 666, 777, 860, 999, 1000, 1177, 1234, 1350, 1488, 1515, 1610] const topSym = ['🥇', '🥈', '🥉', '4️⃣', '5️⃣', '6️⃣', '7️⃣', '8️⃣', '9️⃣', '🔟'] const start = async () => { @@ -65,10 +70,11 @@ bot.telegram.setMyCommands([{ bot.use(async (ctx, next) => { let id = ctx.from.id let username = ctx.from.username + if(username == null) username = ctx.from.id try { console.log(getCurrentTime() + `: ` + username + `: ` + ctx.update.message.text) } catch (e) { - console.log(getCurrentTime() + `: ${username}: Не удалось перехватить контекст.`) + console.log(getCurrentTime() + `: ${username}: ${ctx.update.callback_query.data}`) } let user = await UserModel.findByPk(id); let block = await BlockModel.findByPk(id); @@ -82,6 +88,7 @@ bot.use(async (ctx, next) => { }) } else { user.name = ctx.from.first_name + if(user.username === null) user.username = ctx.from.id user.save() } if (property === null) { @@ -121,8 +128,9 @@ bot.command('start', async (ctx) => { } return await ctx.reply('Главное меню', Markup .keyboard([ - ['😎 Профиль', '💳 Баланс'], // Row1 with 2 buttons + ['😎 Профиль'], // Row1 with 2 buttons ['🗄️ Работать', '🌐 Организация', '🎁 Бонус', '🏯 Казино'], // Row2 with 2 buttons + ['📦 Контейнеры'], ['📢 Вакансии', '🔵 Имущество', '📞 Пригласить'] // Row3 with 3 buttons ]) .resize() @@ -132,20 +140,25 @@ bot.command('start', async (ctx) => { bot.hears('▶️ Меню', async (ctx) => { return await ctx.reply('Main Menu', Markup .keyboard([ - ['😎 Профиль', '💳 Баланс'], // Row1 with 2 buttons - ['🗄️ Работать', '🌐 Организация', '🎁 Бонус', '🏯 Казино'], // Row2 with 2 buttons - ['📢 Вакансии', '🔵 Имущество', '📞 Пригласить'] // Row3 with 3 buttons + ['😎 Профиль'], + ['🗄️ Работать', '🌐 Организация', '🎁 Бонус', '🏯 Казино'], + ['📦 Контейнеры'], + ['📢 Вакансии', '🔵 Имущество', '📞 Пригласить'] ]) .resize() ) }); +bot.hears('Чат', async (ctx) => { + ctx.telegram.sendMessage(mainChat, `Automatic message`) +}); + bot.hears('😎 Профиль', async (ctx) => { let user = await UserModel.findByPk(ctx.from.id); let property = await PropertyModel.findByPk(ctx.from.id); if (!user) return ctx.reply(`Ошибка #1`); return ctx.replyWithMarkdownV2(` - 👤${escape(user.username)} ${user.status == 'bronze' ? `\\[_*Bronze Status*_\\]` : ""}${user.status == 'silver' ? `\\[_*Silver Status*_\\]` : ""}${user.status == 'gold' ? `\\[_*Gold Status*_\\]` : ""}${user.status == 'admin' ? "✅" : ""} + 👤${escape(user.username)} ${user.status == 'bronze' ? `\\[🔺\\]` : ""}${user.status == 'silver' ? `\\[🔹\\]` : ""}${user.status == 'gold' ? `\\[🔸\\]` : ""}${user.status == 'admin' ? "✅" : ""} 🆔: ${ctx.from.id} 📶 Уровень: ${user.level} \\| ${user.exp} / ${expToUp[user.level]} @@ -170,7 +183,7 @@ bot.command('getprofile', async (ctx) => { let user = await UserModel.findByPk(id); let property = await PropertyModel.findByPk(id); return ctx.replyWithMarkdownV2(` - 👤${escape(user.username)} ${user.status == 'bronze' ? `\\[_*Bronze Status*_\\]` : ""}${user.status == 'silver' ? `\\[_*Silver Status*_\\]` : ""}${user.status == 'gold' ? `\\[_*Gold Status*_\\]` : ""}${user.status == 'admin' ? "Administrator" : ""} + 👤${escape(user.username)} ${user.status == 'bronze' ? `\\[🔺\\]` : ""}${user.status == 'silver' ? `\\[🔹\\]` : ""}${user.status == 'gold' ? `\\[🔸\\]` : ""}${user.status == 'admin' ? "Administrator" : ""} 🆔: ${ctx.from.id} 📶 Уровень: ${user.level} \\| ${user.exp} / ${expToUp[user.level]} @@ -661,7 +674,7 @@ bot.hears('Топ', async (ctx) => { group: ['username', 'status'], where: { telegram_id: { - [Op.ne]: 275416286 // игнорировать игрока с telegram_id 275416286 + [Op.ne]: 275416286 } }, order: [ @@ -671,7 +684,7 @@ bot.hears('Топ', async (ctx) => { }) let text = `🏆 Топ 10 игроков по балансу.\n\n` for(i=0; i { }) bot.hears('Поставщик', async (ctx) => { - let text = `Вы подходите к зданию с вывеской "Ништяки Хаткейса".\nВлад Хаткейс: "Вот мой ассортимент на сегодня:"\n` + let text = `[Hatkeis Gunsmith](https://telegra.ph/Hatkeis-Gunsmith-09-27)` + let shop = `\n Вы подходите к зданию с вывеской "Ништяки Хаткейса".\n Вот ассортимент на сегодня\n` for (i = 0; i < 10; i++) { - text += `${i}. ${weaponshop[i].name} (¤${weaponshop[i].price}) [/buy equipment ${i}]\n` + shop += `${i}. ${weaponshop[i].name} (¤${spaces(weaponshop[i].price)})\n` } weaponShopUpdate() - return await ctx.reply(text) + return await ctx.replyWithMarkdownV2(text + escape(shop), {disable_web_page_preview: true}) }) bot.command('sell', async (ctx) => { @@ -886,23 +900,91 @@ bot.hears('🌐 Организация', async (ctx) => { owner: user.business.id } }) - return await ctx.replyWithMarkdown(`🏭 Организация\n_${business.name}_\n💹 Баланс: ¤${business.balance}\n🧰 Сырье: ${business.materials}\n👥 Рабочих: ${business.users.length}`, Markup.keyboard([ - ['📶 Отработка'], - ['⬅️ Покинуть'], - ['🌐 Организация', '▶️ Меню'] // Row3 with 3 buttons + return await ctx.replyWithMarkdownV2(`🏭 Организация\n_${business.name}_\n💹 Баланс: ¤${escape(spaces(business.balance))}\n🧰 Сырье: ${business.materials}\n👥 Рабочих: ${business.users.length}\n\nВаши отработки: ${user.business.checks}`, Markup.inlineKeyboard([ + [{ + text: `📶 Отработка`, + callback_data: "workoff" + }, { + text: `⬅️ Покинуть`, + callback_data: "покинуть" + }] ]) + .oneTime() .resize()) } if (business.owner == ctx.from.id){ - return await ctx.replyWithMarkdown(`🏭 Ваша организация\n_${business.name}_\n💹 Баланс: ¤${business.balance}\n🧰 Сырье: ${business.materials} (Для закупки: [/materials Кол-во])\n👥 Рабочих: ${business.users.length} (Для приглашения: [/invite [Nick]])\n🔨 Отработок: ${business.checks}`, Markup.keyboard([ - ['📶 Отработка'], - ['💸 Payday', '🌐 Организация', '▶️ Меню'] + return await ctx.replyWithMarkdownV2(`🏭 Ваша организация\n_${business.name}_\n💹 Баланс: ¤${escape(spaces(business.balance))}\n🧰 Сырье: ${business.materials}\n👥 Рабочих: ${business.users.length}\n🔨 Отработок: ${business.checks}\n\nВаши отработки: ${user.business.checks}`, Markup.inlineKeyboard([ + [{ + text: `📶 Отработка`, + callback_data: "workoff" + }, { + text: `💸 Payday`, + callback_data: "payday" + }] ]) + .oneTime() .resize()) } }) -bot.hears('⬅️ Покинуть', async (ctx) => { +bot.action('workoff', async (ctx) => { + let user = await UserModel.findByPk(ctx.from.id) + let business = await BusinessModel.findOne({ + where: { + owner: user.business.id.toString() + } + }) + if (user.business == null) return await ctx.reply(`Вы не работаете в организации.`) + let timer = user.worktime + let cooldown = setCooldown(user, 3600, timer) + if (user.worktime > cooldown.currentTime) return ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `📛 Работа в организации будет доступна через ${cooldown.timeLeftInMinutes} минут(у/ы)`, {show_alert: true}); + if (business.materials < 10) return ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `📛 В организации недостаточно материалов для отработки.`); + user.worktime = cooldown.endTime + user.business = { + id: user.business.id, + checks: user.business.checks + 1, + percent: user.business.percent + } + business.materials -= 10 + business.checks += 1 + await user.save() + await business.save() + if (business.owner == ctx.from.id){ + return await ctx.editMessageText(`🏭 Ваша организация\n_${business.name}_\n💹 Баланс: ¤${escape(spaces(business.balance))}\n🧰 Сырье: ${business.materials} \n👥 Рабочих: ${business.users.length}\n🔨 Отработок: ${business.checks}\n\nВаши отработки: ${user.business.checks}`, + { + reply_markup: { + inline_keyboard: [ + [{ + text: `📶 Отработка`, + callback_data: "workoff" + }, { + text: `💸 Payday`, + callback_data: "payday" + }] + ]}, + parse_mode: `MarkdownV2` + } + ) + }else{ + return await ctx.editMessageText(`🏭 Организация\n_${business.name}_\n💹 Баланс: ¤${escape(spaces(business.balance))}\n🧰 Сырье: ${business.materials}\n👥 Рабочих: ${business.users.length}\n\nВаши отработки: ${user.business.checks}`, + { + reply_markup: { + inline_keyboard: [ + [{ + text: `📶 Отработка`, + callback_data: "workoff" + }, { + text: `⬅️ Покинуть`, + callback_data: "покинуть" + }] + ]}, + parse_mode: `MarkdownV2` + } + ) + } +}) + +bot.action('покинуть', async (ctx) => { let user = await UserModel.findByPk(ctx.from.id) if (user.business.id == 0) return await ctx.reply(`Вы не состоите в организации.`) let business = await BusinessModel.findOne({ @@ -935,6 +1017,11 @@ bot.hears('⬅️ Покинуть', async (ctx) => { } }) +bot.action('cancel', async (ctx) => { + await ctx.deleteMessage() + await bot.telegram.answerCbQuery(ctx.callbackQuery.id, `Отмена.`) +}) + bot.action('user_leave_business', async (ctx) => { let data = ctx.update.callback_query.data; let user = await UserModel.findByPk(ctx.from.id) @@ -955,32 +1042,7 @@ bot.action('user_leave_business', async (ctx) => { return await bot.telegram.sendMessage(ctx.from.id, `🏭 Вы покинули ${business.name}`) }) -bot.hears('📶 Отработка', async (ctx) => { - let user = await UserModel.findByPk(ctx.from.id) - let business = await BusinessModel.findOne({ - where: { - owner: user.business.id.toString() - } - }) - if (user.business == null) return await ctx.reply(`Вы не работаете в организации.`) - let timer = user.worktime - let cooldown = setCooldown(user, 3600, timer) - if (user.worktime > cooldown.currentTime) return ctx.reply(`📛 Работа в организации будет доступна через ${cooldown.timeLeftInMinutes} минут(у/ы)`); - if (business.materials < 10) return ctx.reply(`📛 В организации недостаточно материалов для отработки.`); - user.worktime = cooldown.endTime - user.business = { - id: user.business.id, - checks: user.business.checks + 1, - percent: user.business.percent - } - business.materials -= 10 - business.checks += 1 - await user.save() - await business.save() - return await ctx.reply(`Вы отработали час на ${business.name}\nВсего отработок ${user.business.checks}`) -}) - -bot.hears('💸 Payday', async (ctx) => { +bot.action('payday', async (ctx) => { let user = null let business = await BusinessModel.findOne({ where: { @@ -1000,36 +1062,35 @@ bot.hears('💸 Payday', async (ctx) => { for (i = 0; i < business.users.length; i++) { // Summary percent user = await UserModel.findByPk(business.users[i]) percentSum += Number(user.business.percent) - percentErrorText += `${user.username} ${user.business.percent}% [для изменения введите /percent ${user.username} [проценты]]\n` + percentErrorText += `ℹ️ ${user.username} ${user.business.percent}% [/percent ${user.username} [проценты]]\n` } - if (percentSum > 100) return await ctx.reply(`Общий процент всех сотрудников превышает 100%\nОстаток процентов перенесется в баланс организации.\n${percentErrorText}`) - for (i = 0; i < business.users.length; i++) { // Общая внесенная сумма всеми участниками - user = await UserModel.findByPk(business.users[i]) - profit += user.business.checks * moneyList - text += `${user.username} отработал ${user.business.checks} раз.\n` + if (percentSum > 100) return await ctx.reply(`⚠️ Общий процент всех сотрудников превышает 100%\n ➕ Остаток процентов перенесется в баланс организации.\n\n${percentErrorText}\n`) + for (x = 0; x < business.users.length; x++) { // Общая внесенная сумма всеми участниками + user = await UserModel.findByPk(business.users[x]) + profit += user.business.checks * moneyList * user.level + text += `ℹ️ ${user.username} отработал ${user.business.checks} раз.\n` user.business = { id: user.business.id, checks: 0, percent: user.business.percent } - user.save() } - text += `Наработка за текущий период: ${profit}\n` + text += ` 💹 Наработка за текущий период: ${profit}\n` let profitCheck = profit - for (i = 0; i < business.users.length; i++) { // Процент выплаты участникам - user = await UserModel.findByPk(business.users[i]) + for (n = 0; n < business.users.length; n++) { // Процент выплаты участникам + user = await UserModel.findByPk(business.users[n]) piece = Math.round(profit / 100 * user.business.percent) profitCheck -= piece user.money += piece + text += `➕ ${user.username} получает ¤${piece}\n` + await bot.telegram.sendMessage(user.telegram_id, `ℹ️ Директор организации сформировал выплаты.\n➕ На ваш баланс поступило: ${spaces(piece)}`) giveExp(user, business.checks) user.save() - text += `${user.username} получает ¤${piece}\n` - await bot.telegram.sendMessage(user.telegram_id, `Директор организации сформировал выплаты.\n На ваш баланс поступило: ${spaces(piece)}`) } if (profitCheck > 0) { business.balance += profitCheck - text += `На баланс бизнеса поступило ¤${profitCheck}` + text += `➕ На баланс бизнеса поступило ¤${profitCheck}` } business.checks = 0 business.save() @@ -1056,23 +1117,25 @@ bot.command('orgmessage', async (ctx) => { bot.command('materials', async (ctx) => { ctx.args = ctx.update.message.text.split(' ') let user = await UserModel.findByPk(ctx.from.id) - if (user.business.id == 0) return await ctx.reply(`Вы не владеете организацией.`) + if (user.business.id == 0) return await ctx.reply(`🚫 Вы не владеете организацией.`) let world = await WorldModel.findByPk(1) let business = await BusinessModel.findOne({ where: { owner: ctx.from.id.toString() } }) - if (business === null) return await ctx.reply(`У вас нет организации.`) - if (!ctx.args[1]) return ctx.reply(`Не указан аргумент.`) - if (!Number(ctx.args[1])) return ctx.reply(`Количество должно быть числом.`) - if (ctx.args[1] < 1) return ctx.reply(`Минимальное количество для покупки - 1`) - if (ctx.args[1] > business.balance) return ctx.reply(`Недостаточно средств на балансе организации.`) + if (business === null) return await ctx.reply(`🚫 У вас нет организации.`) + if (!ctx.args[1]) return ctx.reply(`🚫 Не указан аргумент.`) + if (!Number(ctx.args[1])) return ctx.reply(`ℹ️ Количество должно быть числом.`) + if (ctx.args[1] < 1) return ctx.reply(`ℹ️ Минимальное количество для покупки - 1`) + if (ctx.args[1]*world.matPrice > business.balance) return ctx.reply(`🚫 Недостаточно средств на балансе организации.`) + if (business.materials >= 700) return ctx.reply(`🚫 Склады полны.`) + if (business.materials + Number(ctx.args[1]) > 700) return ctx.reply(`🚫 Нет столько места на складах.\n Можно закупить еще ${700 - business.materials}`) let count = Number(ctx.args[1]) business.balance -= world.matPrice*count business.materials += count business.save() - return await ctx.reply(`Закуплено ${ctx.args[1]} материалов для организации на сумму ${world.matPrice*count}`) + return await ctx.reply(`➕ Закуплено ${ctx.args[1]} материалов для организации на сумму ¤${world.matPrice*count}`) }) bot.command('percent', async (ctx) => { @@ -1149,13 +1212,19 @@ bot.command('invite', async (ctx) => { ctx.args = ctx.update.message.text.split(' ') if (!ctx.args[1]) return ctx.reply(`/invite [Nick]`) let user = await UserModel.findByPk(ctx.from.id) - if (user.business.id == 0) return await ctx.reply(`У вас нет организации в которую можно пригласить игрока.`) + if (user.business.id == 0) return await ctx.reply(`🚫 У вас нет организации в которую можно пригласить игрока.`) + let business = await BusinessModel.findOne({ + where: { + owner: ctx.from.id.toString() + } + }) + if (business.users.length >= 5) return await ctx.reply(`📛 Достигнуто максимальное количество сотрудников в организации.`) let invited = await UserModel.findOne({ where: { username: ctx.args[1] } }); - await bot.telegram.sendMessage(invited.telegram_id, 'Приглашение', Markup + await bot.telegram.sendMessage(invited.telegram_id, '⤵️ Приглашение', Markup .inlineKeyboard([ [{ text: `Принять`, @@ -1187,12 +1256,12 @@ bot.action(/{"type": "business_invite_(accept|refuse)"*/, async ctx => { business.users = sequelize.fn('array_append', sequelize.col('users'), ctx.update.callback_query.from.id); business.save() user.save() - await ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `Приглашение принято.`, {show_alert: true}) + await ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `✔️ Приглашение принято.`, {show_alert: true}) } - await ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `Вы уже в организации.`, {show_alert: true}) + await ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `ℹ️ Вы уже в организации.`, {show_alert: true}) } if (data.type == 'business_invite_refuse'){ - await ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `Приглашение отклонено.`, {show_alert: true}) + await ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `❌ Приглашение отклонено.`, {show_alert: true}) } }) @@ -1279,20 +1348,20 @@ bot.action(/slots(1000|5000|25000|50000|100000)/, async (ctx) => { user.save() world.save() return setTimeout(() => { - ctx.reply(`Вы выиграли ${bet*win}`) + ctx.reply(`➕ Вы выиграли ¤${spaces(bet*win)}`) }, 1700); } if(win > 0 && win <= 4){ await giveExp(user, win*2) return setTimeout(() => { - ctx.reply(`Вы выиграли ${win*2} опыта.`) + ctx.reply(`➕ Вы выиграли ${win*2} опыта.`) }, 1700); } if(win == 0){ return setTimeout(() => { world.save() user.save() - ctx.reply(`Вы ничего не выиграли.`) + ctx.reply(`➖ Вы проиграли ¤${spaces(bet)}.`) }, 1700); } @@ -1313,18 +1382,92 @@ bot.command('promocode', async (ctx) => { code: ctx.args[1] } }) - if(promocode === null) return await ctx.reply(`Нет такого кода.`) - if(promocode.users.length-1 >= promocode.activations && promocode.users != null) return await ctx.reply(`Промокод уже активировали максимальное количество раз.`) - if(promocode.users.includes(ctx.from.id.toString())) return await ctx.reply(`Вы уже активировали этот промокод.`) + if(promocode === null) return await ctx.reply(`➖ Нет такого кода.`) + if(promocode.users.length-1 >= promocode.activations && promocode.users != null) return await ctx.reply(`⚠️ Промокод уже активировали максимальное количество раз.`) + if(promocode.users.includes(ctx.from.id.toString())) return await ctx.reply(`⚠️ Вы уже активировали этот промокод.`) console.log(promocode.users) promocode.users = sequelize.fn('array_append', sequelize.col('users'), ctx.from.id.toString()); user.money += promocode.money user.save() promocode.save() await bot.telegram.sendMessage(adminList[0], `${user.username} активировал промокод.`) - return await ctx.reply(`Вы активировали промокод.`) + return await ctx.reply(`✅ Вы активировали промокод.`) }) +bot.hears('📦 Контейнеры', async (ctx) => { + let user = await UserModel.findByPk(ctx.from.id) + let containers = [] + let superWin = rarecars.random() + let values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + let oneValue = [] + for(i = 0; i < 10; i++){ + oneValue = values.random() + values = values.filter(value => value != oneValue); + containers.push({name: `📦 Контейнер ${i+1}`, value: oneValue}) + } + let keyboardButtons = containers.map(container => { + return {text: container.name, callback_data: `container_${container.value}`} + }) + let rows = [] + while (keyboardButtons.length > 0) { + rows.push(keyboardButtons.splice(0, 2)) // разбиваем на подмассивы по 5 кнопок + } + await ctx.replyWithMarkdownV2('[Sueta Logistic International](https://telegra.ph/OOO-Sueta-Logistic-International-09-27)\nДоступные контейнеры в порту:', + { + reply_markup: { + inline_keyboard: rows + }, + disable_web_page_preview: true + }) +}) + + +bot.action(/container_(1|2|3|4|5|6|7|8|9|10)/, async (ctx) => { + let data = ctx.update.callback_query.data; + let user = await UserModel.findByPk(ctx.from.id) + let property = await PropertyModel.findByPk(ctx.from.id) + if(user.money < 500000) return ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `Открытие контейнера стоит ¤500.000`, {show_alert: true}) + if(property.car.name) return ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `У вас уже есть автомобиль\nПродайте текущий автомобиль: /sell car`, {show_alert: true}) + user.money -= 500000 + let userWin = null + switch(data){ + case `container_7`: + userWin = rarecars.random() + break; + default: + userWin = simplecars.random() + break; + } + property.car = userWin + user.save() + property.save() + ctx.deleteMessage() + return await ctx.sendPhoto(userWin.image, { caption: `В контейнере была: ${userWin.name} стоимостью ¤${spaces(userWin.price)}`}) +}) + +bot.action(/{"action": "sueta_*/, async (ctx) => { + let data = ctx.update.callback_query.data; + data = JSON.parse(data) + console.log(data.car) + let user = await UserModel.findByPk(ctx.from.id) + let property = await PropertyModel.findByPk(ctx.from.id) + switch(data.action){ + case `sueta_accept`: + user.money += data.carprice + await ctx.editMessageText(`➕ ${data.carprice}`) + break; + case `sueta_refuse`: + user.money += Math.round(property.car.price/2) + property.car = { + name: data.carname, + price: data.carprice + } + await ctx.editMessageText(`➕ ${data.carname}`) + break; + } + user.save() + property.save() +}) /////////////////////////////////////Admin Commands////////////////////////////////////////////////// @@ -1368,7 +1511,7 @@ bot.command('createpromocode', async (ctx) => { if (!ctx.args[1] || !ctx.args[2] || !ctx.args[3]) return ctx.reply(`/createpromo [activations] [money] [code]`) let promocode = await PromocodeModel.findOne({ where: { - code: ctx.args[1] + code: ctx.args[3] } }) if(promocode === null){ @@ -1377,7 +1520,36 @@ bot.command('createpromocode', async (ctx) => { activations: ctx.args[1], money: ctx.args[2] }) - return await ctx.reply(`Создан промокод ${ctx.args[3]}`) + let voucherImage = await generateVoucher(ctx.args[3], ctx.args[1], ctx.args[2]) + return await ctx.sendPhoto({source: voucherImage, caption: `Создан промокод ${ctx.args[3]}` }) +} +}) + +bot.command('genpromo', async (ctx) => { + let user = await UserModel.findByPk(ctx.from.id) + if(user.status != 'admin') return await ctx.reply(`Admin Only.`) + ctx.args = ctx.update.message.text.split(' ') + if (!ctx.args[1] || !ctx.args[2]) return ctx.reply(`/genpromo [activations] [money]`) + let code = voucher_codes.generate({ + length: 6, + count: 1, + prefix: "CMP-", + postfix: "-FIRE", + charset: voucher_codes.charset("alphanumeric") + }); + let promocode = await PromocodeModel.findOne({ + where: { + code: code[0] + } + }) + if(promocode === null){ + await PromocodeModel.create({ + code: code[0], + activations: ctx.args[1], + money: ctx.args[2] + }) + let voucherImage = await generateVoucher(code, ctx.args[1], ctx.args[2]) + return await ctx.sendPhoto({source: voucherImage, caption: `Создан промокод ${code[0]}` }) } }) @@ -1396,13 +1568,27 @@ function spacesWithMarkdown(string) { if (typeof string !== "string") string = string.toString(); return string.split("").reverse().join("").match(/[0-9]{1,3}/g).join(".\\").split("").reverse().join(""); }; -function escape(string) { - string = string - .replace("_", "\\_") - .replace("*", "\\*") - .replace("[", "\\[") - .replace("`", "\\`"); - return string +function escape(text) { + text = text + .replace(/\_/g, '\\_') + .replace(/\*/g, '\\*') + .replace(/\[/g, '\\[') + .replace(/\]/g, '\\]') + .replace(/\(/g, '\\(') + .replace(/\)/g, '\\)') + .replace(/\~/g, '\\~') + .replace(/\`/g, '\\`') + .replace(/\>/g, '\\>') + .replace(/\#/g, '\\#') + .replace(/\+/g, '\\+') + .replace(/\-/g, '\\-') + .replace(/\=/g, '\\=') + .replace(/\|/g, '\\|') + .replace(/\{/g, '\\{') + .replace(/\}/g, '\\}') + .replace(/\./g, '\\.') + .replace(/\!/g, '\\!'); + return text }; Array.prototype.random = function() { return this[Math.floor(this.length * Math.random())]; @@ -1467,13 +1653,14 @@ function setCooldown(user, seconds, type) { return cooldown } -function giveExp(user, experience) { +async function giveExp(user, experience) { user.exp += experience - if (user.exp >= expToUp[user.level]) { - user.level += 1 - user.exp = 0 - user.save() - bot.telegram.sendMessage(user.telegram_id, `Ваш уровень повысился до ${user.level}!`) + for(i in expToUp){ + if (user.exp >= expToUp[user.level]) { + user.exp -= expToUp[user.level] + user.level += 1 + user.save() + await bot.telegram.sendMessage(user.telegram_id, `⤴️ Ваш уровень повысился до ${user.level}!`)} } user.save() } @@ -1506,6 +1693,10 @@ async function matPriceUpdate() { world.save() } +setTimeout(() => { + generatePromo() +}, 360000*3); + setInterval(() => { var today = new Date(); let hours = today.getHours(); @@ -1515,6 +1706,58 @@ setInterval(() => { } }, 360000); +async function generatePromo() { + let activs = rand(1, 3) + let give = rand(1000, 10000) + let code = voucher_codes.generate({ + length: 6, + count: 1, + prefix: "CMP-", + postfix: "-FIRE", + charset: voucher_codes.charset("alphanumeric") + }); + let promocode = await PromocodeModel.findOne({ + where: { + code: code[0] + } + }) + if(promocode === null){ + await PromocodeModel.create({ + code: code[0], + activations: activs, + money: give + }) + let voucherImage = await generateVoucher(code[0], activs, give) + return await bot.telegram.sendPhoto(mainChat, {source: voucherImage}) +} +} + +async function generateVoucher(code, activations, money) { + // загружаем изображение фона + const background = await loadImage('./media/imageDefault3.png'); + + // создаем новый canvas + const canvas = createCanvas(background.width, background.height); + const ctx = canvas.getContext('2d'); + + // рисуем фоновое изображение + ctx.drawImage(background, 0, 0); + + // выводим текст на картинку + ctx.font = 'bold 30px Srbija Sans'; + ctx.fillStyle = '#232323'; + ctx.textAlign = 'center'; + ctx.fillText(`${code}`, canvas.width/2, canvas.height/1.90); + + // сохраняем картинку в файл + const out = fs.createWriteStream('./media/image.png'); + const stream = canvas.createPNGStream(); + stream.pipe(out); + + // возвращаем путь к сгенерированной картинке + return './media/image.png'; + } + start() bot.launch() \ No newline at end of file diff --git a/json/rarecars.json b/json/rarecars.json new file mode 100644 index 0000000..cfa8033 --- /dev/null +++ b/json/rarecars.json @@ -0,0 +1,97 @@ +[ + { + "name": "BMW 7 Series 2001", + "price": 1100000, + "image": "https://sun9-1.userapi.com/impg/d5DVc5oNorJw50mw0c1y_4iMA1gmFJQ9bqZ7IQ/uebjpdo7_dg.jpg?size=960x720&quality=96&sign=2e5cb705062b188c15050723a8598722&type=album" + }, + { + "name": "Mercedes W140 S600 1997", + "price": 1300000, + "image": "https://sun9-10.userapi.com/impg/_UawxXF4t14mD_6aHahzdibBK5TbATlnW_Yzmg/n38ggX23gFo.jpg?size=959x960&quality=96&sign=911a96d2f290a114f41806de26dd9351&type=album" + }, + { + "name": "Audi RS2 1994", + "price": 3500000, + "image": "https://sun9-37.userapi.com/impg/VnZ3YEAwLuLuF9OKhLdc8000uVH7oXuKt0RKWA/ucQP9J0Fo3A.jpg?size=1600x1200&quality=96&sign=fa9c200d9aedf424cbc9839949f5eeb0&type=album" + }, + { + "name": "Lotus Omega 1991", + "price": 7000000, + "image": "https://sun9-40.userapi.com/impg/z_XO05RQoDz1sexN4jNOOb0VG_lHX9HhyU1hGQ/nPz-SGAgWoQ.jpg?size=1280x800&quality=96&sign=96f0c7b5e7e035433cb19e7a81f664da&type=album" + }, + { + "name": "Acura RSX 2003", + "price": 1000000, + "image": "https://sun9-25.userapi.com/impg/bpq2RE5Olya6nuVmubYay4cH6Ju6akl6kdTaHw/_IAnNsU_HQw.jpg?size=1600x1200&quality=96&sign=e74da55a75a20d6ace2fc00059a975fb&type=album" + }, + { + "name": "Honda NSX 1991", + "price": 6000000, + "image": "https://sun9-78.userapi.com/impg/GocdnvUVxZP1QkkGcJBKI2pMzmitnBlS3uMHOA/BKE2BFk44NQ.jpg?size=1080x1080&quality=96&sign=84eb4a7eae688ab34242bf98c0b3b453&type=album" + }, + { + "name": "Mazda RX-7 FC 1990", + "price": 2000000, + "image": "https://sun9-16.userapi.com/impg/KSFDRrsRpHvePQdyFLMYPKJ8fO3r1HBFChItQQ/z3lILSdkoSQ.jpg?size=750x499&quality=96&sign=ce7cfe2238c8d2295f6d59c256a378a7&type=album" + }, + { + "name": "Corvette C3 1990", + "price": 5000000, + "image": "https://sun9-30.userapi.com/impg/S104d3tiupLZNxIag76AzoTD7eSP2c23SnEaFQ/9qGBEj--af4.jpg?size=1024x768&quality=96&sign=86a959a0b03668f412f5d158017e611c&type=album" + }, + { + "name": "Ford Mustang 302 boss 1970", + "price": 5000000, + "image": "https://sun9-33.userapi.com/impg/v5msKxJGvCm6_ku5HEVN0BntMV_5nti5VU_uUw/3_9wEI-wmr4.jpg?size=1600x1200&quality=96&sign=207c04e9ce19efd4ed896a1d33c07a8b&type=album" + }, + { + "name": "Dodge Viper SRT10 2010", + "price": 7000000, + "image": "https://static1.topspeedimages.com/wordpress/wp-content/uploads/jpg/200912/2010-dodge-viper-srt10-1.jpg" + }, + { + "name": "Alfa Romeo 4c 2015", + "price": 10000000, + "image": "https://sun9-66.userapi.com/impg/JhQb558Zh_1R7QGzpzMxnNcz5HL95QDPsLHrsA/vUb_j7G-g2M.jpg?size=1342x1920&quality=96&sign=3372c45b71a2aa9eb661cfaa0864875f&type=album" + }, + { + "name": "Alfa Romeo Gulia 2020", + "price": 3500000, + "image": "https://sun9-25.userapi.com/impg/H7d5BjKtcR9_dHqbIec87PHewxJdb76-HmBcdg/4ThAZlSR3vM.jpg?size=1920x1280&quality=96&sign=55afcf8e5e1aefb3943b992d0d5586f7&type=album" + }, + { + "name": "Lexus LFA 2012", + "price": 24000000, + "image": "https://sun9-59.userapi.com/impg/rs2uFK_yhce7n4LrUu6zRuEiMjmAZY1efF7rPw/M6KE-3yrCi0.jpg?size=960x1200&quality=96&sign=446b869ff12b7ec35eff551b01678cc4&type=album" + }, + { + "name": "Buick GNX 1987", + "price": 7000000, + "image": "https://sun9-80.userapi.com/impg/9UoGREtyWSCVLLGFzywnNX_-eDncb1B7Ax63DA/hb3J0XrlYZE.jpg?size=736x1102&quality=96&sign=06ccae23f18eb06b93ba3e46129f7138&type=album" + }, + { + "name": "Chevrolet Corvette Z06, 2006", + "price": 4200000, + "image": " https://w.forfun.com/fetch/9f/9f237b9f36e27d1fddf442020bd69ff4.jpeg" + }, + { + "name": "Porsche 911", + "price": 7000000, + "image": "https://ivanglazunov.ru/wp-content/uploads/5/3/6/53621ef51acb742df6a27295963e65d4.jpeg" + }, + { + "name": "Mercedes-Benz C 200", + "price": 3500000, + "image": "https://avtoshark.com/wp-content/uploads/2020/07/mersedes-c200.jpg" + }, + { + "name": "Audi Q5", + "price": 4500000, + "image": "https://avatars.mds.yandex.net/get-autoru-vos/5278263/8baf8d9c6f3fabbe19ab206a9b712713/1200x900n" + }, + { + "name": "Ferrari F8", + "price": 34000000, + "image": "https://avatars.mds.yandex.net/get-autoru-vos/2037331/cd075cbfc2d10c05bb0450dcc889d351/1200x900n" + } + ] \ No newline at end of file diff --git a/json/simplecars.json b/json/simplecars.json new file mode 100644 index 0000000..cc30e92 --- /dev/null +++ b/json/simplecars.json @@ -0,0 +1,57 @@ +[ + { + "name": "Subaru Legacy II", + "price": 267000, + "image": "https://avatars.mds.yandex.net/get-verba/1540742/2a00000185547e7c4fe6a1ef0a2cccdcc91d/cattouchret" + }, + { + "name": "Peugeot 206", + "price": 290000, + "image": "https://avatars.mds.yandex.net/get-verba/1030388/2a000001609d64c298bd8a1807bbd401efe8/cattouchret" + }, + { + "name": "Ford Focus II", + "price": 350000, + "image": "https://avatars.mds.yandex.net/get-verba/1030388/2a000001609579d292099d1496c4184c3a1a/cattouchret" + }, + { + "name": "Chevrolet Lanos", + "price": 250000, + "image": "https://avatars.mds.yandex.net/get-verba/216201/2a000001609b62fdc53e55145a10f2ec6ecc/cattouchret" + }, + { + "name": "Opel Astra H", + "price": 450000, + "image": "https://avatars.mds.yandex.net/get-verba/216201/2a000001609cedee6fbec659b57da48df99a/cattouchret" + }, + { + "name": "Mitsubishi Lancer IX", + "price": 380000, + "image": "https://avatars.mds.yandex.net/get-verba/216201/2a0000016099a4e6be992d7b50134fd908fd/thumb_m_2x" + }, + { + "name": "Mitsubishi Lancer X", + "price": 680000, + "image": "https://avatars.mds.yandex.net/get-verba/216201/2a000001609bda17487cc63d8b957ab4aab2/cattouchret" + }, + { + "name": "Cadillac STS I", + "price": 420000, + "image": "https://avatars.mds.yandex.net/get-verba/787013/2a000001609c8f446bce6bfd7271b1c276aa/cattouchret" + }, + { + "name": "Toyota Mark II VIII (X100)", + "price": 380000, + "image": "https://avatars.mds.yandex.net/get-verba/787013/2a000001609d5a2d4aef665d95347c1aea99/cattouchret" + }, + { + "name": "Renault Logan", + "price": 400000, + "image": "https://cartechnic.ru/800/renault/logan/renault_logan_2013_1.jpg" + }, + { + "name": "Mazda 3", + "price": 500000, + "image": "https://a.d-cd.net/da371e4s-1920.jpg" + } + ] \ No newline at end of file diff --git a/json/weaponshop.json b/json/weaponshop.json index 3533f99..6200cb1 100644 --- a/json/weaponshop.json +++ b/json/weaponshop.json @@ -1,52 +1,52 @@ { "0": { - "name": "SCAR L", - "price": 1000, + "name": "M1911", + "price": 13000, "type": "weapon" }, "1": { - "name": "Deagle", - "price": 1000, + "name": "ПМ", + "price": 13000, "type": "weapon" }, "2": { - "name": "ПМ", - "price": 1000, + "name": "АКС74У", + "price": 34999, "type": "weapon" }, "3": { - "name": "Deagle", - "price": 1000, + "name": "G36C", + "price": 38999, "type": "weapon" }, "4": { - "name": "SCAR L", - "price": 1000, + "name": "G36C", + "price": 38999, "type": "weapon" }, "5": { - "name": "Бронежилет M4", - "price": 1000, + "name": "Бронежилет M1", + "price": 25000, "type": "equipment" }, "6": { - "name": "Бронежилет M6", - "price": 1000, + "name": "Бронежилет M2", + "price": 35000, "type": "equipment" }, "7": { - "name": "Бронежилет M5", - "price": 1000, + "name": "Бронежилет M1", + "price": 25000, "type": "equipment" }, "8": { - "name": "Картонные накладки", - "price": 1000, + "name": "Бронежилет M2", + "price": 35000, "type": "equipment" }, "9": { - "name": "Бронежилет M6", - "price": 1000, + "name": "Бронежилет M3", + "price": 60000, "type": "equipment" } } \ No newline at end of file diff --git a/media/image.png b/media/image.png new file mode 100644 index 0000000..4a43875 Binary files /dev/null and b/media/image.png differ diff --git a/media/imageDefault.png b/media/imageDefault.png new file mode 100644 index 0000000..72bc97d Binary files /dev/null and b/media/imageDefault.png differ diff --git a/media/imageDefault2.png b/media/imageDefault2.png new file mode 100644 index 0000000..5faf335 Binary files /dev/null and b/media/imageDefault2.png differ diff --git a/media/imageDefault3.png b/media/imageDefault3.png new file mode 100644 index 0000000..1373819 Binary files /dev/null and b/media/imageDefault3.png differ diff --git a/package-lock.json b/package-lock.json index 22d3230..5df0f93 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "canvas": "^2.11.2", "date-fns": "^2.30.0", "dotenv": "^16.3.1", "fs": "^0.0.1-security", @@ -20,7 +21,8 @@ "sequelize": "^6.6.2", "shortid": "^2.2.16", "telegraf": "^4.13.1", - "uuid": "^9.0.1" + "uuid": "^9.0.1", + "voucher-code-generator": "^1.3.0" } }, "node_modules/@babel/runtime": { @@ -34,6 +36,53 @@ "node": ">=6.9.0" } }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -79,6 +128,38 @@ "node": ">=6.5" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -154,6 +235,36 @@ "node": ">= 8" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/array.prototype.findindex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array.prototype.findindex/-/array.prototype.findindex-2.1.0.tgz", @@ -368,6 +479,20 @@ "node": ">=6" } }, + "node_modules/canvas": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.17.0", + "simple-get": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -424,6 +549,14 @@ "fsevents": "~2.3.1" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, "node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -464,6 +597,14 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -496,6 +637,11 @@ "node": ">=8" } }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -591,6 +737,11 @@ "node": ">=0.4.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -599,6 +750,14 @@ "node": ">= 0.6" } }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "engines": { + "node": ">=8" + } + }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -787,6 +946,33 @@ "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==" }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -805,6 +991,44 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", @@ -846,6 +1070,25 @@ "assert-plus": "^1.0.0" } }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -956,6 +1199,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, "node_modules/has-yarn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", @@ -983,6 +1231,39 @@ "npm": ">=1.3.7" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", @@ -1012,6 +1293,15 @@ "node >= 0.4.0" ] }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -1387,9 +1677,9 @@ } }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1402,6 +1692,48 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/moment": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", @@ -1434,6 +1766,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, + "node_modules/nan": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==" + }, "node_modules/nanoid": { "version": "2.1.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", @@ -1537,6 +1874,17 @@ "node": ">=8" } }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -1545,6 +1893,14 @@ "node": "*" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", @@ -1629,6 +1985,14 @@ "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -1991,6 +2355,20 @@ "any-promise": "^1.3.0" } }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -2152,6 +2530,11 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, "node_modules/shortid": { "version": "2.2.16", "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.16.tgz", @@ -2166,6 +2549,57 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-get/node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/simple-get/node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/split2": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", @@ -2233,22 +2667,22 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } @@ -2267,11 +2701,11 @@ } }, "node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" @@ -2331,6 +2765,22 @@ "node": ">=4" } }, + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/telegraf": { "version": "4.13.1", "resolved": "https://registry.npmjs.org/telegraf/-/telegraf-4.13.1.tgz", @@ -2602,6 +3052,11 @@ "extsprintf": "^1.2.0" } }, + "node_modules/voucher-code-generator": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/voucher-code-generator/-/voucher-code-generator-1.3.0.tgz", + "integrity": "sha512-t4wnI91KC58LtjX2I0rJDhRm1JTXD+G7A+7iqp0sRSgpeJP4eKLexDRDLe2nedR7xFQcVlZudDZRBLrMP5+KTA==" + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -2631,6 +3086,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "node_modules/widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", diff --git a/package.json b/package.json index 953bceb..61fbef4 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "author": "", "license": "ISC", "dependencies": { + "canvas": "^2.11.2", "date-fns": "^2.30.0", "dotenv": "^16.3.1", "fs": "^0.0.1-security", @@ -22,6 +23,7 @@ "sequelize": "^6.6.2", "shortid": "^2.2.16", "telegraf": "^4.13.1", - "uuid": "^9.0.1" + "uuid": "^9.0.1", + "voucher-code-generator": "^1.3.0" } } diff --git a/presets/equipment.json b/presets/equipment.json index 515d0ee..0244d0b 100644 --- a/presets/equipment.json +++ b/presets/equipment.json @@ -6,47 +6,47 @@ }, "2": { "name": "Картонные накладки", - "price": 1000, + "price": 350, "type": "equipment" }, "3": { "name": "Шлем танкиста", - "price": 1000, + "price": 10000, "type": "equipment" }, "4": { "name": "Кольчуга", - "price": 1000, + "price": 13000, "type": "equipment" }, "5": { "name": "Бронежилет M1", - "price": 1000, + "price": 25000, "type": "equipment" }, "6": { "name": "Бронежилет M2", - "price": 1000, + "price": 35000, "type": "equipment" }, "7": { "name": "Бронежилет M3", - "price": 1000, + "price": 60000, "type": "equipment" }, "8": { "name": "Бронежилет M4", - "price": 1000, + "price": 110000, "type": "equipment" }, "9": { "name": "Бронежилет M5", - "price": 1000, + "price": 150000, "type": "equipment" }, "10": { "name": "Бронежилет M6", - "price": 1000, + "price": 250000, "type": "equipment" } } \ No newline at end of file diff --git a/presets/weapons.json b/presets/weapons.json index ec04b6f..fc68af6 100644 --- a/presets/weapons.json +++ b/presets/weapons.json @@ -1,52 +1,82 @@ { "1": { - "name": "ПМ", - "price": 1000, + "name": "ТТ", + "price": 12000, "type": "weapon" }, "2": { - "name": "ТТ", - "price": 1000, + "name": "Glock 17", + "price": 7999, "type": "weapon" }, "3": { - "name": "FiveSeven", - "price": 1000, + "name": "G36C", + "price": 38999, "type": "weapon" }, "4": { - "name": "Deagle", - "price": 1000, + "name": "M1911", + "price": 13000, "type": "weapon" }, "5": { - "name": "AK47", - "price": 1000, + "name": "ПМ", + "price": 13000, "type": "weapon" }, "6": { - "name": "M4A1", - "price": 1000, + "name": "SIG MCX .300", + "price": 133999, "type": "weapon" }, "7": { - "name": "SCAR H", - "price": 1000, + "name": "АК101", + "price": 49999, "type": "weapon" }, "8": { - "name": "MP5", - "price": 1000, + "name": "HK UMP", + "price": 33999, "type": "weapon" }, "9": { - "name": "SCAR L", - "price": 1000, + "name": "ПП19 `Бизон`", + "price": 24999, "type": "weapon" }, "10": { - "name": "Glock", - "price": 1000, + "name": "АКС74У", + "price": 34999, + "type": "weapon" + }, + "11": { + "name": "M4A1", + "price": 56999, + "type": "weapon" + }, + "12": { + "name": "CheyTac M200 `Intervention`", + "price": 1400000, + "type": "weapon" + }, + "13": { + "name": "SR25", + "price": 259999, + "type": "weapon" + }, + "14": { + "name": "ВСС `Винторез`", + "price": 120999, + "type": "weapon" + }, + "15": { + "name": "HK417", + "price": 388999, + "type": "weapon" + }, + "16": { + "name": "СВД", + "price": 199999, "type": "weapon" } } \ No newline at end of file