vouchers update

Vouchers now with images
This commit is contained in:
Degradin 2023-09-28 18:04:40 +03:00
parent bbe91b03c3
commit 79b8b4939e
12 changed files with 1051 additions and 159 deletions

425
index.js
View File

@ -4,10 +4,14 @@ const {
Markup Markup
} = require('telegraf') } = require('telegraf')
const shortid = require('shortid'); const shortid = require('shortid');
const voucher_codes = require('voucher-code-generator');
const { createCanvas, loadImage } = require('canvas');
const fs = require('fs') const fs = require('fs')
const bot = new Telegraf(process.env.BOT_TOKEN) const bot = new Telegraf(process.env.BOT_TOKEN)
const weaponshop = require('./json/weaponshop.json') const weaponshop = require('./json/weaponshop.json')
const slots = require('./json/slots.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 houses = require('./presets/houses.json')
const cars = require('./presets/cars.json') const cars = require('./presets/cars.json')
const phones = require('./presets/mobiles.json') const phones = require('./presets/mobiles.json')
@ -23,8 +27,9 @@ const BusinessModel = require('./models/business.model');
const ReportModel = require('./models/report.model'); const ReportModel = require('./models/report.model');
const BlockModel = require('./models/block.model'); const BlockModel = require('./models/block.model');
const PromocodeModel = require('./models/promocode.model'); const PromocodeModel = require('./models/promocode.model');
const mainChat = -1001895132127
const adminList = [275416286] 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 topSym = ['🥇', '🥈', '🥉', '4⃣', '5⃣', '6⃣', '7⃣', '8⃣', '9⃣', '🔟']
const start = async () => { const start = async () => {
@ -65,10 +70,11 @@ bot.telegram.setMyCommands([{
bot.use(async (ctx, next) => { bot.use(async (ctx, next) => {
let id = ctx.from.id let id = ctx.from.id
let username = ctx.from.username let username = ctx.from.username
if(username == null) username = ctx.from.id
try { try {
console.log(getCurrentTime() + `: ` + username + `: ` + ctx.update.message.text) console.log(getCurrentTime() + `: ` + username + `: ` + ctx.update.message.text)
} catch (e) { } catch (e) {
console.log(getCurrentTime() + `: ${username}: Не удалось перехватить контекст.`) console.log(getCurrentTime() + `: ${username}: ${ctx.update.callback_query.data}`)
} }
let user = await UserModel.findByPk(id); let user = await UserModel.findByPk(id);
let block = await BlockModel.findByPk(id); let block = await BlockModel.findByPk(id);
@ -82,6 +88,7 @@ bot.use(async (ctx, next) => {
}) })
} else { } else {
user.name = ctx.from.first_name user.name = ctx.from.first_name
if(user.username === null) user.username = ctx.from.id
user.save() user.save()
} }
if (property === null) { if (property === null) {
@ -121,8 +128,9 @@ bot.command('start', async (ctx) => {
} }
return await ctx.reply('Главное меню', Markup return await ctx.reply('Главное меню', Markup
.keyboard([ .keyboard([
['😎 Профиль', '💳 Баланс'], // Row1 with 2 buttons ['😎 Профиль'], // Row1 with 2 buttons
['🗄️ Работать', '🌐 Организация', '🎁 Бонус', '🏯 Казино'], // Row2 with 2 buttons ['🗄️ Работать', '🌐 Организация', '🎁 Бонус', '🏯 Казино'], // Row2 with 2 buttons
['📦 Контейнеры'],
['📢 Вакансии', '🔵 Имущество', '📞 Пригласить'] // Row3 with 3 buttons ['📢 Вакансии', '🔵 Имущество', '📞 Пригласить'] // Row3 with 3 buttons
]) ])
.resize() .resize()
@ -132,20 +140,25 @@ bot.command('start', async (ctx) => {
bot.hears('▶️ Меню', async (ctx) => { bot.hears('▶️ Меню', async (ctx) => {
return await ctx.reply('Main Menu', Markup return await ctx.reply('Main Menu', Markup
.keyboard([ .keyboard([
['😎 Профиль', '💳 Баланс'], // Row1 with 2 buttons ['😎 Профиль'],
['🗄️ Работать', '🌐 Организация', '🎁 Бонус', '🏯 Казино'], // Row2 with 2 buttons ['🗄️ Работать', '🌐 Организация', '🎁 Бонус', '🏯 Казино'],
['📢 Вакансии', '🔵 Имущество', '📞 Пригласить'] // Row3 with 3 buttons ['📦 Контейнеры'],
['📢 Вакансии', '🔵 Имущество', '📞 Пригласить']
]) ])
.resize() .resize()
) )
}); });
bot.hears('Чат', async (ctx) => {
ctx.telegram.sendMessage(mainChat, `Automatic message`)
});
bot.hears('😎 Профиль', async (ctx) => { bot.hears('😎 Профиль', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id); let user = await UserModel.findByPk(ctx.from.id);
let property = await PropertyModel.findByPk(ctx.from.id); let property = await PropertyModel.findByPk(ctx.from.id);
if (!user) return ctx.reply(`Ошибка #1`); if (!user) return ctx.reply(`Ошибка #1`);
return ctx.replyWithMarkdownV2(` 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} 🆔: ${ctx.from.id}
📶 Уровень: ${user.level} \\| ${user.exp} / ${expToUp[user.level]} 📶 Уровень: ${user.level} \\| ${user.exp} / ${expToUp[user.level]}
@ -170,7 +183,7 @@ bot.command('getprofile', async (ctx) => {
let user = await UserModel.findByPk(id); let user = await UserModel.findByPk(id);
let property = await PropertyModel.findByPk(id); let property = await PropertyModel.findByPk(id);
return ctx.replyWithMarkdownV2(` 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} 🆔: ${ctx.from.id}
📶 Уровень: ${user.level} \\| ${user.exp} / ${expToUp[user.level]} 📶 Уровень: ${user.level} \\| ${user.exp} / ${expToUp[user.level]}
@ -661,7 +674,7 @@ bot.hears('Топ', async (ctx) => {
group: ['username', 'status'], group: ['username', 'status'],
where: { where: {
telegram_id: { telegram_id: {
[Op.ne]: 275416286 // игнорировать игрока с telegram_id 275416286 [Op.ne]: 275416286
} }
}, },
order: [ order: [
@ -671,7 +684,7 @@ bot.hears('Топ', async (ctx) => {
}) })
let text = `🏆 Топ 10 игроков по балансу.\n\n` let text = `🏆 Топ 10 игроков по балансу.\n\n`
for(i=0; i<topPlayer.length; i++){ for(i=0; i<topPlayer.length; i++){
text += `${topSym[i]}. ${topPlayer[i].status != 'user' ? `⚜️` : ""} ${topPlayer[i].username}${spaces(topPlayer[i].money)}]\n` text += `${topSym[i]}. ${topPlayer[i].status == 'bronze' ? `[🔺]` : ""}${topPlayer[i].status == 'silver' ? `[🔹]` : ""}${topPlayer[i].status == 'gold' ? `[🔸]` : ""} ${topPlayer[i].username}${spaces(topPlayer[i].money)}]\n`
} }
return await ctx.reply(text) return await ctx.reply(text)
@ -801,12 +814,13 @@ bot.action(/{"action": "buy"*/, async (ctx) => {
}) })
bot.hears('Поставщик', async (ctx) => { 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++) { 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() weaponShopUpdate()
return await ctx.reply(text) return await ctx.replyWithMarkdownV2(text + escape(shop), {disable_web_page_preview: true})
}) })
bot.command('sell', async (ctx) => { bot.command('sell', async (ctx) => {
@ -886,23 +900,91 @@ bot.hears('🌐 Организация', async (ctx) => {
owner: user.business.id owner: user.business.id
} }
}) })
return await ctx.replyWithMarkdown(`🏭 Организация\n_${business.name}_\n💹 Баланс: ¤${business.balance}\n🧰 Сырье: ${business.materials}\n👥 Рабочих: ${business.users.length}`, Markup.keyboard([ 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: `📶 Отработка`,
['🌐 Организация', '▶️ Меню'] // Row3 with 3 buttons callback_data: "workoff"
}, {
text: `⬅️ Покинуть`,
callback_data: "покинуть"
}]
]) ])
.oneTime()
.resize()) .resize())
} }
if (business.owner == ctx.from.id){ 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([ 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([
['📶 Отработка'], [{
['💸 Payday', '🌐 Организация', '▶️ Меню'] text: `📶 Отработка`,
callback_data: "workoff"
}, {
text: `💸 Payday`,
callback_data: "payday"
}]
]) ])
.oneTime()
.resize()) .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) 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({ 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) => { bot.action('user_leave_business', async (ctx) => {
let data = ctx.update.callback_query.data; let data = ctx.update.callback_query.data;
let user = await UserModel.findByPk(ctx.from.id) 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}`) return await bot.telegram.sendMessage(ctx.from.id, `🏭 Вы покинули ${business.name}`)
}) })
bot.hears('📶 Отработка', async (ctx) => { bot.action('payday', 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) => {
let user = null let user = null
let business = await BusinessModel.findOne({ let business = await BusinessModel.findOne({
where: { where: {
@ -1000,36 +1062,35 @@ bot.hears('💸 Payday', async (ctx) => {
for (i = 0; i < business.users.length; i++) { // Summary percent for (i = 0; i < business.users.length; i++) { // Summary percent
user = await UserModel.findByPk(business.users[i]) user = await UserModel.findByPk(business.users[i])
percentSum += Number(user.business.percent) 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}`) if (percentSum > 100) return await ctx.reply(`⚠️ Общий процент всех сотрудников превышает 100%\n Остаток процентов перенесется в баланс организации.\n\n${percentErrorText}\n`)
for (i = 0; i < business.users.length; i++) { // Общая внесенная сумма всеми участниками for (x = 0; x < business.users.length; x++) { // Общая внесенная сумма всеми участниками
user = await UserModel.findByPk(business.users[i]) user = await UserModel.findByPk(business.users[x])
profit += user.business.checks * moneyList profit += user.business.checks * moneyList * user.level
text += `${user.username} отработал ${user.business.checks} раз.\n` text += ` ${user.username} отработал ${user.business.checks} раз.\n`
user.business = { user.business = {
id: user.business.id, id: user.business.id,
checks: 0, checks: 0,
percent: user.business.percent percent: user.business.percent
} }
user.save() user.save()
} }
text += `Наработка за текущий период: ${profit}\n` text += ` 💹 Наработка за текущий период: ${profit}\n`
let profitCheck = profit let profitCheck = profit
for (i = 0; i < business.users.length; i++) { // Процент выплаты участникам for (n = 0; n < business.users.length; n++) { // Процент выплаты участникам
user = await UserModel.findByPk(business.users[i]) user = await UserModel.findByPk(business.users[n])
piece = Math.round(profit / 100 * user.business.percent) piece = Math.round(profit / 100 * user.business.percent)
profitCheck -= piece profitCheck -= piece
user.money += piece user.money += piece
text += ` ${user.username} получает ¤${piece}\n`
await bot.telegram.sendMessage(user.telegram_id, ` Директор организации сформировал выплаты.\n На ваш баланс поступило: ${spaces(piece)}`)
giveExp(user, business.checks) giveExp(user, business.checks)
user.save() user.save()
text += `${user.username} получает ¤${piece}\n`
await bot.telegram.sendMessage(user.telegram_id, `Директор организации сформировал выплаты.\n На ваш баланс поступило: ${spaces(piece)}`)
} }
if (profitCheck > 0) { if (profitCheck > 0) {
business.balance += profitCheck business.balance += profitCheck
text += `На баланс бизнеса поступило ¤${profitCheck}` text += ` На баланс бизнеса поступило ¤${profitCheck}`
} }
business.checks = 0 business.checks = 0
business.save() business.save()
@ -1056,23 +1117,25 @@ bot.command('orgmessage', async (ctx) => {
bot.command('materials', async (ctx) => { bot.command('materials', async (ctx) => {
ctx.args = ctx.update.message.text.split(' ') ctx.args = ctx.update.message.text.split(' ')
let user = await UserModel.findByPk(ctx.from.id) 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 world = await WorldModel.findByPk(1)
let business = await BusinessModel.findOne({ let business = await BusinessModel.findOne({
where: { where: {
owner: ctx.from.id.toString() owner: ctx.from.id.toString()
} }
}) })
if (business === null) return await ctx.reply(`У вас нет организации.`) if (business === null) return await ctx.reply(`🚫 У вас нет организации.`)
if (!ctx.args[1]) return ctx.reply(`Не указан аргумент.`) if (!ctx.args[1]) return ctx.reply(`🚫 Не указан аргумент.`)
if (!Number(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] < 1) return ctx.reply(` Минимальное количество для покупки - 1`)
if (ctx.args[1] > business.balance) return ctx.reply(`Недостаточно средств на балансе организации.`) 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]) let count = Number(ctx.args[1])
business.balance -= world.matPrice*count business.balance -= world.matPrice*count
business.materials += count business.materials += count
business.save() 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) => { bot.command('percent', async (ctx) => {
@ -1149,13 +1212,19 @@ bot.command('invite', async (ctx) => {
ctx.args = ctx.update.message.text.split(' ') ctx.args = ctx.update.message.text.split(' ')
if (!ctx.args[1]) return ctx.reply(`/invite [Nick]`) if (!ctx.args[1]) return ctx.reply(`/invite [Nick]`)
let user = await UserModel.findByPk(ctx.from.id) 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({ let invited = await UserModel.findOne({
where: { where: {
username: ctx.args[1] username: ctx.args[1]
} }
}); });
await bot.telegram.sendMessage(invited.telegram_id, 'Приглашение', Markup await bot.telegram.sendMessage(invited.telegram_id, '⤵️ Приглашение', Markup
.inlineKeyboard([ .inlineKeyboard([
[{ [{
text: `Принять`, 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.users = sequelize.fn('array_append', sequelize.col('users'), ctx.update.callback_query.from.id);
business.save() business.save()
user.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'){ 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() user.save()
world.save() world.save()
return setTimeout(() => { return setTimeout(() => {
ctx.reply(`Вы выиграли ${bet*win}`) ctx.reply(` Вы выиграли ¤${spaces(bet*win)}`)
}, 1700); }, 1700);
} }
if(win > 0 && win <= 4){ if(win > 0 && win <= 4){
await giveExp(user, win*2) await giveExp(user, win*2)
return setTimeout(() => { return setTimeout(() => {
ctx.reply(`Вы выиграли ${win*2} опыта.`) ctx.reply(` Вы выиграли ${win*2} опыта.`)
}, 1700); }, 1700);
} }
if(win == 0){ if(win == 0){
return setTimeout(() => { return setTimeout(() => {
world.save() world.save()
user.save() user.save()
ctx.reply(`Вы ничего не выиграли.`) ctx.reply(` Вы проиграли ¤${spaces(bet)}.`)
}, 1700); }, 1700);
} }
@ -1313,18 +1382,92 @@ bot.command('promocode', async (ctx) => {
code: ctx.args[1] code: ctx.args[1]
} }
}) })
if(promocode === null) 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.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.users.includes(ctx.from.id.toString())) return await ctx.reply(`⚠️ Вы уже активировали этот промокод.`)
console.log(promocode.users) console.log(promocode.users)
promocode.users = sequelize.fn('array_append', sequelize.col('users'), ctx.from.id.toString()); promocode.users = sequelize.fn('array_append', sequelize.col('users'), ctx.from.id.toString());
user.money += promocode.money user.money += promocode.money
user.save() user.save()
promocode.save() promocode.save()
await bot.telegram.sendMessage(adminList[0], `${user.username} активировал промокод.`) 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////////////////////////////////////////////////// /////////////////////////////////////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]`) if (!ctx.args[1] || !ctx.args[2] || !ctx.args[3]) return ctx.reply(`/createpromo [activations] [money] [code]`)
let promocode = await PromocodeModel.findOne({ let promocode = await PromocodeModel.findOne({
where: { where: {
code: ctx.args[1] code: ctx.args[3]
} }
}) })
if(promocode === null){ if(promocode === null){
@ -1377,7 +1520,36 @@ bot.command('createpromocode', async (ctx) => {
activations: ctx.args[1], activations: ctx.args[1],
money: ctx.args[2] 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(); if (typeof string !== "string") string = string.toString();
return string.split("").reverse().join("").match(/[0-9]{1,3}/g).join(".\\").split("").reverse().join(""); return string.split("").reverse().join("").match(/[0-9]{1,3}/g).join(".\\").split("").reverse().join("");
}; };
function escape(string) { function escape(text) {
string = string text = text
.replace("_", "\\_") .replace(/\_/g, '\\_')
.replace("*", "\\*") .replace(/\*/g, '\\*')
.replace("[", "\\[") .replace(/\[/g, '\\[')
.replace("`", "\\`"); .replace(/\]/g, '\\]')
return string .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() { Array.prototype.random = function() {
return this[Math.floor(this.length * Math.random())]; return this[Math.floor(this.length * Math.random())];
@ -1467,13 +1653,14 @@ function setCooldown(user, seconds, type) {
return cooldown return cooldown
} }
function giveExp(user, experience) { async function giveExp(user, experience) {
user.exp += experience user.exp += experience
for(i in expToUp){
if (user.exp >= expToUp[user.level]) { if (user.exp >= expToUp[user.level]) {
user.exp -= expToUp[user.level]
user.level += 1 user.level += 1
user.exp = 0
user.save() user.save()
bot.telegram.sendMessage(user.telegram_id, `Ваш уровень повысился до ${user.level}!`) await bot.telegram.sendMessage(user.telegram_id, `⤴️ Ваш уровень повысился до ${user.level}!`)}
} }
user.save() user.save()
} }
@ -1506,6 +1693,10 @@ async function matPriceUpdate() {
world.save() world.save()
} }
setTimeout(() => {
generatePromo()
}, 360000*3);
setInterval(() => { setInterval(() => {
var today = new Date(); var today = new Date();
let hours = today.getHours(); let hours = today.getHours();
@ -1515,6 +1706,58 @@ setInterval(() => {
} }
}, 360000); }, 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() start()
bot.launch() bot.launch()

97
json/rarecars.json Normal file
View File

@ -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"
}
]

57
json/simplecars.json Normal file
View File

@ -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"
}
]

View File

@ -1,52 +1,52 @@
{ {
"0": { "0": {
"name": "SCAR L", "name": "M1911",
"price": 1000, "price": 13000,
"type": "weapon" "type": "weapon"
}, },
"1": { "1": {
"name": "Deagle", "name": "ПМ",
"price": 1000, "price": 13000,
"type": "weapon" "type": "weapon"
}, },
"2": { "2": {
"name": "ПМ", "name": "АКС74У",
"price": 1000, "price": 34999,
"type": "weapon" "type": "weapon"
}, },
"3": { "3": {
"name": "Deagle", "name": "G36C",
"price": 1000, "price": 38999,
"type": "weapon" "type": "weapon"
}, },
"4": { "4": {
"name": "SCAR L", "name": "G36C",
"price": 1000, "price": 38999,
"type": "weapon" "type": "weapon"
}, },
"5": { "5": {
"name": "Бронежилет M4", "name": "Бронежилет M1",
"price": 1000, "price": 25000,
"type": "equipment" "type": "equipment"
}, },
"6": { "6": {
"name": "Бронежилет M6", "name": "Бронежилет M2",
"price": 1000, "price": 35000,
"type": "equipment" "type": "equipment"
}, },
"7": { "7": {
"name": "Бронежилет M5", "name": "Бронежилет M1",
"price": 1000, "price": 25000,
"type": "equipment" "type": "equipment"
}, },
"8": { "8": {
"name": "Картонные накладки", "name": "Бронежилет M2",
"price": 1000, "price": 35000,
"type": "equipment" "type": "equipment"
}, },
"9": { "9": {
"name": "Бронежилет M6", "name": "Бронежилет M3",
"price": 1000, "price": 60000,
"type": "equipment" "type": "equipment"
} }
} }

BIN
media/image.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

BIN
media/imageDefault.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

BIN
media/imageDefault2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 KiB

BIN
media/imageDefault3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

493
package-lock.json generated
View File

@ -9,6 +9,7 @@
"version": "1.0.0", "version": "1.0.0",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"canvas": "^2.11.2",
"date-fns": "^2.30.0", "date-fns": "^2.30.0",
"dotenv": "^16.3.1", "dotenv": "^16.3.1",
"fs": "^0.0.1-security", "fs": "^0.0.1-security",
@ -20,7 +21,8 @@
"sequelize": "^6.6.2", "sequelize": "^6.6.2",
"shortid": "^2.2.16", "shortid": "^2.2.16",
"telegraf": "^4.13.1", "telegraf": "^4.13.1",
"uuid": "^9.0.1" "uuid": "^9.0.1",
"voucher-code-generator": "^1.3.0"
} }
}, },
"node_modules/@babel/runtime": { "node_modules/@babel/runtime": {
@ -34,6 +36,53 @@
"node": ">=6.9.0" "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": { "node_modules/@sindresorhus/is": {
"version": "0.14.0", "version": "0.14.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
@ -79,6 +128,38 @@
"node": ">=6.5" "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": { "node_modules/ajv": {
"version": "6.12.6", "version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@ -154,6 +235,36 @@
"node": ">= 8" "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": { "node_modules/array.prototype.findindex": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/array.prototype.findindex/-/array.prototype.findindex-2.1.0.tgz", "resolved": "https://registry.npmjs.org/array.prototype.findindex/-/array.prototype.findindex-2.1.0.tgz",
@ -368,6 +479,20 @@
"node": ">=6" "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": { "node_modules/caseless": {
"version": "0.12.0", "version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
@ -424,6 +549,14 @@
"fsevents": "~2.3.1" "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": { "node_modules/ci-info": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "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", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" "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": { "node_modules/combined-stream": {
"version": "1.0.8", "version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@ -496,6 +637,11 @@
"node": ">=8" "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": { "node_modules/core-util-is": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
@ -591,6 +737,11 @@
"node": ">=0.4.0" "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": { "node_modules/depd": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
@ -599,6 +750,14 @@
"node": ">= 0.6" "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": { "node_modules/dot-prop": {
"version": "5.3.0", "version": "5.3.0",
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", "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", "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz",
"integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==" "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": { "node_modules/fsevents": {
"version": "2.3.2", "version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "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", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" "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": { "node_modules/get-intrinsic": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
@ -846,6 +1070,25 @@
"assert-plus": "^1.0.0" "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": { "node_modules/glob-parent": {
"version": "5.1.2", "version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
@ -956,6 +1199,11 @@
"url": "https://github.com/sponsors/ljharb" "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": { "node_modules/has-yarn": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
@ -983,6 +1231,39 @@
"npm": ">=1.3.7" "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": { "node_modules/ignore-by-default": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
@ -1012,6 +1293,15 @@
"node >= 0.4.0" "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": { "node_modules/inherits": {
"version": "2.0.4", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
@ -1387,9 +1677,9 @@
} }
}, },
"node_modules/minimatch": { "node_modules/minimatch": {
"version": "3.0.4", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dependencies": { "dependencies": {
"brace-expansion": "^1.1.7" "brace-expansion": "^1.1.7"
}, },
@ -1402,6 +1692,48 @@
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" "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": { "node_modules/moment": {
"version": "2.29.1", "version": "2.29.1",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", "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", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" "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": { "node_modules/nanoid": {
"version": "2.1.11", "version": "2.1.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz",
@ -1537,6 +1874,17 @@
"node": ">=8" "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": { "node_modules/oauth-sign": {
"version": "0.9.0", "version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
@ -1545,6 +1893,14 @@
"node": "*" "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": { "node_modules/object-inspect": {
"version": "1.10.2", "version": "1.10.2",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", "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", "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz",
"integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" "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": { "node_modules/performance-now": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
@ -1991,6 +2355,20 @@
"any-promise": "^1.3.0" "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": { "node_modules/safe-buffer": {
"version": "5.2.1", "version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@ -2152,6 +2530,11 @@
"uuid": "dist/bin/uuid" "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": { "node_modules/shortid": {
"version": "2.2.16", "version": "2.2.16",
"resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.16.tgz", "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", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
"integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" "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": { "node_modules/split2": {
"version": "3.2.2", "version": "3.2.2",
"resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
@ -2233,22 +2667,22 @@
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
}, },
"node_modules/string-width": { "node_modules/string-width": {
"version": "4.2.2", "version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dependencies": { "dependencies": {
"emoji-regex": "^8.0.0", "emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0", "is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.0" "strip-ansi": "^6.0.1"
}, },
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/string-width/node_modules/ansi-regex": { "node_modules/string-width/node_modules/ansi-regex": {
"version": "5.0.0", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
@ -2267,11 +2701,11 @@
} }
}, },
"node_modules/string-width/node_modules/strip-ansi": { "node_modules/string-width/node_modules/strip-ansi": {
"version": "6.0.0", "version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dependencies": { "dependencies": {
"ansi-regex": "^5.0.0" "ansi-regex": "^5.0.1"
}, },
"engines": { "engines": {
"node": ">=8" "node": ">=8"
@ -2331,6 +2765,22 @@
"node": ">=4" "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": { "node_modules/telegraf": {
"version": "4.13.1", "version": "4.13.1",
"resolved": "https://registry.npmjs.org/telegraf/-/telegraf-4.13.1.tgz", "resolved": "https://registry.npmjs.org/telegraf/-/telegraf-4.13.1.tgz",
@ -2602,6 +3052,11 @@
"extsprintf": "^1.2.0" "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": { "node_modules/webidl-conversions": {
"version": "3.0.1", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
@ -2631,6 +3086,14 @@
"url": "https://github.com/sponsors/ljharb" "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": { "node_modules/widest-line": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",

View File

@ -11,6 +11,7 @@
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"canvas": "^2.11.2",
"date-fns": "^2.30.0", "date-fns": "^2.30.0",
"dotenv": "^16.3.1", "dotenv": "^16.3.1",
"fs": "^0.0.1-security", "fs": "^0.0.1-security",
@ -22,6 +23,7 @@
"sequelize": "^6.6.2", "sequelize": "^6.6.2",
"shortid": "^2.2.16", "shortid": "^2.2.16",
"telegraf": "^4.13.1", "telegraf": "^4.13.1",
"uuid": "^9.0.1" "uuid": "^9.0.1",
"voucher-code-generator": "^1.3.0"
} }
} }

View File

@ -6,47 +6,47 @@
}, },
"2": { "2": {
"name": "Картонные накладки", "name": "Картонные накладки",
"price": 1000, "price": 350,
"type": "equipment" "type": "equipment"
}, },
"3": { "3": {
"name": "Шлем танкиста", "name": "Шлем танкиста",
"price": 1000, "price": 10000,
"type": "equipment" "type": "equipment"
}, },
"4": { "4": {
"name": "Кольчуга", "name": "Кольчуга",
"price": 1000, "price": 13000,
"type": "equipment" "type": "equipment"
}, },
"5": { "5": {
"name": "Бронежилет M1", "name": "Бронежилет M1",
"price": 1000, "price": 25000,
"type": "equipment" "type": "equipment"
}, },
"6": { "6": {
"name": "Бронежилет M2", "name": "Бронежилет M2",
"price": 1000, "price": 35000,
"type": "equipment" "type": "equipment"
}, },
"7": { "7": {
"name": "Бронежилет M3", "name": "Бронежилет M3",
"price": 1000, "price": 60000,
"type": "equipment" "type": "equipment"
}, },
"8": { "8": {
"name": "Бронежилет M4", "name": "Бронежилет M4",
"price": 1000, "price": 110000,
"type": "equipment" "type": "equipment"
}, },
"9": { "9": {
"name": "Бронежилет M5", "name": "Бронежилет M5",
"price": 1000, "price": 150000,
"type": "equipment" "type": "equipment"
}, },
"10": { "10": {
"name": "Бронежилет M6", "name": "Бронежилет M6",
"price": 1000, "price": 250000,
"type": "equipment" "type": "equipment"
} }
} }

View File

@ -1,52 +1,82 @@
{ {
"1": { "1": {
"name": "ПМ", "name": "ТТ",
"price": 1000, "price": 12000,
"type": "weapon" "type": "weapon"
}, },
"2": { "2": {
"name": "ТТ", "name": "Glock 17",
"price": 1000, "price": 7999,
"type": "weapon" "type": "weapon"
}, },
"3": { "3": {
"name": "FiveSeven", "name": "G36C",
"price": 1000, "price": 38999,
"type": "weapon" "type": "weapon"
}, },
"4": { "4": {
"name": "Deagle", "name": "M1911",
"price": 1000, "price": 13000,
"type": "weapon" "type": "weapon"
}, },
"5": { "5": {
"name": "AK47", "name": "ПМ",
"price": 1000, "price": 13000,
"type": "weapon" "type": "weapon"
}, },
"6": { "6": {
"name": "M4A1", "name": "SIG MCX .300",
"price": 1000, "price": 133999,
"type": "weapon" "type": "weapon"
}, },
"7": { "7": {
"name": "SCAR H", "name": "АК101",
"price": 1000, "price": 49999,
"type": "weapon" "type": "weapon"
}, },
"8": { "8": {
"name": "MP5", "name": "HK UMP",
"price": 1000, "price": 33999,
"type": "weapon" "type": "weapon"
}, },
"9": { "9": {
"name": "SCAR L", "name": "ПП19 `Бизон`",
"price": 1000, "price": 24999,
"type": "weapon" "type": "weapon"
}, },
"10": { "10": {
"name": "Glock", "name": "АКС74У",
"price": 1000, "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" "type": "weapon"
} }
} }