v5.1
Crons, cards, no inventory
This commit is contained in:
parent
43b32b942b
commit
b51eebc623
10
bot.js
10
bot.js
@ -1,6 +1,7 @@
|
|||||||
// Подключаем необходимые библиотеки
|
// Подключаем необходимые библиотеки
|
||||||
const { Telegraf, Scenes, session, Markup, Stage } = require('telegraf');
|
const { Telegraf, Scenes, session, Markup, Stage } = require('telegraf');
|
||||||
const { Op } = require('sequelize');
|
const { Op } = require('sequelize');
|
||||||
|
const schedule = require('node-schedule');
|
||||||
const sequelize = require('./db'); // Подключение базы данных
|
const sequelize = require('./db'); // Подключение базы данных
|
||||||
// Подключаем обработчики
|
// Подключаем обработчики
|
||||||
const commands = require('./commands');
|
const commands = require('./commands');
|
||||||
@ -1396,13 +1397,12 @@ resetCasinoFlag();
|
|||||||
|
|
||||||
// Запускаем функцию
|
// Запускаем функцию
|
||||||
updateResourcePricesMessage();
|
updateResourcePricesMessage();
|
||||||
// Запускаем процесс восстановления цен каждые 15 минут
|
|
||||||
setInterval(recoverResourcePrices, 15 * 60 * 1000);
|
|
||||||
// Запускаем обновление каждые 15 минут
|
// Запускаем обновление каждые 15 минут
|
||||||
setInterval(updateResourcePricesMessage, 15 * 60 * 1000);
|
schedule.scheduleJob('*/15 * * * *', recoverResourcePrices);
|
||||||
|
schedule.scheduleJob('*/15 * * * *', updateResourcePricesMessage);
|
||||||
// Запускаем процессы каждый час
|
// Запускаем процессы каждый час
|
||||||
setInterval(resourceProduction, 60 * 60 * 1000);
|
schedule.scheduleJob('0 * * * *', resourceProduction); // Каждый час в начале часа
|
||||||
setInterval(resourceTransportation, 60 * 60 * 1000);
|
schedule.scheduleJob('0 * * * *', resourceTransportation); // Каждый час
|
||||||
|
|
||||||
|
|
||||||
bot.command('force_prod', async (ctx) => {
|
bot.command('force_prod', async (ctx) => {
|
||||||
|
@ -10,6 +10,8 @@ module.exports = {
|
|||||||
equipment : require('../presets/equipment.json'),
|
equipment : require('../presets/equipment.json'),
|
||||||
UserModel : require('../models/user.model'),
|
UserModel : require('../models/user.model'),
|
||||||
CharacterModel : require('../models/character.model'),
|
CharacterModel : require('../models/character.model'),
|
||||||
|
ItemsModel : require('../models/items.model'),
|
||||||
|
StolenCardsModel : require('../models/stolencards.model'),
|
||||||
WorldModel : require('../models/world.model'),
|
WorldModel : require('../models/world.model'),
|
||||||
JobModel : require('../models/job.model'),
|
JobModel : require('../models/job.model'),
|
||||||
PropertyModel : require('../models/property.model'),
|
PropertyModel : require('../models/property.model'),
|
||||||
|
@ -24,59 +24,57 @@ const Character = sequelize.define('character', {
|
|||||||
hp: {
|
hp: {
|
||||||
type: DataTypes.INTEGER,
|
type: DataTypes.INTEGER,
|
||||||
defaultValue: 100
|
defaultValue: 100
|
||||||
}, // Текущее здоровье
|
},
|
||||||
max_hp: {
|
max_hp: {
|
||||||
type: DataTypes.INTEGER,
|
type: DataTypes.INTEGER,
|
||||||
defaultValue: 100
|
defaultValue: 100
|
||||||
}, // Максимальное здоровье
|
},
|
||||||
armor: {
|
armor: {
|
||||||
type: DataTypes.INTEGER,
|
type: DataTypes.INTEGER,
|
||||||
defaultValue: 0
|
defaultValue: 0
|
||||||
}, // Броня для уменьшения урона
|
},
|
||||||
stamina: {
|
stamina: {
|
||||||
type: DataTypes.INTEGER,
|
type: DataTypes.INTEGER,
|
||||||
defaultValue: 100
|
defaultValue: 100
|
||||||
}, // Текущая выносливость
|
},
|
||||||
max_stamina: {
|
max_stamina: {
|
||||||
type: DataTypes.INTEGER,
|
type: DataTypes.INTEGER,
|
||||||
defaultValue: 100
|
defaultValue: 100
|
||||||
}, // Максимальная выносливость
|
},
|
||||||
force: {
|
force: {
|
||||||
type: DataTypes.INTEGER,
|
type: DataTypes.INTEGER,
|
||||||
defaultValue: 1
|
defaultValue: 1
|
||||||
}, // "F": физическая сила, влияет на урон
|
},
|
||||||
intelligence: {
|
intelligence: {
|
||||||
type: DataTypes.INTEGER,
|
type: DataTypes.INTEGER,
|
||||||
defaultValue: 1
|
defaultValue: 1
|
||||||
}, // "I": интеллект для исследований/крафта
|
},
|
||||||
resilience: {
|
resilience: {
|
||||||
type: DataTypes.INTEGER,
|
type: DataTypes.INTEGER,
|
||||||
defaultValue: 1
|
defaultValue: 1
|
||||||
}, // "R": устойчивость, влияет на здоровье и защиту
|
},
|
||||||
endurance: {
|
endurance: {
|
||||||
type: DataTypes.INTEGER,
|
type: DataTypes.INTEGER,
|
||||||
defaultValue: 1
|
defaultValue: 1
|
||||||
}, // "E": выносливость, влияет на количество выполняемых заданий
|
},
|
||||||
dirtymoney: {
|
dirtymoney: {
|
||||||
type: DataTypes.INTEGER,
|
type: DataTypes.INTEGER,
|
||||||
defaultValue: 0
|
defaultValue: 0
|
||||||
}, // Грязные деньги, заработанные нелегально
|
},
|
||||||
stealedcards: {
|
stealedcards: {
|
||||||
type: DataTypes.INTEGER,
|
type: DataTypes.INTEGER,
|
||||||
defaultValue: 0
|
defaultValue: 0
|
||||||
}, // Украденные карточки
|
},
|
||||||
shoprobcd: {
|
shoprobcd: {
|
||||||
type: DataTypes.INTEGER,
|
type: DataTypes.INTEGER,
|
||||||
defaultValue: 0
|
defaultValue: 0
|
||||||
}, // КД на ограбление магазина
|
},
|
||||||
pocketstealcd: {
|
pocketstealcd: {
|
||||||
type: DataTypes.INTEGER,
|
type: DataTypes.INTEGER,
|
||||||
defaultValue: 0
|
defaultValue: 0
|
||||||
}, // КД на кражу из кармана
|
},
|
||||||
inventory: {
|
activeEffects: { type: DataTypes.JSON, allowNull: true, defaultValue: [] },
|
||||||
type: DataTypes.JSON,
|
equippedItems: { type: DataTypes.ARRAY(DataTypes.INTEGER), allowNull: true, defaultValue: [] },
|
||||||
defaultValue: []
|
|
||||||
}, // Инвентарь, где будут храниться предметы
|
|
||||||
});
|
});
|
||||||
|
|
||||||
module.exports = Character;
|
module.exports = Character;
|
||||||
|
41
models/inventory.model.js
Normal file
41
models/inventory.model.js
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
const { DataTypes } = require('sequelize');
|
||||||
|
const sequelize = require('../db');
|
||||||
|
|
||||||
|
const Inventory = sequelize.define('inventory', {
|
||||||
|
telegram_id: {
|
||||||
|
type: DataTypes.BIGINT,
|
||||||
|
primaryKey: true
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: DataTypes.STRING,
|
||||||
|
allowNull: false,
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
type: DataTypes.TEXT,
|
||||||
|
allowNull: false,
|
||||||
|
},
|
||||||
|
effectData: {
|
||||||
|
type: DataTypes.JSON,
|
||||||
|
allowNull: true
|
||||||
|
},
|
||||||
|
price: {
|
||||||
|
type: DataTypes.INTEGER,
|
||||||
|
allowNull: false,
|
||||||
|
},
|
||||||
|
rarity: {
|
||||||
|
type: DataTypes.INTEGER,
|
||||||
|
allowNull: false,
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
type: DataTypes.STRING, // Тип предмета (например, "инструмент", "ресурс")
|
||||||
|
allowNull: false,
|
||||||
|
},
|
||||||
|
duration: {
|
||||||
|
type: DataTypes.INTEGER,
|
||||||
|
allowNull: true
|
||||||
|
}, // Длительность эффекта в секундах
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = Inventory;
|
40
models/items.model.js
Normal file
40
models/items.model.js
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
const { DataTypes } = require('sequelize');
|
||||||
|
const sequelize = require('../db');
|
||||||
|
|
||||||
|
const Item = sequelize.define('item', {
|
||||||
|
id: {
|
||||||
|
type: DataTypes.INTEGER,
|
||||||
|
autoIncrement: true,
|
||||||
|
primaryKey: true,
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: DataTypes.STRING,
|
||||||
|
allowNull: false,
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
type: DataTypes.TEXT,
|
||||||
|
allowNull: false,
|
||||||
|
},
|
||||||
|
effectData: {
|
||||||
|
type: DataTypes.JSON,
|
||||||
|
allowNull: true
|
||||||
|
},
|
||||||
|
price: {
|
||||||
|
type: DataTypes.INTEGER,
|
||||||
|
allowNull: false,
|
||||||
|
},
|
||||||
|
rarity: {
|
||||||
|
type: DataTypes.INTEGER,
|
||||||
|
allowNull: false,
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
type: DataTypes.STRING, // Тип предмета (например, "инструмент", "ресурс")
|
||||||
|
allowNull: false,
|
||||||
|
},
|
||||||
|
duration: {
|
||||||
|
type: DataTypes.INTEGER,
|
||||||
|
allowNull: true
|
||||||
|
}, // Длительность эффекта в секундах
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = Item;
|
45
models/stolencards.model.js
Normal file
45
models/stolencards.model.js
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
const { DataTypes } = require('sequelize');
|
||||||
|
const sequelize = require('../db');
|
||||||
|
|
||||||
|
const StolenCard = sequelize.define('stolencard', {
|
||||||
|
id: {
|
||||||
|
type: DataTypes.INTEGER,
|
||||||
|
autoIncrement: true,
|
||||||
|
primaryKey: true,
|
||||||
|
},
|
||||||
|
userId: {
|
||||||
|
type: DataTypes.BIGINT,
|
||||||
|
allowNull: false,
|
||||||
|
},
|
||||||
|
balance: {
|
||||||
|
type: DataTypes.INTEGER,
|
||||||
|
allowNull: false,
|
||||||
|
},
|
||||||
|
cardNumber: {
|
||||||
|
type: DataTypes.STRING,
|
||||||
|
allowNull: false,
|
||||||
|
unique: true,
|
||||||
|
},
|
||||||
|
pin: {
|
||||||
|
type: DataTypes.STRING,
|
||||||
|
allowNull: false,
|
||||||
|
},
|
||||||
|
cvv: {
|
||||||
|
type: DataTypes.STRING,
|
||||||
|
allowNull: false,
|
||||||
|
},
|
||||||
|
holderName: {
|
||||||
|
type: DataTypes.STRING,
|
||||||
|
allowNull: false,
|
||||||
|
},
|
||||||
|
bankName: {
|
||||||
|
type: DataTypes.STRING,
|
||||||
|
allowNull: false,
|
||||||
|
},
|
||||||
|
expiresDate: {
|
||||||
|
type: DataTypes.STRING,
|
||||||
|
allowNull: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = StolenCard;
|
65
package-lock.json
generated
65
package-lock.json
generated
@ -9,9 +9,11 @@
|
|||||||
"version": "0.0.2",
|
"version": "0.0.2",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@faker-js/faker": "^9.3.0",
|
||||||
"dotenv": "^16.4.7",
|
"dotenv": "^16.4.7",
|
||||||
"error-stack-parser": "^2.1.4",
|
"error-stack-parser": "^2.1.4",
|
||||||
"fs": "^0.0.1-security",
|
"fs": "^0.0.1-security",
|
||||||
|
"node-schedule": "^2.1.1",
|
||||||
"nodemon": "^3.0.1",
|
"nodemon": "^3.0.1",
|
||||||
"pg": "^8.6.0",
|
"pg": "^8.6.0",
|
||||||
"pg-hstore": "^2.3.3",
|
"pg-hstore": "^2.3.3",
|
||||||
@ -23,6 +25,22 @@
|
|||||||
"voucher-code-generator": "^1.3.0"
|
"voucher-code-generator": "^1.3.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@faker-js/faker": {
|
||||||
|
"version": "9.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.3.0.tgz",
|
||||||
|
"integrity": "sha512-r0tJ3ZOkMd9xsu3VRfqlFR6cz0V/jFYRswAIpC+m/DIfAUXq7g8N7wTAlhSANySXYGKzGryfDXwtwsY8TxEIDw==",
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/fakerjs"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18.0.0",
|
||||||
|
"npm": ">=9.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@pm2/agent": {
|
"node_modules/@pm2/agent": {
|
||||||
"version": "2.0.4",
|
"version": "2.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-2.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-2.0.4.tgz",
|
||||||
@ -574,6 +592,18 @@
|
|||||||
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
|
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/cron-parser": {
|
||||||
|
"version": "4.9.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz",
|
||||||
|
"integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"luxon": "^3.2.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/croner": {
|
"node_modules/croner": {
|
||||||
"version": "4.1.97",
|
"version": "4.1.97",
|
||||||
"resolved": "https://registry.npmjs.org/croner/-/croner-4.1.97.tgz",
|
"resolved": "https://registry.npmjs.org/croner/-/croner-4.1.97.tgz",
|
||||||
@ -1078,6 +1108,12 @@
|
|||||||
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
|
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/long-timeout": {
|
||||||
|
"version": "0.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz",
|
||||||
|
"integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/lru-cache": {
|
"node_modules/lru-cache": {
|
||||||
"version": "7.18.3",
|
"version": "7.18.3",
|
||||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
|
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
|
||||||
@ -1087,6 +1123,15 @@
|
|||||||
"node": ">=12"
|
"node": ">=12"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/luxon": {
|
||||||
|
"version": "3.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz",
|
||||||
|
"integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/minimatch": {
|
"node_modules/minimatch": {
|
||||||
"version": "3.1.2",
|
"version": "3.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
@ -1220,6 +1265,20 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/node-schedule": {
|
||||||
|
"version": "2.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-2.1.1.tgz",
|
||||||
|
"integrity": "sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"cron-parser": "^4.2.0",
|
||||||
|
"long-timeout": "0.1.1",
|
||||||
|
"sorted-array-functions": "^1.3.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/nodemon": {
|
"node_modules/nodemon": {
|
||||||
"version": "3.1.9",
|
"version": "3.1.9",
|
||||||
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.9.tgz",
|
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.9.tgz",
|
||||||
@ -1956,6 +2015,12 @@
|
|||||||
"node": ">= 14"
|
"node": ">= 14"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/sorted-array-functions": {
|
||||||
|
"version": "1.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz",
|
||||||
|
"integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/source-map": {
|
"node_modules/source-map": {
|
||||||
"version": "0.6.1",
|
"version": "0.6.1",
|
||||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
|
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
|
||||||
|
@ -11,9 +11,11 @@
|
|||||||
"author": "Degradin",
|
"author": "Degradin",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@faker-js/faker": "^9.3.0",
|
||||||
"dotenv": "^16.4.7",
|
"dotenv": "^16.4.7",
|
||||||
"error-stack-parser": "^2.1.4",
|
"error-stack-parser": "^2.1.4",
|
||||||
"fs": "^0.0.1-security",
|
"fs": "^0.0.1-security",
|
||||||
|
"node-schedule": "^2.1.1",
|
||||||
"nodemon": "^3.0.1",
|
"nodemon": "^3.0.1",
|
||||||
"pg": "^8.6.0",
|
"pg": "^8.6.0",
|
||||||
"pg-hstore": "^2.3.3",
|
"pg-hstore": "^2.3.3",
|
||||||
|
Loading…
Reference in New Issue
Block a user