фикс
This commit is contained in:
parent
920168e7d1
commit
817c0e48ca
@ -127,45 +127,59 @@ const toggleUserActive = async (req, res) => {
|
|||||||
|
|
||||||
// Получаем доступ к io для отправки уведомлений
|
// Получаем доступ к io для отправки уведомлений
|
||||||
const io = req.app.get('io');
|
const io = req.app.get('io');
|
||||||
|
if (!io) {
|
||||||
|
console.error('[AdminController] Ошибка: экземпляр Socket.IO не доступен через req.app.get("io")');
|
||||||
|
return res.status(500).json({ message: 'Внутренняя ошибка сервера: Socket.IO недоступен' });
|
||||||
|
}
|
||||||
|
|
||||||
// Изменяем статус активности на противоположный
|
// Изменяем статус активности на противоположный
|
||||||
const wasActive = user.isActive;
|
const wasActive = user.isActive;
|
||||||
user.isActive = !user.isActive;
|
user.isActive = !user.isActive;
|
||||||
await user.save();
|
await user.save();
|
||||||
|
|
||||||
|
// Получаем глобальный массив активных пользователей из server.js
|
||||||
|
// Это напрямую обращается к глобальной переменной в server.js
|
||||||
|
const activeUsers = req.app.get('activeUsers') || [];
|
||||||
|
|
||||||
|
console.log(`[AdminController] Активные пользователи:`, activeUsers);
|
||||||
|
|
||||||
// Если пользователь был активным и теперь блокируется
|
// Если пользователь был активным и теперь блокируется
|
||||||
if (wasActive && !user.isActive) {
|
if (wasActive && !user.isActive) {
|
||||||
console.log(`[AdminController] Блокировка пользователя ${userId}. Причина: ${reason || 'Не указана'}`);
|
console.log(`[AdminController] Блокировка пользователя ${userId}. Причина: ${reason || 'Не указана'}`);
|
||||||
|
|
||||||
// Находим все активные сокеты пользователя - новый подход с более надежным поиском
|
// Ищем пользователя среди активных пользователей
|
||||||
const activeSockets = Array.from(io.sockets.sockets.values()).filter(socket => {
|
const userSockets = activeUsers.filter(u => u.userId === userId);
|
||||||
return socket &&
|
console.log(`[AdminController] Найдено активных записей пользователя: ${userSockets.length}`);
|
||||||
socket.handshake &&
|
|
||||||
socket.handshake.query &&
|
|
||||||
socket.handshake.query.userId === userId;
|
|
||||||
});
|
|
||||||
|
|
||||||
console.log(`[AdminController] Найдено активных сокетов пользователя: ${activeSockets.length}`);
|
if (userSockets.length > 0) {
|
||||||
|
userSockets.forEach(userSocket => {
|
||||||
if (activeSockets.length > 0) {
|
try {
|
||||||
// Отправляем уведомление по всем активным сокетам пользователя
|
const socket = io.sockets.sockets.get(userSocket.socketId);
|
||||||
activeSockets.forEach(socket => {
|
if (socket) {
|
||||||
console.log(`[AdminController] Отправка уведомления о блокировке на сокет: ${socket.id}`);
|
console.log(`[AdminController] Отправка уведомления о блокировке на сокет: ${userSocket.socketId}`);
|
||||||
socket.emit("account_blocked", {
|
socket.emit("account_blocked", {
|
||||||
message: 'Ваш аккаунт был заблокирован администратором.',
|
message: 'Ваш аккаунт был заблокирован администратором.',
|
||||||
reason: reason || 'Нарушение правил сервиса',
|
reason: reason || 'Нарушение правил сервиса',
|
||||||
timestamp: new Date().toISOString(),
|
timestamp: new Date().toISOString(),
|
||||||
blocked: true
|
blocked: true
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
// Принудительно отключаем все сокеты пользователя
|
// Принудительно отключаем сокет
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
activeSockets.forEach(socket => {
|
try {
|
||||||
console.log(`[AdminController] Принудительное отключение сокета: ${socket.id}`);
|
console.log(`[AdminController] Принудительное отключение сокета: ${userSocket.socketId}`);
|
||||||
socket.disconnect(true);
|
socket.disconnect(true);
|
||||||
|
} catch (socketError) {
|
||||||
|
console.error(`[AdminController] Ошибка при отключении сокета ${userSocket.socketId}:`, socketError);
|
||||||
|
}
|
||||||
|
}, 500);
|
||||||
|
} else {
|
||||||
|
console.log(`[AdminController] Не найден объект сокета для ID: ${userSocket.socketId}`);
|
||||||
|
}
|
||||||
|
} catch (socketError) {
|
||||||
|
console.error(`[AdminController] Ошибка при обработке сокета ${userSocket.socketId}:`, socketError);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}, 1000); // Небольшая задержка, чтобы сообщение о блокировке успело доставиться
|
|
||||||
} else {
|
} else {
|
||||||
console.log(`[AdminController] Пользователь ${userId} не найден в активных соединениях`);
|
console.log(`[AdminController] Пользователь ${userId} не найден в активных соединениях`);
|
||||||
}
|
}
|
||||||
@ -174,21 +188,25 @@ const toggleUserActive = async (req, res) => {
|
|||||||
else if (!wasActive && user.isActive) {
|
else if (!wasActive && user.isActive) {
|
||||||
console.log(`[AdminController] Разблокировка пользователя ${userId}`);
|
console.log(`[AdminController] Разблокировка пользователя ${userId}`);
|
||||||
|
|
||||||
// То же самое для поиска сокетов пользователя
|
// Ищем пользователя среди активных пользователей (на случай, если он онлайн с другим аккаунтом)
|
||||||
const activeSockets = Array.from(io.sockets.sockets.values()).filter(socket => {
|
const userSockets = activeUsers.filter(u => u.userId === userId);
|
||||||
return socket &&
|
|
||||||
socket.handshake &&
|
|
||||||
socket.handshake.query &&
|
|
||||||
socket.handshake.query.userId === userId;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (activeSockets.length > 0) {
|
if (userSockets.length > 0) {
|
||||||
activeSockets.forEach(socket => {
|
userSockets.forEach(userSocket => {
|
||||||
console.log(`[AdminController] Отправка уведомления о разблокировке на сокет: ${socket.id}`);
|
try {
|
||||||
|
const socket = io.sockets.sockets.get(userSocket.socketId);
|
||||||
|
if (socket) {
|
||||||
|
console.log(`[AdminController] Отправка уведомления о разблокировке на сокет: ${userSocket.socketId}`);
|
||||||
socket.emit("account_unblocked", {
|
socket.emit("account_unblocked", {
|
||||||
message: 'Ваш аккаунт был разблокирован администратором.',
|
message: 'Ваш аккаунт был разблокирован администратором.',
|
||||||
timestamp: new Date().toISOString()
|
timestamp: new Date().toISOString()
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
console.log(`[AdminController] Не найден объект сокета для ID: ${userSocket.socketId}`);
|
||||||
|
}
|
||||||
|
} catch (socketError) {
|
||||||
|
console.error(`[AdminController] Ошибка при обработке сокета ${userSocket.socketId}:`, socketError);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
console.log(`[AdminController] Пользователь ${userId} не найден в активных соединениях для отправки уведомления о разблокировке`);
|
console.log(`[AdminController] Пользователь ${userId} не найден в активных соединениях для отправки уведомления о разблокировке`);
|
||||||
|
@ -91,6 +91,9 @@ app.use('/api/admin', adminRoutes); // Подключаем маршруты д
|
|||||||
// Socket.IO логика
|
// Socket.IO логика
|
||||||
let activeUsers = [];
|
let activeUsers = [];
|
||||||
|
|
||||||
|
// Делаем массив activeUsers доступным для контроллеров
|
||||||
|
app.set('activeUsers', activeUsers);
|
||||||
|
|
||||||
io.on("connection", (socket) => {
|
io.on("connection", (socket) => {
|
||||||
console.log("A user connected:", socket.id);
|
console.log("A user connected:", socket.id);
|
||||||
|
|
||||||
@ -106,6 +109,10 @@ io.on("connection", (socket) => {
|
|||||||
// Добавляем нового пользователя
|
// Добавляем нового пользователя
|
||||||
activeUsers.push({ userId, socketId: socket.id });
|
activeUsers.push({ userId, socketId: socket.id });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Обновляем массив пользователей в приложении для доступа из контроллеров
|
||||||
|
app.set('activeUsers', activeUsers);
|
||||||
|
|
||||||
io.emit("getUsers", activeUsers); // Отправляем обновленный список активных пользователей всем клиентам
|
io.emit("getUsers", activeUsers); // Отправляем обновленный список активных пользователей всем клиентам
|
||||||
console.log("User added to active users:", userId, socket.id);
|
console.log("User added to active users:", userId, socket.id);
|
||||||
console.log("Active users:", activeUsers);
|
console.log("Active users:", activeUsers);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user