Crons, cards, no inventory
This commit is contained in:
Degradin 2025-01-09 20:06:02 +03:00
parent 43b32b942b
commit b51eebc623
9 changed files with 1019 additions and 108 deletions

10
bot.js
View File

@ -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) => {

View File

@ -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'),

View File

@ -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
View 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
View 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;

View 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
View File

@ -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",

View File

@ -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",

862
rpg.js

File diff suppressed because it is too large Load Diff