import { pubClient } from "../connection/redis.js"; import { ROLES, CODEMEG, EVENT, FROMTYPE } from "../enum/index.js"; import { io } from "../core/io.js"; import { logger } from "../core/logger.js"; import { updateUser, removeRoomAllUsers, getAllRoomUsers, updateRoomUser } from "../service/userService.js"; import { watchRoomService } from "../service/watchRoomService.js"; import { setRoomConfig, getRoomConfig } from "../service/roomConfigService.js"; import { getSig } from "../core/getSig.js"; import { isHoster, buildRoom, startCallAction, stopCallAction, joinRoomAction, leaveRoomAction, shotGunLeaveAction, disconnectAction } from "./roomActionController.js"; import { RoomAssistantController } from './roomAssistantController.js' export async function roomController(socket) { try { let user = socket.handshake.query; const roomAssistant = new RoomAssistantController(socket) const { roomId, userId, sceneNum, isClient, role, userLimitNum, sceneNumber, roomType, from, enableTalk } = user; if (user) { const oneSceneNum = sceneNumber || sceneNum; const syncId = `sync-${oneSceneNum}-${userId}`; const roomSessionId = `${oneSceneNum}-${userId}`; console.log('roomSessionId', roomSessionId); const userUniqueId = `user-${userId}`; const uRoomId = await roomAssistant.prepearRoom(roomSessionId,roomId); const roomUniqueId = `room-${uRoomId}_${oneSceneNum}_web`; console.log('roomUniqueId',roomUniqueId) // const userLimitNum = userLimitNum || process.env.US if ("roomId" in user && "userId" in user) { user.sig = getSig(userId); const userObj = { ...user, isConnected: true, roomType: roomType || "" }; updateUser(userUniqueId, userObj); // await pubClient.hSet(userUniqueId, user); // await pubClient.expire(userUniqueId, 60 * 60 * 24); if (isHoster(role)) { if ([FROMTYPE.MiniAPP].includes(Number(from))) { await setRoomConfig(roomUniqueId, { userLimitNum, enableTalk: enableTalk === "true" ? true : false, }); } } socket.join(roomUniqueId); } else { logger.info("user-query-不存在 :", socket.handshake.query); socket.disconnect(); } socket.on(EVENT.action, (data) => { console.log("room-action", roomUniqueId, socket.rooms.has(roomUniqueId), JSON.stringify(data)); if (socket.rooms.has(roomUniqueId)) { socket.broadcast.to(roomUniqueId).emit(EVENT.action, data); } else { logger.error("action 事件不在房间内", user); } }); // 通知 baseView 减少大量通知 socket.on(EVENT.webSyncAction, (data) => { // socket.broadcast.to(roomUniqueId).emit(EVENT.webSyncAction, data); if ([FROMTYPE.base].includes(Number(from))) { socket.broadcast.to(roomUniqueId).emit(EVENT.webSyncAction, data); } }); socket.onAny((event, data) => { if (event !== "webSyncAction") { console.log(`onAny:get ${event}, data:${JSON.stringify(data)}`); } }); socket.on(EVENT.changeRoomEnableTalk, async (data) => { // this._roomsConfig[roomId].enableTalk = data; await setRoomConfig(roomUniqueId, data); const roomConfig = await getRoomConfig(roomUniqueId); socket.broadcast.to(roomUniqueId).emit(EVENT.changeRoomEnableTalk, roomConfig); }); socket.on(EVENT.changeOnlineStatus, async (data) => { user.onlineStatus = data.status; const AllRoomUsers = await getAllRoomUsers(roomUniqueId); await updateRoomUser(roomUniqueId, userUniqueId, user); let actionName = user.onlineStatus ? "inRoom" : "leaveRoom"; logger.info("changeOnlineStatus", user); socket.broadcast.to(roomUniqueId).emit(EVENT.roomPersonChange, { roomsPerson: AllRoomUsers, actionName, user, }); }); socket.on(EVENT.startCall, () => { startCallAction(roomUniqueId, userUniqueId, user, socket); }); socket.on(EVENT.stopCall, () => { stopCallAction(roomUniqueId, userUniqueId, user, socket); }); socket.on("disconnect", async (reason) => { // leaveRoom({ clientRoom, userUniqueId, roomUniqueId, socket }); // watchRoomWithMaster(roomUniqueId, socket); console.log("reason", reason); if (reason === "transport close") { // 主动离开 shotGunLeaveAction( { syncId, roomId: roomUniqueId, userId: userUniqueId, }, socket, user, ); } else { // 被动离开 // disconnectAction( // { // syncId, // roomId: roomUniqueId, // userId: userUniqueId, // }, // socket, // user, // ); } }); socket.on("reconnect", () => { console.log("reconnect"); }); } } catch (error) { console.log('roomController::error',error) } }