CampFirePlay/index.js
Degradin bbe91b03c3 v0.0.73-79
• После отработки пишется общее количество отработок.
• Добавлена система промокодов.
• Добавлен список правил в "Помощь".
• Добавлена система привелегий.
• Обновлен вывод пользователей в "Топ"
• Общие исправления.
Переработан магазин.
Проработка внешнего вида команд.
2023-09-27 01:24:38 +03:00

1520 lines
64 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

require('dotenv').config()
const {
Telegraf,
Markup
} = require('telegraf')
const shortid = require('shortid');
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 houses = require('./presets/houses.json')
const cars = require('./presets/cars.json')
const phones = require('./presets/mobiles.json')
const weapons = require('./presets/weapons.json')
const equipment = require('./presets/equipment.json')
const sequelize = require('./db');
const { Op } = require('sequelize');
const UserModel = require('./models/user.model');
const WorldModel = require('./models/world.model');
const JobModel = require('./models/job.model');
const PropertyModel = require('./models/property.model');
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 adminList = [275416286]
const expToUp = [0, 10, 20, 40, 60, 80, 120, 150, 200, 500, 1000]
const topSym = ['🥇', '🥈', '🥉', '4⃣', '5⃣', '6⃣', '7⃣', '8⃣', '9⃣', '🔟']
const start = async () => {
try {
await sequelize.authenticate()
await sequelize.sync()
} catch (e) {
console.log('Подключение к бд сломалось', e)
}
}
bot.telegram.setMyCommands([{
command: "pay",
description: "Перевести указанному пользователю сумму."
},
{
command: "buy",
description: "Приобрести указанное имущество."
},
{
command: "business",
description: "Создать организацию."
},
{
command: "invite",
description: "Пригласить пользователя в организацию."
},
{
command: "percent",
description: "Установить пользователю процент заработка."
},
{
command: "report",
description: "Создать жалобу/обращение/идею."
}
])
bot.use(async (ctx, next) => {
let id = ctx.from.id
let username = ctx.from.username
try {
console.log(getCurrentTime() + `: ` + username + `: ` + ctx.update.message.text)
} catch (e) {
console.log(getCurrentTime() + `: ${username}: Не удалось перехватить контекст.`)
}
let user = await UserModel.findByPk(id);
let block = await BlockModel.findByPk(id);
let property = await PropertyModel.findByPk(id);
if (!user) ctx.reply(`❕ Первичная регистрация профиля.`);
if (user === null) {
await UserModel.create({
telegram_id: id,
username: username,
name: ctx.from.first_name
})
} else {
user.name = ctx.from.first_name
user.save()
}
if (property === null) {
await PropertyModel.create({
telegram_id: id
})
} else {}
//if (whitelist.includes(id) == false) return ctx.reply(`У вас пока нет доступа к боту. Следите за обновлениями в группе: t.me/CampFireGameBotNews`)
if (block !== null) {
if (block.isBlocked == true && block.time > Date.now() / 1000) return ctx.reply(`📛 У вас активная блокировка по причине: ${block.reason}.\n⏲️ Оставшееся время: ${Math.trunc((block.time - Date.now()/1000)/60)} мин.`)
block.isBlocked = false
block.save()
}
const start = Date.now()
return next().then(() => {
const ms = Date.now() - start
console.log('response time %sms', ms)
})
})
bot.command('start', async (ctx) => {
if (ctx.payload) {
let id = ctx.from.id
let user = await UserModel.findByPk(id);
if (user.level == 1) {
let ref = await UserModel.findByPk(ctx.payload)
let world = await WorldModel.findByPk(1)
world.balance -= 25000
ref.money += Number(25000)
await ref.save()
await world.save()
bot.telegram.sendMessage(ref.telegram_id, `${ctx.from.username} зарегистрировался по вашей реферальной ссылке. Получено ¤25.000`)
console.log("Transaction to Ref")
} else {
console.log("Exist")
}
}
return await ctx.reply('Главное меню', Markup
.keyboard([
['😎 Профиль', '💳 Баланс'], // Row1 with 2 buttons
['🗄️ Работать', '🌐 Организация', '🎁 Бонус', '🏯 Казино'], // Row2 with 2 buttons
['📢 Вакансии', '🔵 Имущество', '📞 Пригласить'] // Row3 with 3 buttons
])
.resize()
)
})
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) => {
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' ? "✅" : ""}
🆔: ${ctx.from.id}
📶 Уровень: ${user.level} \\| ${user.exp} / ${expToUp[user.level]}
⏩ Повышается за различные действия\\.
💰 Баланс
¤${spacesWithMarkdown(user.money)}
🔵 Имущество
🏠 Жилье: ${property.house == 0 ? "Бездомный" : property.house.name}
🚗 Автомобиль: ${property.car == 0 ? "Пешком" : property.car.name}
📱 Телефон: ${property.mobile == 0 ? "Нет" : property.mobile.name}
🔫 Оружие: ${property.weapon == 0 ? "Безоружный" : property.weapon.name}
🥼 Экипировка: ${property.equipment == 0 ? "Нет" : property.equipment.name}
`);
});
bot.command('getprofile', async (ctx) => {
if(!ctx.message.reply_to_message) return await ctx.reply(`Только на пересланное сообщение.`)
let id = ctx.message.reply_to_message.from.id
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" : ""}
🆔: ${ctx.from.id}
📶 Уровень: ${user.level} \\| ${user.exp} / ${expToUp[user.level]}
⏩ Повышается за различные действия\\.
💰 Баланс
¤${spacesWithMarkdown(user.money)}
🔵 Имущество
🏠 Жилье: ${property.house == 0 ? "Бездомный" : property.house.name}
🚗 Автомобиль: ${property.car == 0 ? "Пешком" : property.car.name}
📱 Телефон: ${property.mobile == 0 ? "Нет" : property.mobile.name}
🔫 Оружие: ${property.weapon == 0 ? "Безоружный" : property.weapon.name}
🥼 Экипировка: ${property.equipment == 0 ? "Нет" : property.equipment.name}
`);
});
bot.hears('Рандом', async (ctx) => {
let users = await UserModel.findAll();
let chosenOne = users.random()
return ctx.reply(`
👤 ${chosenOne.username}
🆔: ${chosenOne.telegram_id}
`);
});
bot.hears('💳 Баланс', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id);
return ctx.reply(`
⏩ Аккаунт игрока ${user.username}
🆔 Игрока: ${user.telegram_id}
📶 Уровень: ${user.level}
⏩ Повышается за различные действия.
💰 Баланс:
¤${user.money}
`);
})
bot.hears('🎁 Бонус', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id);
if (!user) return ctx.reply(`Ошибка #1`);
let bonustime = user.bonustime
let cooldown = setCooldown(user, 3600, bonustime)
if (user.bonustime > cooldown.currentTime) return ctx.reply(`📛 Забрать бонус можно будет через ${cooldown.timeLeftInMinutes} минут(у/ы)`);
user.bonus = 1;
user.bonustime = cooldown.endTime
let world = await WorldModel.findByPk(1)
let text = ``;
let money = [100, 200, 300, 400, 500, 1000].random();
if (user.level >= 5) {
money += money;
}
let r = rand(1, 2);
let x = rand(2, 7);
if (r == 1) {
text += `⏩ ¤${money}\n`;
}
if (r == 2) {
money = money*x
text += `⏩ ¤${money}\n`;
}
switch(user.status){
case 'bronze':
user.money += 5000
text += `⭐ Дополнительный бонус за Bronze:\n⏩ ¤5.000\n`
break;
case 'silver':
user.money += 15000
text += `⭐ Дополнительный бонус за Silver:\n⏩ ¤15.000\n`
break;
case 'gold':
user.money += 30000
text += `⭐ Дополнительный бонус за Gold:\n⏩ ¤30.000\n`
break;
}
user.money += money;
world.balance -= money
if (user.business.id == 0){
await user.save();
await world.save();
return ctx.reply(`
⭐ Из ежечасного бонуса Вам выпало:
${text}
`)
}
let business = await BusinessModel.findOne({
where: {
owner: user.business.id
}
})
if(business != null){
let mats = rand(3, 10)
switch(user.status){
case 'bronze':
business.materials += 5
text += `⭐ Дополнительный бонус за Bronze:\n⏩ 5 материалов\n`
break;
case 'silver':
business.materials += 10
text += `⭐ Дополнительный бонус за Silver:\n⏩ 10 материалов\n`
break;
case 'gold':
business.materials += 20
text += `⭐ Дополнительный бонус за Gold:\n⏩ 20 материалов\n`
break;
}
text += `${mats} материалов в организацию\n`
business.materials += mats
business.save()
}
await user.save();
await world.save();
return ctx.reply(`
⭐ Из ежечасного бонуса Вам выпало:
${text}
`)
})
bot.command('pay', async (ctx) => {
ctx.args = ctx.update.message.text.split(' ')
if (!ctx.args[1] || !ctx.args[2]) return ctx.reply(`/pay [Никнейм] [Сумма]`)
if (!Number(ctx.args[2])) return ctx.reply(`❕ Сумма должна быть числовая.`)
let sender = await UserModel.findByPk(ctx.from.id);
let receiver = await UserModel.findOne({
where: {
username: ctx.args[1]
}
});
let world = await WorldModel.findByPk(1)
let fee = Number(Math.trunc(ctx.args[2] / 100 * world.transactionfee))
if (ctx.args[2] == 0 || ctx.args[2] < 100) return ctx.reply(`❕ Минимальная сумма перевода ¤100.`)
if (sender.money < ctx.args[2]) return ctx.reply(`❕ Недостаточно средств!`)
if (sender.money < Number(ctx.args[2]) + fee) return ctx.reply(`❕ Недостаточно средств для перевода с комиссией!`)
sender.money -= Number(ctx.args[2])
sender.money -= Number(fee)
world.balance += Number(fee)
await sender.save();
await world.save();
receiver.money += Number(ctx.args[2])
await receiver.save();
let pmToReceiver = `🔽 Входящий перевод.\n\n🔼 Отправитель: ${sender.username}\n🆔 Отправителя: ${sender.telegram_id}\n🔢 Сумма: ¤${ctx.args[2]}\n🆕 Ваш баланс: ¤${receiver.money}
`
bot.telegram.sendMessage(receiver.telegram_id, pmToReceiver)
return ctx.reply(`🔼 Исходящий перевод.\n\n🔽 Получатель: ${receiver.username}\n🆔 Получателя: ${receiver.telegram_id}\n🔢 Сумма: ¤${ctx.args[2]}\n Комиссия: ¤${fee}\n🆕 Ваш баланс: ¤${sender.money}
`)
})
bot.hears('Мир', async (ctx) => {
let world = await WorldModel.findByPk(1)
return ctx.reply(`🔰 Баланс мира: ¤${spaces(world.balance)}\n Стоимость материалов: ¤${spaces(world.matPrice)}
`)
})
bot.hears('📞 Пригласить', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id);
return ctx.reply(`
Для приглашения друга по реферальной системе, отправьте ему ссылку-приглашение
Как только он перейдет по ней и начнет игру, Вы получите ¤25.000.
Ваша ссылка: https://t.me/CampFireGameBot?start=${user.telegram_id}
`)
})
bot.hears('📢 Вакансии', async (ctx) => {
return await ctx.reply('Список работы', Markup
.inlineKeyboard([
[{
text: `Дворник [1 уровень]`,
callback_data: 'job_1'
}, {
text: `Промоутер [1 уровень]`,
callback_data: 'job_2'
}], [{
text: `Официант [2 уровень]`,
callback_data: 'job_3'
}, {
text: `Бармен [3 уровень]`,
callback_data: 'job_4'
}], [{
text: `Кассир [4 уровень] `,
callback_data: 'job_5'
}, {
text: `ПВЗ Дикие Ягоды [4 уровень]`,
callback_data: 'job_6'
}], [{
text: `Слесарь [5 уровень]`,
callback_data: 'job_7'
}], [{
text: `💤 Уволиться`,
callback_data: 'job_leave'
}]
])
.resize()
)
})
bot.action(/job_(1|2|3|4|5|6|7|leave)/, async (ctx) => {
let data = ctx.update.callback_query.data;
let user = await UserModel.findByPk(ctx.from.id);
let job = null
switch(data){
case `job_1`:
job = await JobModel.findByPk(1);
if (user.level < job.level) {
return await ctx.reply(`У вас не хватает уровня для этой работы.`)
}
if (user.job == 0) {
user.job = 1
user.save()
return await ctx.reply(` Вы устроились на работу дворником.\nВаш оклад: ¤${job.salary}\nПриступайте к работе командой "Работать"`)
}
return await ctx.reply(`❕ Вы уже устроены на другую работу`)
case `job_2`:
job = await JobModel.findByPk(2);
if (user.level < job.level) {
return await ctx.reply(`У вас не хватает уровня для этой работы.`)
}
if (user.job == 0) {
user.job = 2
user.save()
return await ctx.reply(` Вы устроились на работу промоутером. \nВаш оклад: ¤${job.salary}\nПриступайте к работе командой "Работать"`)
}
return await ctx.reply(`❕ Вы уже устроены на другую работу`)
case `job_3`:
job = await JobModel.findByPk(3);
if (user.level < job.level) {
return await ctx.reply(`У вас не хватает уровня для этой работы.`)
}
if (user.job == 0) {
user.job = 3
user.save()
return await ctx.reply(` Вы устроились на работу официантом. \nВаш оклад: ¤${job.salary}\nПриступайте к работе командой "Работать"`)
}
return await ctx.reply(`❕ Вы уже устроены на другую работу`)
case `job_4`:
job = await JobModel.findByPk(4);
if (user.level < job.level) {
return await ctx.reply(`У вас не хватает уровня для этой работы.`)
}
if (user.job == 0) {
user.job = 4
user.save()
return await ctx.reply(` Вы устроились на работу барменом. \nВаш оклад: ¤${job.salary}\nПриступайте к работе командой "Работать"`)
}
return await ctx.reply(`❕ Вы уже устроены на другую работу`)
case `job_5`:
job = await JobModel.findByPk(5);
if (user.level < job.level) {
return await ctx.reply(`У вас не хватает уровня для этой работы.`)
}
if (user.job == 0) {
user.job = 5
user.save()
return await ctx.reply(`❕ Вы устроились на работу кассиром. \nВаш оклад: ¤${job.salary}\nПриступайте к работе командой "Работать"`)
}
return await ctx.reply(` Вы уже устроены на другую работу`)
case `job_6`:
job = await JobModel.findByPk(6);
if (user.level < job.level) {
return await ctx.reply(`У вас не хватает уровня для этой работы.`)
}
if (user.job == 0) {
user.job = 6
user.save()
return await ctx.reply(` Вы устроились на работу в ПВЗ Дикие Ягоды. \nВаш оклад: ¤${job.salary}\nПриступайте к работе командой "Работать"`)
}
return await ctx.reply(`❕ Вы уже устроены на другую работу`)
case `job_7`:
job = await JobModel.findByPk(7);
if (user.level < job.level) {
return await ctx.reply(`У вас не хватает уровня для этой работы.`)
}
if (user.job == 0) {
user.job = 7
user.save()
return await ctx.reply(` Вы устроились на работу слесарем. \nВаш оклад: ¤${job.salary}\nПриступайте к работе командой "Работать"`)
}
return await ctx.reply(`❕ Вы уже устроены на другую работу`)
case `job_leave`:
if (user.job != 0) {
user.job = 0
user.save()
return await ctx.reply(` Теперь вы безработный.`)
}
return await ctx.reply(`❕ Вы итак безработный.`)
}
})
bot.hears('🏯 Казино', async (ctx) => {
return await ctx.reply('🏯 Добро пожаловать в казино "杜明"\n', Markup
.keyboard([
['🎰 Слоты'],
['▶️ Меню']
])
.resize()
)
})
bot.hears('🗄️ Работать', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id);
let job = await JobModel.findByPk(user.job);
let world = await WorldModel.findByPk(1)
let timer = user.jobtime
let cooldown = setCooldown(user, 3600, timer)
if (user.jobtime > cooldown.currentTime) return ctx.reply(`📛 Работать можно будет через ${cooldown.timeLeftInMinutes} минут(у/ы)`);
if (user.job == 0) {
return await ctx.reply(`📛 Вы безработный.`)
}
user.jobtime = Number(cooldown.endTime)
let jobExp = job.exp;
user.jobcheck++
switch (user.job) {
case 1:
if (user.jobcheck >= 4) {
let paydayfee = job.salary / 100 * world.transactionfee
let payday = job.salary - paydayfee
world.balance -= payday
user.money += payday
giveExp(user, jobExp)
user.jobcheck = 0
user.save()
world.save()
return ctx.reply(`👔 Вы отработали смену дворника. \n🧾 Расчетный лист: \n⏳ Отработано часов: 4/4 \n💸 Оклад: ¤${job.salary} \n Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ¤${payday}`)
} else {
user.save()
return ctx.reply(`👔 Вы подмели дворы. \n⏳ Отработано часов: ${user.jobcheck}/4`)
}
break;
case 2:
if (user.jobcheck >= 2) {
let paydayfee = job.salary / 100 * world.transactionfee
let payday = job.salary - paydayfee
world.balance -= payday
user.money += payday
giveExp(user, jobExp)
user.jobcheck = 0
user.save()
world.save()
return ctx.reply(`👔 Вы отработали смену промоутера. \n🧾 Расчетный лист: \n⏳ Отработано часов: 2/2 \n💸 Оклад: ¤${job.salary} \n Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ¤${payday}`)
} else {
user.save()
return ctx.reply(`👔 Вы раздавали листовки целый час. \n⏳ Отработано часов: ${user.jobcheck}/2`)
}
break;
case 3:
if (user.jobcheck >= 4) {
let paydayfee = job.salary / 100 * world.transactionfee
let payday = job.salary - paydayfee
world.balance -= payday
let tips = [50, 100, 200, 500, 1000].random()
user.money += tips
user.money += payday
giveExp(user, jobExp)
user.jobcheck = 0
user.save()
world.save()
return ctx.reply(`👔 Вы отработали смену официанта. \n🧾 Расчетный лист: \n⏳ Отработано часов: 4/4 \n💸 Оклад: ¤${job.salary} \n Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ¤${payday} \n💰 Получено чаевых: ¤${tips}`)
} else {
let tips = [50, 100, 200, 500, 1000].random()
user.money += tips
user.save()
return ctx.reply(`👔 Вы целый час бегали и отрабатывали заказы. \n🧾 Получено чаевых: ¤${tips} \n⏳ Отработано часов: ${user.jobcheck}/4`)
}
break;
case 4:
if (user.jobcheck >= 5) {
let paydayfee = job.salary / 100 * world.transactionfee
let payday = job.salary - paydayfee
world.balance -= payday
let tips = [50, 100, 200, 300, 500, 1000, 2000].random()
world.balance -= tips
user.money += tips
user.money += payday
giveExp(user, jobExp)
user.jobcheck = 0
user.save()
world.save()
return ctx.reply(`👔 Вы отработали смену бармена. \n🧾 Расчетный лист: \n⏳ Отработано часов: 5/5 \n💸 Оклад: ¤${job.salary} \n Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ¤${payday} \n💰 Получено чаевых: ¤${tips}`)
} else {
let tips = [50, 100, 200, 300, 500, 1000, 2000].random()
world.balance -= tips
user.money += tips
user.save()
world.save()
return ctx.reply(`👔 Вы целый час стояли за стойкой и разливали пойло. \n🧾 Получено чаевых: ¤${tips} \n⏳ Отработано часов: ${user.jobcheck}/5`)
}
break;
case 5:
if (user.jobcheck >= 5) {
let paydayfee = job.salary / 100 * world.transactionfee
let payday = job.salary - paydayfee
world.balance -= payday
user.money += payday
giveExp(user, jobExp)
user.jobcheck = 0
user.save()
world.save()
return ctx.reply(`👔 Вы отработали смену кассира. \n🧾 Расчетный лист: \n⏳ Отработано часов: 5/5 \n💸 Оклад: ¤${job.salary} \n Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ¤${payday}`)
} else {
user.save()
return ctx.reply(`👔 Вы целый час обслуживали покупателей и кричали: "Гаааляяя, отмена!". \n⏳ Отработано часов: ${user.jobcheck}/5`)
}
break;
case 6:
if (user.jobcheck >= 6) {
let paydayfee = job.salary / 100 * world.transactionfee
let payday = job.salary - paydayfee
let stealed = [{
name: "Помада",
price: 200
}, {
name: "Бюстгалтер",
price: 1300
}, {
name: "Прокладки",
price: 250
}, {
name: "Перцовый балончик",
price: 600
}, {
name: "Гитара",
price: 6500
}, {
name: "Комбик",
price: 9000
}, {
name: "Кроссовки",
price: 2000
}, {
name: "Шампунь",
price: 180
}, {
name: "Смартфон Texno",
price: 6999
}, {
name: "TWS Гарнитура",
price: 2800
}, {
name: "Геймпад GameStation 5",
price: 1400
}, {
name: "Дилдо",
price: 600
}, {
name: "Вагиноимитатор",
price: 600
}].random()
world.balance -= payday
world.balance -= Number(stealed.price)
user.money += payday
user.money += Number(stealed.price)
giveExp(user, jobExp)
user.jobcheck = 0
user.save()
world.save()
return ctx.reply(`👔 Вы отработали смену в Диких Ягодах. \n🧾 Расчетный лист: \n⏳ Отработано часов: 6/6 \n💸 Оклад: ¤${job.salary} \n Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ¤${payday} \n💰 Вы украли и продали со склада: ${stealed.name}${stealed.price})`)
} else {
user.save()
return ctx.reply(`👔 Вы целый час выдавали заказы в Диких Ягодах. \n⏳ Отработано часов: ${user.jobcheck}/6`)
}
break;
case 7:
if (user.jobcheck >= 6) {
let paydayfee = job.salary / 100 * world.transactionfee
let payday = job.salary - paydayfee
world.balance -= payday
user.money += payday
giveExp(user, jobExp)
user.jobcheck = 0
user.save()
world.save()
return ctx.reply(`👔 Вы отработали смену слесарем. \n🧾 Расчетный лист: \n⏳ Отработано часов: 6/6 \n💸 Оклад: ¤${job.salary} \n Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ¤${payday}`)
} else {
user.save()
return ctx.reply(`👔 Вы целый час работали на заводе, вы молодец! \n⏳ Отработано часов: ${user.jobcheck}/6`)
}
break;
}
})
bot.hears('Топ', async (ctx) => {
let topPlayer = await UserModel.findAll({
attributes: ['username', [sequelize.fn('sum', sequelize.col('money')), 'money'], 'status'],
group: ['username', 'status'],
where: {
telegram_id: {
[Op.ne]: 275416286 // игнорировать игрока с telegram_id 275416286
}
},
order: [
[sequelize.literal('money'), 'DESC']
],
limit: 10
})
let text = `🏆 Топ 10 игроков по балансу.\n\n`
for(i=0; i<topPlayer.length; i++){
text += `${topSym[i]}. ${topPlayer[i].status != 'user' ? `⚜️` : ""} ${topPlayer[i].username}${spaces(topPlayer[i].money)}]\n`
}
return await ctx.reply(text)
})
bot.hears('🔵 Имущество', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id);
return await ctx.reply(`Выберите тип`, Markup
.inlineKeyboard([
[
{text: 'Жилье', callback_data: `shop_house`},
{text: 'Телефоны', callback_data: `shop_phone`},
{text: 'Автосалон', callback_data: `shop_car`}
]
])
.resize())
})
bot.action('shopmenu', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id);
return await ctx.editMessageText(`Выберите тип`, Markup
.inlineKeyboard([
[
{text: 'Жилье', callback_data: `shop_house`},
{text: 'Телефоны', callback_data: `shop_phone`},
{text: 'Автосалон', callback_data: `shop_car`}
]
])
.resize())
})
bot.action(/shop_(house|phone|car)/, async (ctx) => {
let data = ctx.update.callback_query.data;
let prodArray = []
let text = `Доступно к покупке:\n`
switch(data){
case `shop_house`:
for (i in houses) {
prodArray.push({text: i, callback_data: `{"action": "buy", "type": "house", "value": "${i}"}`})
text += i + `. ${houses[i].name}${houses[i].price})\n`
}
break;
case `shop_phone`:
for (i in phones) {
prodArray.push({text: i, callback_data: `{"action": "buy", "type": "phone", "value": "${i}"}`})
text += i + `. ${phones[i].name}${phones[i].price})\n`
}
break;
case `shop_car`:
for (i in cars) {
prodArray.push({text: i, callback_data: `{"action": "buy", "type": "car", "value": "${i}"}`})
text += i + `. ${cars[i].name}${cars[i].price})\n`
}
break;
}
prodArray.push({text: `Назад`, callback_data: `shopmenu`})
let rows = []
while (prodArray.length > 0) {
rows.push(prodArray.splice(0, 5)) // разбиваем на подмассивы по 5 кнопок
}
return await ctx.editMessageText(text, Markup
.inlineKeyboard(rows)
.resize())
})
bot.action(/{"action": "buy"*/, async (ctx) => {
let data = ctx.update.callback_query.data;
data = JSON.parse(data)
let user = await UserModel.findByPk(ctx.from.id)
let property = await PropertyModel.findByPk(ctx.from.id);
let world = await WorldModel.findByPk(1)
if (data.type == "house") {
if (user.money < houses[data.value].price) return await ctx.reply(`У вас недостаточно средств!`)
if (property.house.name) return await ctx.reply(`У вас уже есть дом.`)
user.money -= houses[data.value].price
world.balance += houses[data.value].price
property.house = houses[data.value]
await user.save()
await world.save()
await property.save()
return await ctx.reply(`Вы купили ${houses[data.value].name}`)
}
if (data.type == "car") {
if (user.money < cars[data.value].price) return await ctx.reply(`У вас недостаточно средств!`)
if (property.car.name) return await ctx.reply(`У вас уже есть автомобиль.`)
if (!property.house.name) return await ctx.reply(`Для покупки автомобиля, у Вас должен быть дом.`)
user.money -= cars[data.value].price
world.balance += cars[data.value].price
property.car = cars[data.value]
await user.save()
await world.save()
await property.save()
return await ctx.reply(`Вы купили ${cars[data.value].name}`)
}
if (data.type == "phone") {
if (user.money < phones[data.value].price) return await ctx.reply(`У вас недостаточно средств!`)
if (property.mobile.name) return await ctx.reply(`У вас уже есть телефон.`)
user.money -= phones[data.value].price
world.balance += phones[data.value].price
property.mobile = phones[data.value]
await user.save()
await world.save()
await property.save()
return await ctx.reply(`Вы купили ${phones[data.value].name}`)
}
if (data.type == "equipment") {
if (user.money < weaponshop[data.value].price) return await ctx.reply(`У вас недостаточно средств!`)
if (data.type == weaponshop[data.value].type) {
if (property.equipment.name) return await ctx.reply(`У вас уже есть экипировка.`)
user.money -= weaponshop[data.value].price
world.balance += weaponshop[data.value].price
property.equipment = weaponshop[data.value]
await user.save()
await world.save()
await property.save()
return await ctx.reply(`Вы купили ${weaponshop[data.value].name}`)
}
if (property.weapon.name) return await ctx.reply(`У вас уже есть оружие.`)
user.money -= weaponshop[data.value].price
world.balance += weaponshop[data.value].price
property.weapon = weaponshop[data.value]
await user.save()
await world.save()
await property.save()
return await ctx.reply(`Вы купили ${weaponshop[data.value].name}`)
}
})
bot.hears('Поставщик', async (ctx) => {
let text = `Вы подходите к зданию с вывеской "Ништяки Хаткейса".\nВлад Хаткейс: "Вот мой ассортимент на сегодня:"\n`
for (i = 0; i < 10; i++) {
text += `${i}. ${weaponshop[i].name}${weaponshop[i].price}) [/buy equipment ${i}]\n`
}
weaponShopUpdate()
return await ctx.reply(text)
})
bot.command('sell', async (ctx) => {
ctx.args = ctx.update.message.text.split(' ')
let user = await UserModel.findByPk(ctx.from.id)
let property = await PropertyModel.findByPk(ctx.from.id);
let world = await WorldModel.findByPk(1)
if (!ctx.args[1]) return ctx.reply(`Не указан аргумент.`)
if (ctx.args[1] == "house") {
if (!property.house.name) return await ctx.reply(`У вас нет дома.`)
let name = property.house.name
user.money += Math.round(property.house.price/2)
world.balance -= Math.round(property.house.price/2)
property.house = 0
await user.save()
await world.save()
await property.save()
return await ctx.reply(`Вы продали ${name}`)
}
if (ctx.args[1] == "car") {
if (!property.car.name) return await ctx.reply(`У вас нет автомобиля.`)
let name = property.car.name
user.money += Math.round(property.car.price/2)
world.balance -= Math.round(property.car.price/2)
property.car = 0
await user.save()
await world.save()
await property.save()
return await ctx.reply(`Вы продали ${name}`)
}
if (ctx.args[1] == "phone") {
if (!property.mobile.name) return await ctx.reply(`У вас нет телефона.`)
let name = property.mobile.name
user.money += Math.round(property.mobile.price/2)
world.balance -= Math.round(property.mobile.price/2)
property.mobile = 0
await user.save()
await world.save()
await property.save()
return await ctx.reply(`Вы продали ${name}`)
}
if (ctx.args[1] == "equipment") {
if (!property.equipment.name) return await ctx.reply(`У вас нет экипировки.`)
let name = property.equipment.name
user.money += Math.round(property.equipment.price/2)
world.balance -= Math.round(property.equipment.price/2)
property.equipment = 0
await user.save()
await world.save()
await property.save()
return await ctx.reply(`Вы продали ${name}`)
}
if (ctx.args[1] == "weapon") {
if (!property.weapon.name) return await ctx.reply(`У вас нет оружия.`)
let name = property.weapon.name
user.money += Math.round(property.weapon.price/2)
world.balance -= Math.round(property.weapon.price/2)
property.weapon = 0
await user.save()
await world.save()
await property.save()
return await ctx.reply(`Вы продали ${name}`)
}
})
bot.hears('🌐 Организация', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id)
if (user.business.id == 0) return await ctx.reply(`Вы не состоите в организации.`)
let business = await BusinessModel.findOne({
where: {
owner: ctx.from.id.toString()
}
})
if(business === null){
business = await BusinessModel.findOne({
where: {
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
])
.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', '🌐 Организация', '▶️ Меню']
])
.resize())
}
})
bot.hears('⬅️ Покинуть', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id)
if (user.business.id == 0) return await ctx.reply(`Вы не состоите в организации.`)
let business = await BusinessModel.findOne({
where: {
owner: ctx.from.id.toString()
}
})
if(business === null){
business = await BusinessModel.findOne({
where: {
owner: user.business.id
}
})
await ctx.reply(`Подтвердите в личных сообщениях.`)
return await bot.telegram.sendMessage(ctx.from.id, `🏭 Вы действительно хотите покинуть ${business.name}`, Markup.inlineKeyboard([
[{
text: `Да`,
callback_data: "user_leave_business"
}, {
text: `Нет`,
callback_data: "cancel"
}]
])
.oneTime()
.resize()
)
}
if (business.owner == ctx.from.id){
return await ctx.reply(`Вы не можете покинуть свою организацию.`)
}
})
bot.action('user_leave_business', async (ctx) => {
let data = ctx.update.callback_query.data;
let user = await UserModel.findByPk(ctx.from.id)
if (user.business.id == 0) return await ctx.reply(`Вы не состоите в организации.`)
let business = await BusinessModel.findOne({
where: {
owner: user.business.id
}
})
user.business = {
id: 0,
checks: 0,
percent: 0
}
business.users = business.users.filter(value => value != ctx.from.id);
business.save()
user.save()
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) => {
let user = null
let business = await BusinessModel.findOne({
where: {
owner: ctx.from.id.toString()
}
})
let world = await WorldModel.findByPk(1)
if (business === null) return await ctx.reply(`У вас нет организации.`)
if (business.checks < 12) return await ctx.reply(`Недостаточно отработок для формирования выплаты.`)
let percentSum = 0
let text = ``
let percentErrorText = ``
let profit = 0
let piece = 0
let moneyList = rand(1000, 3000)
moneyList = moneyList*business.users.length
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`
}
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`
user.business = {
id: user.business.id,
checks: 0,
percent: user.business.percent
}
user.save()
}
text += `Наработка за текущий период: ${profit}\n`
let profitCheck = profit
for (i = 0; i < business.users.length; i++) { // Процент выплаты участникам
user = await UserModel.findByPk(business.users[i])
piece = Math.round(profit / 100 * user.business.percent)
profitCheck -= piece
user.money += 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}`
}
business.checks = 0
business.save()
console.log(`Payday: ${business.name}\n${text}`)
return await ctx.reply(text)
})
bot.command('orgmessage', async (ctx) => {
if (!ctx.args[1]) return ctx.reply(`Не указан аргумент.`)
let business = await BusinessModel.findOne({
where: {
owner: ctx.from.id.toString()
}
})
if (business === null) return await ctx.reply(`У вас нет организации.`)
for (i = 0; i < business.users.length; i++) {
user = await UserModel.findByPk(business.users[i])
await bot.telegram.sendMessage(user.telegram_id, `Директор организации сообщает:\n ${ctx.payload}`)
}
console.log(`Директор организации сообщает:\n ${ctx.payload}`)
return await ctx.reply(`Сообщение отправлено.`)
})
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(`Вы не владеете организацией.`)
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(`Недостаточно средств на балансе организации.`)
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}`)
})
bot.command('percent', 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(`Вы не владеете организацией.`)
let business = await BusinessModel.findOne({
where: {
owner: ctx.from.id.toString()
}
})
if (business === null) return await ctx.reply(`У вас нет организации.`)
if (!ctx.args[1] || !ctx.args[2]) return ctx.reply(`Не указан аргумент.`)
if (!Number(ctx.args[2])) return ctx.reply(`Процент должен быть числом от 1 до 100.`)
if (ctx.args[2] < 1 || ctx.args[2] > 100) return ctx.reply(`Минимальный процент 1 | Максимальный процент 100.`)
ctx.args[1] = ctx.args[1]
console.log(ctx.args)
let change = await UserModel.findOne({
where: {
username: ctx.args[1]
}
})
if (change === null) return await ctx.reply(`Нет такого игрока.`)
change.business = {
id: change.business.id,
checks: change.business.checks,
percent: ctx.args[2]
}
change.save()
return await ctx.reply(`Участнику ${change.username} установлен процент ${ctx.args[2]}`)
})
bot.command('business', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id)
if (user.business.id != 0){
let business = await BusinessModel.findOne({
where: {
owner: ctx.from.id.toString()
}
})
}
let business = null
let world = await WorldModel.findByPk(1)
ctx.args = ctx.update.message.text.split(' ')
if (business != null) return await ctx.reply(`У вас уже есть организация.`)
if (!ctx.args[1]) return ctx.reply(`/business [Название организации]`)
if (user.money < 100000) return await ctx.reply(`Регистрация организации стоит ¤100.000`)
if (user.level < 5) return await ctx.reply(`Регистрация организации доступна с 5 уровня.`)
user.money -= 100000
world.balance += 100000
let text = ``
for (i = 1; i < ctx.args.length; i++) {
text += `${ctx.args[i]} `
}
if (business === null) {
BusinessModel.create({
name: text,
owner: user.telegram_id,
balance: 50000,
users: [user.telegram_id]
})
user.business = {
id: user.telegram_id,
checks: 0,
percent: 100
}
} else {}
user.save()
world.save()
return await ctx.reply(`Организация "${text}" успешно создана!\n Регистрация организации в реестре: ¤50.000 \n Капитал: ¤50.000`)
})
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(`У вас нет организации в которую можно пригласить игрока.`)
let invited = await UserModel.findOne({
where: {
username: ctx.args[1]
}
});
await bot.telegram.sendMessage(invited.telegram_id, 'Приглашение', Markup
.inlineKeyboard([
[{
text: `Принять`,
callback_data: `{"type": "business_invite_accept", "invitor": "${user.telegram_id}"}`
}, {
text: `Отклонить`,
callback_data: `{"type": "business_invite_refuse", "invitor": "${user.telegram_id}"}`
}]
]).oneTime())
return await ctx.reply(`Приглашение отправлено.`)
})
bot.action(/{"type": "business_invite_(accept|refuse)"*/, async ctx => {
let data = ctx.update.callback_query.data;
data = JSON.parse(data)
let user = await UserModel.findByPk(ctx.update.callback_query.from.id)
if (data.type == 'business_invite_accept') {
if(user.business.id == 0){
let business = await BusinessModel.findOne({
where: {
owner: data.invitor
}
})
user.business = {
id: data.invitor,
checks: 0,
percent: 10
}
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})
}
if (data.type == 'business_invite_refuse'){
await ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `Приглашение отклонено.`, {show_alert: true})
}
})
bot.command('report', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id)
ctx.args = ctx.update.message.text.split(' ')
if (!ctx.args[1]) return ctx.reply(`/report [Текст обращения]`)
let uID = shortid.generate()
await ReportModel.create({
uid: uID,
author: user.telegram_id,
text: ctx.payload,
status: 1
})
let report = await ReportModel.findOne({
where: {
uid: uID
}
})
await bot.telegram.sendMessage(adminList[0], `Обращение от пользователя ${user.username}\nТекст обращения:\n${ctx.payload}\n\nДля ответа /answer ${report.id} [Ответ]`)
return await ctx.reply(`Обращение #${report.id}[${report.uid}] создано.`)
})
bot.hears('🎰 Слоты', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id)
ctx.args = ctx.update.message.text.split(' ')
await ctx.reply('Комбинации слотов:\n7⃣7⃣7⃣ - x25\n🍋🍋🍋 - x20\n🍇🍇🍇 - x15\n🔤🔤🔤 - x10', Markup
.inlineKeyboard([
[{
text: `1000`,
callback_data: `slots1000`
}, {
text: `5000`,
callback_data: `slots5000`
}, {
text: `25000`,
callback_data: `slots25000`
}, {
text: `50000`,
callback_data: `slots50000`
}, {
text: `100000`,
callback_data: `slots100000`
}]
]))
})
bot.action(/slots(1000|5000|25000|50000|100000)/, async (ctx) => {
let data = ctx.update.callback_query.data;
let bet = 1000
switch(data){
case `slots1000`:
bet = 1000
break;
case `slots5000`:
bet = 5000
break;
case `slots25000`:
bet = 25000
break;
case `slots50000`:
bet = 50000
break;
case `slots100000`:
bet = 100000
break;
}
let user = await UserModel.findByPk(ctx.from.id)
let timer = user.slottime
let cooldown = setCooldown(user, 10, timer)
if (user.slottime > cooldown.currentTime) return ctx.reply(`📛 Слоты будут доступны через пару секунд`);
if (user.money < bet) return ctx.reply(`Недостаточно средств.`)
user.slottime = cooldown.endTime
let world = await WorldModel.findByPk(1)
let result = await ctx.replyWithDice({emoji: `🎰`})
let slot = slots[result.dice.value]
let win = getSlot(result)
console.log(user.username + `: Win: x` + win)
user.money -= bet
world.balance += bet
if(win > 4){
user.world -= bet*win
user.money += bet*win
user.save()
world.save()
return setTimeout(() => {
ctx.reply(`Вы выиграли ${bet*win}`)
}, 1700);
}
if(win > 0 && win <= 4){
await giveExp(user, win*2)
return setTimeout(() => {
ctx.reply(`Вы выиграли ${win*2} опыта.`)
}, 1700);
}
if(win == 0){
return setTimeout(() => {
world.save()
user.save()
ctx.reply(`Вы ничего не выиграли.`)
}, 1700);
}
})
bot.hears('Помощь', async (ctx) => {
return await ctx.replyWithMarkdownV2(`• [Функционал](https://telegra.ph/CampFire-Bot-Info-09-25)\n• [Правила](https://telegra.ph/PRAVILA-BOTA-09-25)`, {
disable_web_page_preview: true
})
})
bot.command('promocode', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id)
ctx.args = ctx.update.message.text.split(' ')
if (!ctx.args[1]) return ctx.reply(`/promocode [Code]`)
let promocode = await PromocodeModel.findOne({
where: {
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(`Вы уже активировали этот промокод.`)
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(`Вы активировали промокод.`)
})
/////////////////////////////////////Admin Commands//////////////////////////////////////////////////
bot.command('answer', 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]) return ctx.reply(`Нужен номер обращения`)
let report = await ReportModel.findByPk(ctx.args[1])
if (report === null) return await ctx.reply(`Нет обращения с таким ID.`)
if (report.status == 0) return await ctx.reply(`Данное обращение уже закрыто.`)
let answer = ctx.args
answer.shift()
answer.shift()
answer = answer.join(' ')
await bot.telegram.sendMessage(report.author, `Ответ на обращение #${report.id}[${report.uid}]\n\n` + answer)
report.status = 0
report.save()
return await ctx.reply(`Ответ отправлен, обращение закрыто!`)
})
bot.command('fastblock', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id)
if(!ctx.message.reply_to_message) return await ctx.reply(`Только на пересланное сообщение.`)
let blocked = ctx.message.reply_to_message.from.id
if(user.status != 'admin') return await ctx.reply(`Admin Only.`)
await BlockModel.create({
telegram_id: blocked,
isBlocked: true,
reason: `|AutoFastBlock|`,
time: Math.trunc(Date.now() / 1000 + 3600)
})
await bot.telegram.sendMessage(blocked, `Вы были заблокированы администратором ${user.username}.`)
return await ctx.reply(`Пользователь заблокирован.`)
})
bot.command('createpromocode', 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] || !ctx.args[3]) return ctx.reply(`/createpromo [activations] [money] [code]`)
let promocode = await PromocodeModel.findOne({
where: {
code: ctx.args[1]
}
})
if(promocode === null){
await PromocodeModel.create({
code: ctx.args[3],
activations: ctx.args[1],
money: ctx.args[2]
})
return await ctx.reply(`Создан промокод ${ctx.args[3]}`)
}
})
///////////////////////////////////////Functions//////////////////////////////////////////////////////
function rand(min, max) {
return Math.round(Math.random() * (max - min)) + min
}
var parserInt = (str) => parseInt(str.replace(/k|к/ig, "000"));
function spaces(string) {
if (typeof string !== "string") string = string.toString();
return string.split("").reverse().join("").match(/[0-9]{1,3}/g).join(".").split("").reverse().join("");
};
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
};
Array.prototype.random = function() {
return this[Math.floor(this.length * Math.random())];
}
function getCurrentTime() {
const now = new Date();
const year = now.getFullYear();
const month = now.getMonth() < 9 ? `0${now.getMonth() + 1}` : now.getMonth() + 1;
const day = now.getDate() < 10 ? `0${now.getDate()}` : now.getDate();
const hours = now.getHours() < 10 ? `0${now.getHours()}` : now.getHours();
const minutes = now.getMinutes() < 10 ? `0${now.getMinutes()}` : now.getMinutes();
const seconds = now.getSeconds() < 10 ? `0${now.getSeconds()}` : now.getSeconds();
return `${day}.${month}.${year} ${hours}:${minutes}:${seconds}`;
}
function getSlot(result) {
switch(result.dice.value){
case 1:
return 10
case 22:
return 15
case 43:
return 20
case 64:
return 25
case 17: case 33: case 49:
return 1
case 6: case 38: case 54:
return 2
case 11: case 27: case 59:
return 3
case 16: case 32: case 48:
return 4
default:
return 0
}}
function setCooldown(user, seconds, type) {
let cooldown = {}
cooldown.currentTime = Math.trunc(Date.now() / 1000)
switch(user.status){
case `user`:
cooldown.endTime = Math.trunc(Date.now() / 1000 + seconds)
break;
case `bronze`:
cooldown.endTime = Math.trunc(Date.now() / 1000 + (seconds/100*85))
break;
case `silver`:
cooldown.endTime = Math.trunc(Date.now() / 1000 + (seconds/100*75))
break;
case `gold`:
cooldown.endTime = Math.trunc(Date.now() / 1000 + (seconds/100*50))
break;
case `admin`:
cooldown.endTime = Math.trunc(Date.now() / 1000)
break;
}
cooldown.timeLeft = cooldown.endTime - cooldown.currentTime
cooldown.timeLeftInMinutes = Math.ceil((type - cooldown.currentTime) / 60)
return cooldown
}
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}!`)
}
user.save()
}
function weaponShopUpdate() {
let weaponId = []
let equipId = []
let drop = 1
let counter = 5
for (i = 0; i < 5; i++) {
drop = weaponId.push(rand(1, 10))
}
for (i = 0; i < 5; i++) {
drop = equipId.push(rand(1, 10))
}
for (i = 0; i < 5; i++) {
weaponshop[i] = weapons[weaponId[i]]
}
for (i = 0; i < 5; i++) {
weaponshop[counter] = equipment[equipId[i]]
counter++
}
fs.writeFileSync('json/weaponshop.json', JSON.stringify(weaponshop, null, "\t"))
}
async function matPriceUpdate() {
let world = await WorldModel.findByPk(1)
let price = rand(35, 170)
world.matPrice = price
world.save()
}
setInterval(() => {
var today = new Date();
let hours = today.getHours();
if (hours == "0" || hours == "12") {
weaponShopUpdate()
matPriceUpdate()
}
}, 360000);
start()
bot.launch()