- Клиентская часть Vue 3 + Vite - Серверная часть Node.js + WebSocket - Система авторизации и смен - Управление игровыми портами - Поддержка тем (светлая/темная) - Адаптивный дизайн 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
107 lines
4.4 KiB
JavaScript
107 lines
4.4 KiB
JavaScript
"use strict";
|
||
|
||
const fs = require('node:fs/promises');
|
||
const path = require('path');
|
||
|
||
exports.go = async (req, res, postData, urlParsed) => {
|
||
try {
|
||
console.log('[api/user-info] Запрос информации о пользователе:', {
|
||
phone: postData.phone,
|
||
hasHash: !!postData.hash
|
||
});
|
||
|
||
// Проверяем обязательные поля
|
||
if (!postData.phone || !postData.hash) {
|
||
return res.end(JSON.stringify({
|
||
success: false,
|
||
error: "Не указан номер телефона или сессионный хэш"
|
||
}));
|
||
}
|
||
|
||
// Нормализуем номер телефона
|
||
const normalizedPhone = postData.phone.replace(/\D/g, '');
|
||
|
||
// Читаем данные пользователей и сессионных хэшей
|
||
let avt = {};
|
||
let hash = {};
|
||
|
||
try {
|
||
const avtData = await fs.readFile(path.join(__dirname, '../data/avt.ini'), 'utf8');
|
||
avt = JSON.parse(avtData);
|
||
} catch (error) {
|
||
console.error('[api/user-info] Ошибка чтения avt.ini:', error);
|
||
return res.end(JSON.stringify({
|
||
success: false,
|
||
error: "Ошибка загрузки данных пользователей"
|
||
}));
|
||
}
|
||
|
||
try {
|
||
const hashData = await fs.readFile(path.join(__dirname, '../data/hash.ini'), 'utf8');
|
||
hash = JSON.parse(hashData);
|
||
} catch (error) {
|
||
console.warn('[api/user-info] Файл hash.ini не найден');
|
||
hash = {};
|
||
}
|
||
|
||
// ПРОВЕРКА СЕССИОННОГО ХЭША
|
||
if (normalizedPhone in hash && normalizedPhone in avt && hash[normalizedPhone] === postData.hash) {
|
||
console.log('[api/user-info] ✅ Сессионный хэш действителен');
|
||
|
||
const user = JSON.parse(JSON.stringify(avt[normalizedPhone]));
|
||
delete user.pass;
|
||
if (user.groupz && user.groupz.access) delete user.groupz.access;
|
||
|
||
// Определяем роль пользователя
|
||
let userRole = 'operator';
|
||
if (user.taccess) {
|
||
userRole = user.taccess;
|
||
} else if (user.access && user.access.fullaccess) {
|
||
userRole = 'admin';
|
||
} else if (user.groupz && user.groupz.name) {
|
||
const groupName = user.groupz.name.toLowerCase();
|
||
if (groupName.includes('программист') || groupName.includes('админ')) {
|
||
userRole = 'admin';
|
||
} else if (groupName.includes('оператор')) {
|
||
userRole = 'operators';
|
||
} else if (groupName.includes('техник')) {
|
||
userRole = 'technics';
|
||
}
|
||
}
|
||
|
||
// Возвращаем актуальные данные пользователя
|
||
const response = {
|
||
success: true,
|
||
user: {
|
||
id: user._id || normalizedPhone,
|
||
name: user.fio || user.name || 'Пользователь',
|
||
phone: normalizedPhone,
|
||
role: userRole,
|
||
isAuthenticated: true,
|
||
hash: postData.hash, // Возвращаем тот же хэш
|
||
// Дополнительные данные
|
||
group: user.groupz ? user.groupz.name : null,
|
||
color: user.color || null,
|
||
balance: user.bal || null,
|
||
serverConnected: global.conn_to_server || false,
|
||
lastUpdate: Date.now()
|
||
}
|
||
};
|
||
|
||
res.end(JSON.stringify(response));
|
||
} else {
|
||
console.log('[api/user-info] ❌ Сессионный хэш недействителен');
|
||
res.end(JSON.stringify({
|
||
success: false,
|
||
error: "Сессия истекла или недействительна"
|
||
}));
|
||
}
|
||
|
||
} catch (error) {
|
||
console.error('[api/user-info] Критическая ошибка:', error);
|
||
res.end(JSON.stringify({
|
||
success: false,
|
||
error: "Внутренняя ошибка сервера"
|
||
}));
|
||
}
|
||
};
|