This commit is contained in:
Degradin 2025-01-05 02:29:56 +03:00
parent fb8771109a
commit e02402a394
4 changed files with 120 additions and 30 deletions

101
bot.js
View File

@ -107,7 +107,9 @@ bot.use(async (ctx, next) => {
console.log(ctx) console.log(ctx)
} }
let user = await UserModel.findByPk(id); let user = await UserModel.findByPk(id);
let block = await BlockModel.findByPk(id); let block = await BlockModel.findOne({
where: { telegram_id: id }, // Здесь id — это значение telegram_id, переданное в функцию
});
let property = await PropertyModel.findByPk(id); let property = await PropertyModel.findByPk(id);
let skill = await SkillsModel.findByPk(ctx.from.id) let skill = await SkillsModel.findByPk(ctx.from.id)
if (!user) ctx.reply(`❕ Первичная регистрация профиля.`); if (!user) ctx.reply(`❕ Первичная регистрация профиля.`);
@ -137,11 +139,21 @@ bot.use(async (ctx, next) => {
}) })
} }
//if (whitelist.includes(id) == false) return ctx.reply(`У вас пока нет доступа к боту. Следите за обновлениями в группе: t.me/CampFireGameBotNews`) //if (whitelist.includes(id) == false) return ctx.reply(`У вас пока нет доступа к боту. Следите за обновлениями в группе: t.me/CampFireGameBotNews`)
if (block !== null) { if (block) {
if (block.isBlocked == true && block.time > Date.now() / 1000) return ctx.reply(`📛 У вас активная блокировка по причине: ${block.reason}.\n⏲️ Оставшееся время: ${Math.trunc((block.time - Date.now()/1000)/60)} мин.`) const currentTime = Math.trunc(Date.now() / 1000); // Получаем текущее время в секундах
block.isBlocked = false
block.save() if (block.isBlocked && block.time > currentTime) {
const remainingTime = Math.trunc((block.time - currentTime) / 60); // Рассчитываем оставшееся время
return ctx.reply(
`📛 У вас активная блокировка по причине: ${block.reason}.\n⏲️ Оставшееся время: ${remainingTime} мин.`
);
} }
// Если блокировка истекла или отключена
block.isBlocked = false;
await block.save(); // Обязательно используем `await` для сохранения изменений
}
const start = Date.now() const start = Date.now()
const timeoutPromise = new Promise((resolve, reject) => { const timeoutPromise = new Promise((resolve, reject) => {
@ -466,7 +478,7 @@ bot.action('my_enterprises', async (ctx) => {
const resourcePrice = await ResourcePriceModel.findOne({ const resourcePrice = await ResourcePriceModel.findOne({
where: { resource: resourceType } where: { resource: resourceType }
}); });
let price = resourcePrice.price * 2 * 10 * 24 * 7 // Стоимость улучшения зависит от уровня let price = resourcePrice.price * 1.5 * 10 * 24 * 7 // Стоимость улучшения зависит от уровня
message += `🔹 [ID: ${id}] ${getEnterpriseEmoji(resourceType)} ${name} st. ${level}\n └── ${currentResources}/${warehouseCapacity} [${efficiency} ед/ч]\n └──📈 ${utils.spaces(price)} руб.\n\n`; message += `🔹 [ID: ${id}] ${getEnterpriseEmoji(resourceType)} ${name} st. ${level}\n └── ${currentResources}/${warehouseCapacity} [${efficiency} ед/ч]\n └──📈 ${utils.spaces(price)} руб.\n\n`;
const truck = await TruckModel.findOne({ where: { enterpriseId: id } }); const truck = await TruckModel.findOne({ where: { enterpriseId: id } });
const warehouse = await WarehouseModel.findOne({ where: { playerId: user.telegram_id } }); const warehouse = await WarehouseModel.findOne({ where: { playerId: user.telegram_id } });
@ -523,7 +535,7 @@ bot.action('build_enterprise', async (ctx) => {
for (const resource of resourcePrices) { for (const resource of resourcePrices) {
const resourceName = getReadableType(resource.resource); const resourceName = getReadableType(resource.resource);
const resourceEmoji = getEnterpriseEmoji(resource.resource); const resourceEmoji = getEnterpriseEmoji(resource.resource);
message += `${resourceEmoji} ${resourceName}: ${utils.spaces(Math.round(resource.price * 2 * 10 * 24 * 7))} руб.\n`; message += `${resourceEmoji} ${resourceName}: ${utils.spaces(Math.round(resource.price * 1.5 * 10 * 24 * 7))} руб.\n`;
// Генерируем кнопки для каждого ресурса // Генерируем кнопки для каждого ресурса
buttons.push([ buttons.push([
@ -551,7 +563,7 @@ bot.action(/build_(wood|coal|oil|metall|gold|diamond)/, async (ctx) => {
const resourcePrice = await ResourcePriceModel.findOne({ const resourcePrice = await ResourcePriceModel.findOne({
where: { resource: type } where: { resource: type }
}); });
let price = resourcePrice.price * 2 * 10 * 24 * 7 let price = resourcePrice.price * 1.5 * 10 * 24 * 7
// Проверка, есть ли достаточно денег у пользователя // Проверка, есть ли достаточно денег у пользователя
if (user.money < price) { if (user.money < price) {
@ -774,7 +786,7 @@ bot.action(/upgrade_(\d+)/, async (ctx) => {
const resourcePrice = await ResourcePriceModel.findOne({ const resourcePrice = await ResourcePriceModel.findOne({
where: { resource: enterprise.resourceType } where: { resource: enterprise.resourceType }
}); });
let upgradeCost = resourcePrice.price * 2 * 10 * 24 * 7 // Стоимость улучшения зависит от уровня let upgradeCost = resourcePrice.price * 1.5 * 10 * 24 * 7 // Стоимость улучшения зависит от уровня
if (user.money < upgradeCost) { if (user.money < upgradeCost) {
return await ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `У вас недостаточно средств для прокачки предприятия. Необходимо ${upgradeCost} руб.`) return await ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `У вас недостаточно средств для прокачки предприятия. Необходимо ${upgradeCost} руб.`)
} }
@ -1308,6 +1320,10 @@ bot.command('force_hour', async (ctx) => {
return await ctx.reply(`Принудительный час.`) return await ctx.reply(`Принудительный час.`)
}) })
bot.command('force_mat', async (ctx) => {
utils.matPriceUpdate()
return await ctx.reply(`Принудительный материал.`)
})
/////////////////////////////////////Enterprise Update end////////////////////////////////////////////////// /////////////////////////////////////Enterprise Update end//////////////////////////////////////////////////
/////////////////////////////////////Admin Commands////////////////////////////////////////////////// /////////////////////////////////////Admin Commands//////////////////////////////////////////////////
@ -1323,16 +1339,63 @@ bot.command('genpromo', commands.genPromo)
bot.command('ban', async (ctx) => { bot.command('ban', async (ctx) => {
const user = await UserModel.findByPk(ctx.from.id); const user = await UserModel.findByPk(ctx.from.id);
const [blocked] = ctx.message.text.split(' ').slice(1);
if(user.status != 'admin') return await ctx.reply(`Admin Only.`) // Проверка прав администратора
await BlockModel.create({ if (user.status !== 'admin') {
telegram_id: blocked, return await ctx.reply(`У вас нет прав для выполнения этой команды.`);
}
// Разбор аргументов команды
const args = ctx.message.text.split(' ').slice(1);
if (args.length < 3) {
return await ctx.reply(`⚠️ Использование: /ban <ID|username> <время в минутах> <причина>.`);
}
const identifier = args[0]; // ID или username пользователя
const blockTimeMinutes = parseInt(args[1], 10); // Время блокировки в минутах
const reason = args.slice(2).join(' '); // Причина блокировки
// Проверка времени блокировки
if (isNaN(blockTimeMinutes) || blockTimeMinutes <= 0) {
return await ctx.reply(`❌ Укажите корректное время блокировки в минутах.`);
}
// Ищем пользователя по Telegram ID или никнейму
let targetUser;
if (identifier.startsWith('@')) {
// Если передан username
targetUser = await UserModel.findOne({ where: { username: identifier.slice(1) } });
} else {
// Если передан Telegram ID
targetUser = await UserModel.findOne({ where: { telegram_id: identifier } });
}
if (!targetUser) {
return await ctx.reply(`❌ Пользователь с идентификатором "${identifier}" не найден.`);
}
// Создаём запись о блокировке
const block = await BlockModel.create({
telegram_id: targetUser.telegram_id,
isBlocked: true, isBlocked: true,
reason: `|AutoFastBlock|`, reason: reason,
time: Math.trunc(Date.now() / 1000 + 3600) time: Math.trunc(Date.now() / 1000 + blockTimeMinutes * 60) // Время блокировки в секундах
}) });
await bot.telegram.sendMessage(blocked, `Вы были заблокированы администратором ${user.username}.`)
return await ctx.reply(`Пользователь заблокирован.`) // Уведомляем заблокированного пользователя
try {
await bot.telegram.sendMessage(
targetUser.telegram_id,
`❌ Вы были заблокированы администратором ${user.username}.\nПричина: ${reason}\nСрок: ${blockTimeMinutes} минут(ы).`
);
} catch (error) {
console.error(`Ошибка отправки уведомления пользователю ${targetUser.telegram_id}:`, error);
}
// Уведомляем администратора
return await ctx.reply(
`✅ Пользователь ${targetUser.username || targetUser.telegram_id} был успешно заблокирован.\nПричина: ${reason}\nСрок: ${blockTimeMinutes} минут(ы).`
);
}); });
///////////////////////////////////////Functions////////////////////////////////////////////////////// ///////////////////////////////////////Functions//////////////////////////////////////////////////////
@ -1342,7 +1405,7 @@ setInterval(() => {
let hours = today.getHours(); let hours = today.getHours();
if (hours == "0" || hours == "12") { if (hours == "0" || hours == "12") {
//weaponShopUpdate() //weaponShopUpdate()
//matPriceUpdate() matPriceUpdate()
} }
/*if (hours == "9" || hours == "18" || hours == "12") { /*if (hours == "9" || hours == "18" || hours == "12") {
generatePromo() generatePromo()

View File

@ -28,8 +28,6 @@ module.exports = async (ctx) => {
let percentErrorText = `` let percentErrorText = ``
let profit = 0 let profit = 0
let piece = 0 let piece = 0
let moneyList = rand(1000, 3000)
moneyList = moneyList*business.users.length
for (i = 0; i < business.users.length; i++) { // Summary percent for (i = 0; i < business.users.length; i++) { // Summary percent
user = await UserModel.findByPk(business.users[i]) user = await UserModel.findByPk(business.users[i])
percentSum += Number(user.business.percent) percentSum += Number(user.business.percent)
@ -38,7 +36,7 @@ module.exports = async (ctx) => {
if (percentSum > 100) return await ctx.reply(`⚠️ Общий процент всех сотрудников превышает 100%\n Остаток процентов перенесется в баланс организации.\n\n${percentErrorText}\n`) if (percentSum > 100) return await ctx.reply(`⚠️ Общий процент всех сотрудников превышает 100%\n Остаток процентов перенесется в баланс организации.\n\n${percentErrorText}\n`)
for (x = 0; x < business.users.length; x++) { // Общая внесенная сумма всеми участниками for (x = 0; x < business.users.length; x++) { // Общая внесенная сумма всеми участниками
user = await UserModel.findByPk(business.users[x]) user = await UserModel.findByPk(business.users[x])
profit += user.business.checks * moneyList * user.level profit += user.business.checks * world.matPrice * 10 * user.level
text += ` ${user.username} отработал ${user.business.checks} раз.\n` text += ` ${user.username} отработал ${user.business.checks} раз.\n`
user.business = { user.business = {
id: user.business.id, id: user.business.id,

View File

@ -2,10 +2,22 @@ const sequelize = require('../db');
const {DataTypes} = require('sequelize'); const {DataTypes} = require('sequelize');
const Block = sequelize.define('block', { const Block = sequelize.define('block', {
telegram_id: {type: DataTypes.BIGINT, primaryKey: true, unique: true}, uid: {type: DataTypes.STRING, unique: true}, telegram_id: {
isBlocked: {type: DataTypes.BOOLEAN, defaultValue: false}, type: DataTypes.BIGINT,
reason: {type: DataTypes.STRING, defaultValue: "Не указана."}, allowNull: false,
time: {type: DataTypes.INTEGER, defaultValue: 0} },
isBlocked: {
type: DataTypes.BOOLEAN,
defaultValue: true,
},
reason: {
type: DataTypes.STRING,
allowNull: false,
},
time: {
type: DataTypes.BIGINT, // UNIX-время окончания блокировки
allowNull: false,
}
}) })
module.exports = Block; module.exports = Block;

View File

@ -1,11 +1,28 @@
const rand = require('./rand') const rand = require('./rand')
const { const {
WorldModel WorldModel,
ResourcePriceModel
} = global.config } = global.config
module.exports = async () => { module.exports = async () => {
let world = await WorldModel.findByPk(1) let world = await WorldModel.findByPk(1)
let price = rand(35, 170) // Получаем все ресурсы и их цены
world.matPrice = price let resources = await ResourcePriceModel.findAll();
world.save()
if (resources.length === 0) {
return console.error('Ресурсы не найдены в базе данных.');
}
// Считаем среднюю стоимость ресурсов
let totalPrice = resources.reduce((sum, resource) => sum + resource.price, 0);
let averagePrice = totalPrice / resources.length;
// Рассчитываем стоимость материала
let materialPrice = Math.round(averagePrice / 10); // Округляем до целого числа
// Обновляем модель World
world.matPrice = materialPrice;
await world.save();
console.log(`Стоимость материала обновлена: ${materialPrice}`);
} }