
• После отработки пишется общее количество отработок. • Добавлена система промокодов. • Добавлен список правил в "Помощь". • Добавлена система привелегий. • Обновлен вывод пользователей в "Топ" • Общие исправления. Переработан магазин. Проработка внешнего вида команд.
1520 lines
64 KiB
JavaScript
1520 lines
64 KiB
JavaScript
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() |