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