CampFirePlay/index.js
Degradin 98afe19dd6 v0.0.54
added shortid
added ReportModel
added BlockModel &  BlockSystem
commandlist
help replies
2023-09-20 00:42:48 +03:00

897 lines
39 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

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 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 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 whitelist = [275416286, 1797342681]
const adminList = [275416286]
const expToUp = [0, 10, 15, 22, 35, 50, 70, 85, 100, 125, 200]
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
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) {
UserModel.create({
telegram_id: id,
username: username,
})
} else {}
if (property === null) {
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 === null) {
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('Main Menu', Markup
.keyboard([
['😎 Профиль', '💳 Баланс'], // Row1 with 2 buttons
['Работать', 'Бонус'], // Row2 with 2 buttons
['📢 Вакансии', 'Мир', '📞 Пригласить'] // Row3 with 3 buttons
])
.oneTime()
.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
])
.oneTime()
.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.reply(`
👤 ${user.username} ${adminList.includes(ctx.from.id)? " ✅" : ""}
🆔 ID: ${ctx.from.id}
📶 Уровень: ${user.level} | ${user.exp} / ${expToUp[user.level]}
⏩ Повышается за различные действия.
Баланс
¤${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 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 count = rand(2,3)
for(i=0;i<count;i++){
let money = [100, 200, 300, 400, 500, 1000].random();
if(user.level >= 1){
money += money;
}
let r = rand(1,2);
if(r == 1) {
user.money += money;
world.balance -= money
text += `⏩ ¤${money}\n`;
}
if(r == 2){
user.money += money * 2;
world.balance -= money * 2
text += `⏩ ¤${money*2}\n`;
}
}
//uplvl(user);
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(`Не указан аргумент.`)
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 = `
Входящий перевод.
Отправитель: ${sender.username}
Идентификатор отправителя: ${sender.telegram_id}
Сумма: ¤${ctx.args[2]}
Ваш баланс: ¤${receiver.money}
`
bot.telegram.sendMessage(receiver.telegram_id, pmToReceiver)
return ctx.reply(`
Операция.
Получатель: ${receiver.username}
Идентификатор получателя: ${receiver.telegram_id}
Сумма: ¤${ctx.args[2]}
Комиссия: ¤${fee}
Ваш баланс: ¤${sender.money}
`)
})
bot.hears('Мир', async (ctx) => {
let world = await WorldModel.findByPk(1)
return ctx.reply(`
Баланс мира: ¤${spaces(world.balance)}
`)
})
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) => {
let user = await UserModel.findByPk(ctx.from.id);
return await ctx.reply('Список работы', Markup
.keyboard([
['Дворник', 'Промоутер'], // Row1 with 2 buttons
['Официант', 'Бармен'], // Row2 with 2 buttons
['Кассир', 'ПВЗ Дикие Ягоды', 'Слесарь'] // Row3 with 3 buttons
])
.oneTime()
.resize()
)
})
bot.hears('Дворник', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id);
let 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(`Вы уже устроены на другую работу`)
})
bot.hears('Промоутер', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id);
let 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(`Вы уже устроены на другую работу`)
})
bot.hears('Официант', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id);
let 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(`Вы уже устроены на другую работу`)
})
bot.hears('Бармен', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id);
let 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(`Вы уже устроены на другую работу`)
})
bot.hears('Слесарь', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id);
let 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(`Вы уже устроены на другую работу`)
})
bot.hears('Кассир', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id);
let 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(`Вы уже устроены на другую работу`)
})
bot.hears('ПВЗ Дикие Ягоды', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id);
let 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(`Вы уже устроены на другую работу`)
})
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 user = await UserModel.findByPk(ctx.from.id);
if (user.job != 0){
user.job = 0
user.save()
return await ctx.reply(`Теперь вы безработный.`)
}
return await ctx.reply(`Вы итак безработный.`)
})
bot.hears('Топ', async (ctx) => {
let topPlayer = await UserModel.findAll({
attributes: ['username', [sequelize.fn('sum', sequelize.col('money')), 'money']],
group: ['username'],
order: [[sequelize.literal('money'), 'DESC']],
limit: 10
})
if (!topPlayer[9]) {
console.log(topPlayer[0])
return await ctx.reply(`
В данный момент недостаточно игроков для составления топ 10, показывается только топ 1.
Игрок с наибольшим балансом:
1. ${topPlayer[0].username}${topPlayer[0].money}]
`)
} else {
return await ctx.reply(`
Рейтинг игроков:
1. ${topPlayer[0].username}
2. ${topPlayer[1].username}
3. ${topPlayer[2].username}
4. ${topPlayer[3].username}
5. ${topPlayer[4].username}
6. ${topPlayer[5].username}
7. ${topPlayer[6].username}
8. ${topPlayer[7].username}
9. ${topPlayer[8].username}
10. ${topPlayer[9].username}
`)
}
})
bot.hears('Имущество', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id);
return await ctx.reply(`Тестовое внесение данных `)
})
bot.hears('Жилье', async (ctx) => {
let text = `Вы зашли на сайт с предложениями жилья:\n`
for(i in houses){
text += i + `. ${houses[i].name}${houses[i].price}) [/buy house ${i}]\n`
}
return await ctx.reply(text)
})
bot.hears('Телефоны', async (ctx) => {
let text = `Вы зашли в магазин электроники:\n`
for(i in phones){
text += i + `. ${phones[i].name}${phones[i].price}) [/buy phone ${i}]\n`
}
return await ctx.reply(text)
})
bot.hears('Автосалон', async (ctx) => {
let text = `Автомобили доступные в автосалоне:\n`
for(i in cars){
text += i + `. ${cars[i].name}${cars[i].price}) [/buy car ${i}]\n`
}
return await ctx.reply(text)
})
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('buy', 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] || !ctx.args[2]) return ctx.reply(`Не указан аргумент.`)
if (!Number(ctx.args[2])) return ctx.reply(`Неверно указан параметр.`)
if (ctx.args[1] == "house"){
user.money -= houses[ctx.args[2]].price
world.balance += houses[ctx.args[2]].price
property.house = houses[ctx.args[2]]
await user.save()
await world.save()
await property.save()
return await ctx.reply(`Вы купили ${houses[ctx.args[2]].name}`)
}
if (ctx.args[1] == "car"){
user.money -= cars[ctx.args[2]].price
world.balance += cars[ctx.args[2]].price
property.car = cars[ctx.args[2]]
await user.save()
await world.save()
await property.save()
return await ctx.reply(`Вы купили ${cars[ctx.args[2]].name}`)
}
if (ctx.args[1] == "phone"){
user.money -= phones[ctx.args[2]].price
world.balance += phones[ctx.args[2]].price
property.mobile = phones[ctx.args[2]]
await user.save()
await world.save()
await property.save()
return await ctx.reply(`Вы купили ${phones[ctx.args[2]].name}`)
}
if (ctx.args[1] == "equipment"){
if (ctx.args[1] == weaponshop[ctx.args[2]].type){
user.money -= weaponshop[ctx.args[2]].price
world.balance += weaponshop[ctx.args[2]].price
property.equipment = weaponshop[ctx.args[2]]
await user.save()
await world.save()
await property.save()
return await ctx.reply(`Вы купили ${weaponshop[ctx.args[2]].name}`)
}
user.money -= weaponshop[ctx.args[2]].price
world.balance += weaponshop[ctx.args[2]].price
property.weapon = weaponshop[ctx.args[2]]
await user.save()
await world.save()
await property.save()
return await ctx.reply(`Вы купили ${weaponshop[ctx.args[2]].name}`)
}
return await ctx.reply(`Вы купили.`)
})
bot.hears('Организация', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id)
let business = await BusinessModel.findOne({owner: ctx.from.id})
if (business === null) return await ctx.reply(`У вас нет организации.`)
console.log(business)
return await ctx.reply(`Ваша организация\n${business.name}\nБаланс: ¤${business.balance}\nСырье: ${business.materials}\nРабочих: ${business.users.length}`)
})
bot.hears('Отработка', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id)
let business = await BusinessModel.findOne({owner: ctx.from.id})
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} минут(у/ы)`);
user.business = {
id: user.business.id,
checks: user.business.checks + 1,
percent: user.business.percent
}
business.checks += 1
await user.save()
await business.save()
return await ctx.reply(`Вы отработали час на ${business.name}`)
})
bot.hears('Payday', async (ctx) => {
let user = null
let business = await BusinessModel.findOne({owner: ctx.from.id})
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(500, 2000)
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.telegram_id} проценты]\n`
}
if (percentSum > 100) return await ctx.reply(`Общий процент всех сотрудников превышает 100%\nПроцент организации: ${business.percent}%\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 * moneyList}${moneyList}*${user.business.checks}] в баланс организации.\n`
}
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
user.save()
text += `${user.username} получает ¤${piece}\nОстаток выплат: ¤${profitCheck}\n`
}
if (profitCheck > 0) {
business.balance += profitCheck
business.save()
text += `На баланс бизнеса поступило ¤${profitCheck}`
}
return await ctx.reply(text)
})
bot.command('percent', async (ctx) => {
ctx.args = ctx.update.message.text.split(' ')
let user = await UserModel.findByPk(ctx.from.id)
let business = await BusinessModel.findOne({owner: ctx.from.id})
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.`)
let change = await UserModel.findByPk(ctx.args[1])
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)
let business = await BusinessModel.findOne({owner: ctx.from.id})
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(`Не указан аргумент.`)
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 [ID]`)
let user = await UserModel.findByPk(ctx.from.id)
let invited = await UserModel.findOne({ where: { username: ctx.args[1] } });
await bot.telegram.sendMessage(invited.telegram_id, 'Приглашение', Markup
.inlineKeyboard([
[{text: `Принять ${user.username}`, callback_data: ctx.from.id}, {text: `Отклонить ${user.username}`, callback_data: '0'}]]).oneTime())
return await ctx.reply(`Приглашение отправлено.`)
})
bot.on('callback_query', async ctx => {
const data = ctx.update.callback_query.data;
let user = await UserModel.findByPk(ctx.update.callback_query.from.id)
if (data != 0) {
let business = await BusinessModel.findOne({owner: data})
user.business = {
id: data,
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, `Приглашение принято.`)
} else {
await ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `Приглашение отклонено.`)
}
})
/////////////////////////////////////Admin Commands//////////////////////////////////////////////////
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.command('answer', async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id)
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)
let blocked = ctx.message.reply_to_message.from.id
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(`Пользователь заблокирован.`)
})
///////////////////////////////////////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("");
};
Array.prototype.random = function() {
return this[Math.floor(this.length * Math.random())];
}
function setCooldown(user, seconds, type) {
let cooldown = {}
cooldown.currentTime = Math.trunc(Date.now()/1000)
if(adminList.includes(user.telegram_id)) {
cooldown.endTime = Math.trunc(Date.now()/1000)
}else{
cooldown.endTime = Math.trunc(Date.now()/1000 + seconds)
}
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"))
}
setInterval(() => {
var today = new Date();
let hours = today.getHours();
if(hours == "0" || hours == "12" || hours == "23"){
weaponShopUpdate()
}
}, 360000);
weaponShopUpdate()
start()
bot.launch()