195 lines
7.1 KiB
JavaScript
195 lines
7.1 KiB
JavaScript
require('dotenv').config();
|
|
|
|
const sequelize = require('./db'); // Подключение базы данных
|
|
|
|
// Настраиваем глобальные переменные (опционально)
|
|
global.path = require('path');
|
|
global.config = require('./config'); // Конфигурация
|
|
global.database = sequelize; // База данных
|
|
global.utils = require('./utils');
|
|
const express = require('express');
|
|
const { UserModel, CharacterModel, BusinessModel, EnterpriseModel, WarehouseModel } = global.config;
|
|
const app = express();
|
|
|
|
app.use(express.static('public')); // Для выдачи HTML и статики
|
|
|
|
// Эндпоинт для получения всех данных игрока
|
|
app.get('/player/:id', async (req, res) => {
|
|
const playerId = req.params.id;
|
|
|
|
try {
|
|
const user = await UserModel.findOne({ where: { telegram_id: req.params.id } });
|
|
const character = await CharacterModel.findOne({ where: { telegram_id: playerId } });
|
|
let business = await BusinessModel.findOne({ where: { owner: playerId } })
|
|
if(business === null){
|
|
business = await BusinessModel.findOne( {where: { owner: user.business.id} } )
|
|
}
|
|
const enterprises = await EnterpriseModel.findAll({ where: { playerId } });
|
|
const warehouse = await WarehouseModel.findOne({ where: { playerId } });
|
|
|
|
if (!user || !character) {
|
|
return res.status(404).json({ error: "Игрок не найден." });
|
|
}
|
|
|
|
res.json({
|
|
user: {
|
|
username: user.username,
|
|
telegramID: user.telegram_id,
|
|
name: user.name,
|
|
status: user.status,
|
|
profileLevel: user.level,
|
|
characterLevel: character.level,
|
|
profileExp: user.exp,
|
|
characterExp: character.exp,
|
|
profileExpToUp: global.config.expToUp[user.level],
|
|
characterExpToUp: global.config.expToUp[character.level],
|
|
hp: character.hp,
|
|
maxHp: character.max_hp,
|
|
stamina: character.stamina,
|
|
maxStamina: character.max_stamina,
|
|
force: character.force,
|
|
intelligence: character.intelligence,
|
|
resilience: character.resilience,
|
|
endurance: character.endurance,
|
|
money: global.utils.spaces(user.money),
|
|
dirtymoney: global.utils.spaces(character.dirtymoney),
|
|
},
|
|
business: business || { name: "Отсутствует", balance: 0, materials: 0, users: [] },
|
|
enterprises: enterprises || [],
|
|
warehouse: warehouse || { materials: 0, maxMaterials: 0 },
|
|
});
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.status(500).json({ error: 'Ошибка сервера' });
|
|
}
|
|
});
|
|
|
|
app.get('/scoreboard', (req, res) => {
|
|
res.sendFile(global.path.join(__dirname, 'public', 'scoreboard.html'));
|
|
});
|
|
|
|
app.get('/users', async (req, res) => {
|
|
const { sortBy } = req.query; // Sorting option passed as a query parameter
|
|
|
|
const sortOptions = {
|
|
money: [sequelize.literal('money'), 'DESC'],
|
|
level: [sequelize.literal('level'), 'DESC']
|
|
};
|
|
|
|
const topUser = await UserModel.findAll({
|
|
attributes: ['username', 'money', 'level', 'status'],
|
|
order: [sortOptions[sortBy] || sortOptions['money']], // Default sort by money
|
|
limit: 15
|
|
});
|
|
|
|
res.json(topUser.map(player => ({
|
|
username: player.username,
|
|
money: utils.spaces(player.money),
|
|
level: player.level,
|
|
status: player.status
|
|
})));
|
|
});
|
|
|
|
|
|
app.get('/characters', async (req, res) => {
|
|
const { sortBy } = req.query; // Use query parameters to specify sorting
|
|
|
|
const sortOptions = {
|
|
dirtymoney: [sequelize.literal('dirtymoney'), 'DESC'],
|
|
level: [sequelize.literal('level'), 'DESC'],
|
|
force: [sequelize.literal('force'), 'DESC'],
|
|
intelligence: [sequelize.literal('intelligence'), 'DESC'],
|
|
resilience: [sequelize.literal('resilience'), 'DESC'],
|
|
endurance: [sequelize.literal('endurance'), 'DESC']
|
|
};
|
|
|
|
const topCharacter = await CharacterModel.findAll({
|
|
attributes: ['username', 'dirtymoney', 'level', 'force', 'intelligence', 'resilience', 'endurance', 'enemiesKilled'],
|
|
order: [sortOptions[sortBy] || sortOptions['dirtymoney']], // Default sort by dirtymoney
|
|
limit: 15
|
|
});
|
|
|
|
res.json(topCharacter.map(character => ({
|
|
username: character.username,
|
|
dirtymoney: utils.spaces(character.dirtymoney),
|
|
level: character.level,
|
|
force: character.force,
|
|
intelligence: character.intelligence,
|
|
resilience: character.resilience,
|
|
endurance: character.endurance,
|
|
enemiesKilled: character.enemiesKilled
|
|
})));
|
|
});
|
|
|
|
|
|
app.get('/enterprises', async (req, res) => {
|
|
const enterprises = await EnterpriseModel.findAll({
|
|
attributes: ['name', 'resourceType', 'level', 'efficiency', 'warehouseCapacity', 'currentResources', 'playerId']
|
|
});
|
|
|
|
const resourceIcons = {
|
|
wood: '🌳',
|
|
coal: '⛏️',
|
|
oil: '🛢️',
|
|
metall: '⚒️',
|
|
gold: '💰',
|
|
diamond: '💎'
|
|
};
|
|
|
|
const enterprisesData = await Promise.all(enterprises.map(async enterprise => {
|
|
const player = await UserModel.findOne({
|
|
attributes: ['username'],
|
|
where: { telegram_id: enterprise.playerId }
|
|
});
|
|
|
|
return {
|
|
name: enterprise.name,
|
|
resourceType: enterprise.resourceType,
|
|
level: enterprise.level,
|
|
efficiency: enterprise.efficiency,
|
|
warehouseCapacity: enterprise.warehouseCapacity,
|
|
currentResources: enterprise.currentResources,
|
|
owner: player ? player.username : 'Unknown',
|
|
icon: resourceIcons[enterprise.resourceType] || '❓'
|
|
};
|
|
}));
|
|
|
|
res.json(enterprisesData);
|
|
});
|
|
|
|
app.get('/businesses', async (req, res) => {
|
|
const { sortBy } = req.query; // Sorting option passed as a query parameter
|
|
|
|
const sortOptions = {
|
|
balance: [sequelize.literal('balance'), 'DESC'],
|
|
usersCount: [sequelize.literal('ARRAY_LENGTH(users, 1)'), 'DESC']
|
|
};
|
|
|
|
const businesses = await BusinessModel.findAll({
|
|
attributes: ['name', 'balance', 'users', 'owner'],
|
|
order: [sortOptions[sortBy] || sortOptions['balance']], // Default sort by balance
|
|
limit: 15
|
|
});
|
|
|
|
const businessesData = await Promise.all(businesses.map(async business => {
|
|
const owner = await UserModel.findOne({
|
|
attributes: ['username'],
|
|
where: { telegram_id: business.owner }
|
|
});
|
|
|
|
return {
|
|
name: business.name,
|
|
balance: utils.spaces(business.balance),
|
|
usersCount: business.users.length,
|
|
owner: owner ? owner.username : 'Unknown'
|
|
};
|
|
}));
|
|
|
|
res.json(businessesData);
|
|
});
|
|
|
|
|
|
// Запуск сервера
|
|
const PORT = process.env.PORT || 3001;
|
|
app.listen(PORT, () => console.log(`Сервер запущен на порту ${PORT}`));
|