From 8231f11bc2bd3bfe691c6b52f2958cc038997a72 Mon Sep 17 00:00:00 2001 From: HeeDragoN1123 Date: Thu, 9 Nov 2023 22:06:26 +0900 Subject: [PATCH] =?UTF-8?q?[=EC=9E=91=EC=97=85=EC=A4=91]=20=EC=9C=A0?= =?UTF-8?q?=EC=A0=80=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A4=91=EB=B3=B5=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/chats/chats.gateway.ts | 42 ++++--- src/chats/chats.module.ts | 4 +- src/chats/chats.service.ts | 232 ------------------------------------- 3 files changed, 24 insertions(+), 254 deletions(-) delete mode 100644 src/chats/chats.service.ts diff --git a/src/chats/chats.gateway.ts b/src/chats/chats.gateway.ts index 283924e..ae5909f 100644 --- a/src/chats/chats.gateway.ts +++ b/src/chats/chats.gateway.ts @@ -62,7 +62,6 @@ export class ChatsGateway socket.broadcast.emit('disconnect_user', user); await user.deleteOne(); - // userList에서 해당 유저 정보 제거 this.userList = this.userList.filter( (u) => u.userId !== user.data.userId ); @@ -76,7 +75,6 @@ export class ChatsGateway this.logger.log(`connected : ${socket.id} ${socket.nsp.name}`); // await this.logger.log(`connected : ${socket.id} ${socket.nsp.name}`); } - // 클라이언트가 'join_room' 메시지를 보낼 때 실행되는 메소드 @SubscribeMessage('join_room') async handleJoinRoom( @MessageBody() @@ -88,27 +86,33 @@ export class ChatsGateway }, @ConnectedSocket() socket: Socket ) { - socket.join(String(payload.roomId)); - this.logger.log( - `Joined room: ${payload.roomId}, Nickname: ${payload.nickname}` + const isUserAlreadyInList = this.userList.some( + (user) => user.userId === payload.userId ); - //이전 채팅 내용을 불러옵니다. - const chatHistory = await this.getChatHistory(payload.roomId); + if (!isUserAlreadyInList) { + socket.join(String(payload.roomId)); + this.logger.log( + `Joined room: ${payload.roomId}, Nickname: ${payload.nickname}` + ); - // userList에 사용자 정보 추가 - this.userList.push({ - nickname: payload.nickname, - profileImg: payload.profileImg, - userId: payload.userId, - }); + // 이전 채팅 내용을 불러옵니다. + const chatHistory = await this.getChatHistory(payload.roomId); - // 이전 채팅 내용과 함께 사용자 정보를 클라이언트에게 전송합니다. - socket.emit('chat_history', chatHistory); - // 방에 있는 모든 사용자에게 userList 전송 - this.server.to(String(payload.roomId)).emit('user_connected', payload); - console.log(this.userList); - this.server.to(String(payload.roomId)).emit('userList', this.userList); + // userList에 사용자 정보 추가 + this.userList.push({ + nickname: payload.nickname, + profileImg: payload.profileImg, + userId: payload.userId, + }); + + // 이전 채팅 내용과 함께 사용자 정보를 클라이언트에게 전송합니다. + socket.emit('chat_history', chatHistory); + // 방에 있는 모든 사용자에게 userList 전송 + this.server.to(String(payload.roomId)).emit('user_connected', payload); + console.log('유저리스트 콘솔', this.userList); + this.server.to(String(payload.roomId)).emit('userList', this.userList); + } } // 방에서 적었던 채팅 내용을 불러오는 매서드 diff --git a/src/chats/chats.module.ts b/src/chats/chats.module.ts index d7f6c92..c07e93a 100644 --- a/src/chats/chats.module.ts +++ b/src/chats/chats.module.ts @@ -3,8 +3,6 @@ import { Module } from '@nestjs/common'; import { ChatsGateway } from './chats.gateway'; import { MongooseModule } from '@nestjs/mongoose'; import { Chatting, ChattingSchema } from './models/chattings.model'; -import { ChatsService } from './chats.service'; - @Module({ imports: [ MongooseModule.forFeature([ @@ -12,6 +10,6 @@ import { ChatsService } from './chats.service'; { name: SocketModel.name, schema: SocketSchema }, ]), ], - providers: [ChatsGateway, ChatsService], + providers: [ChatsGateway], }) export class ChatsModule {} diff --git a/src/chats/chats.service.ts b/src/chats/chats.service.ts deleted file mode 100644 index c43958b..0000000 --- a/src/chats/chats.service.ts +++ /dev/null @@ -1,232 +0,0 @@ -import { Injectable, Logger, NotFoundException } from '@nestjs/common'; -import { Server, Socket } from 'socket.io'; -import { Socket as SocketModel } from './models/sockets.model'; -import { Chatting, Chatting as ChattingModel } from './models/chattings.model'; -import { InjectModel } from '@nestjs/mongoose'; -import { Model } from 'mongoose'; -import { IuserInfo } from './interfaces/chats.interface'; - -@Injectable() -export class ChatsService { - private logger = new Logger('chat'); - constructor( - @InjectModel(SocketModel.name) - private readonly socketModel: Model, - @InjectModel(ChattingModel.name) - private readonly ChattingModel: Model - ) { - this.logger.log('constructor'); - } - - //유저가 방에 참여 - async joinRoom(socket: Socket, server: Server, iuserInfo: IuserInfo) { - const { roomId, nickname } = iuserInfo; - - // 해당 방 정보를 조회 - const roomData = await this.ChattingModel.findOne({ roomId }); - if (!roomData) { - // 방 정보가 없으면 새로운 방을 만들고 사용자 정보를 추가 - await this.createRoom(socket, iuserInfo); - } else { - // 방 정보가 이미 있는 경우 사용자 정보 업데이트 - await this.updateRoom(socket, roomData, iuserInfo); - } - - // 사용자 목록을 클라이언트에게 전송하고 새로운 유저가 방에 참가했음을 알림 - this.sendUserListToClient(server, roomId); - server - .to(String(roomId)) - .emit('new-user', `${nickname} 유저가 채팅방에 참가하였습니다.`); - } - - // 방에 속한 유저 목록을 클라이언트에게 전송하는 메서드 ( 객체를 배열로 변환하여 프론트로 반환하는 코드) - async sendUserListToClient(server: Server, roomId: number) { - // 해당 방의 정보를 조회 - const room = await this.ChattingModel.findOne({ roomId }); - // 방 정보가 존재하면 유저 목록을 배열로 변환하여 클라이언트에게 전달 - if (room) { - const userList = Object.values(room.userList); // userList는 객체이므로 배열로 변환 - server.to(String(roomId)).emit('user_list', userList); - } - } - - // 방에 속한 유저 목록을 클라이언트에게 전송하는 메서드(객체 그대로 프론트로 반환하는 코드) - // async sendUserListToClient(server: Server, roomId: number) { - // // 해당 방의 정보를 조회 - // const room = await this.ChattingModel.findOne({ roomId }); - // // 방 정보가 존재하면 유저 목록을 객체 그대로 클라이언트에게 전달 - // if (room) { - // server.to(String(roomId)).emit('user_list', room.userList); - // } - // } - - //채팅방을 만듬 - async createRoom( - socket: Socket, - { nickname, roomId, profileImg, userId }: IuserInfo - ) { - const newRoom = { - roomId: roomId, - userList: [ - { - socketId: socket.id, - userId: userId, - nickname: nickname, - profileImg: profileImg, - }, - ], - }; - await this.ChattingModel.create(newRoom); - const newuser = { - socketId: socket.id, - roomId: roomId, - nickname: nickname, - userId: userId, - }; - await this.socketModel.create(newuser); - } - - //채팅방을 참여하는 사용자 정보 업데이트 - async updateRoom( - socket: Socket, - roomData: any, - { roomId, nickname, profileImg, userId }: IuserInfo - ) { - const newuser = { - socketId: socket.id, - roomId, - nickname, - userId, - }; - await this.socketModel.create(newuser); - const chatRoom = roomData; - chatRoom.userList.push({ - socketId: socket.id, - userId: userId, - nickname: nickname, - profileImg: profileImg, - }); - await this.ChattingModel.findOneAndUpdate( - { roomId }, - { $set: { userList: chatRoom.userList } } - ); - } - - async removeRoom(socket: Socket, server: Server, roomId: number) { - const findChattingRoom = await this.ChattingModel.findOne({ - roomId, - }).exec(); - - if (!findChattingRoom) { - return server - .to(socket.id) - .emit('NotFound-ChattingRoom', new NotFoundException()); - } - - await this.deleteRoom(roomId); - } - - async deleteRoom(roomId: number): Promise { - const deleteChattingRoom = await this.ChattingModel.findOneAndDelete({ - roomId, - }).exec(); - return deleteChattingRoom; - } - - async leaveRoom(socket: Socket, server: Server) { - // 클라이언트 ID를 기반으로 사용자 정보 조회 - const user = await this.socketModel.findOne({ socketId: socket.id }); - if (!user) { - return server - .to(socket.id) - .emit('NotFound_user', new NotFoundException()); - } - const roomId = user.roomId; - const nickname = user.nickname; - - // 사용자 정보 삭제 - await this.socketModel.findOneAndDelete({ socketId: socket.id }).exec(); - - // 방 정보 조회 - const room = await this.ChattingModel.findOne({ roomId }); - if (!room) { - return server - .to(socket.id) - .emit('NotFound_room', new NotFoundException()); - } - - // 사용자를 방에서 삭제하고 유저 리스트 업데이트 - const userIndex = room.userList.findIndex((u) => u.socketId === socket.id); - if (userIndex !== -1) { - room.userList.splice(userIndex, 1); - await this.ChattingModel.findOneAndUpdate( - { roomId }, - { $set: { userList: room.userList } } - ); - - // 방에서 나간 사용자에게 메시지 보내기 - server - .to(String(roomId)) - .emit('left_user', `${nickname} 유저가 채팅방을 떠났습니다.`); - } - } - - async getChatHistory(roomId: number) { - const chatHistory = await this.ChattingModel.find({ roomId }).exec(); - return chatHistory; - } -} - -//소켓연결 해제 -// async disconnectClient(socket: Socket, server: Server) { -// // 클라이언트 ID를 기반으로 사용자 정보 조회 -// const user = await this.socketModel.findOne({ socketId: socket.id }); -// if (!user) { -// return server -// .to(socket.id) -// .emit('NotFound_user', new NotFoundException()); -// } -// const roomId = user.roomId; -// // 클라이언트 ID에 해당하는 사용자를 삭제 -// await this.socketModel.findOneAndDelete({ socketId: socket.id }).exec(); -// // 방 정보 조회 -// const room = await this.ChattingModel.findOne({ roomId }); -// if (!room) { -// return server -// .to(socket.id) -// .emit('NotFound_room', new NotFoundException()); -// } -// // 업데이트된 데이터를 저장 -// await this.ChattingModel.findOneAndUpdate( -// { roomId }, -// { $set: { userList: room.userList } } -// ); -// // this.emitEventForUserList(socket, server, roomId, nickname, 'leave_user'); -// this.logger.log(`disconnected: ${socket.id}`); -// } - -// async leaveRoom(socket: Socket, server: Server, roomId: number) { -// const room = await this.ChattingModel.findOne({ roomId }); -// if (!room) { -// return server -// .to(socket.id) -// .emit('NotFound_room', new NotFoundException()); -// } -// const userId = room.userList[socket.id]; -// const nickname = room.userList[socket.id].nickname; - -// if (userId) { -// delete room.userList[socket.id]; -// } else { -// return server -// .to(socket.id) -// .emit('NotFound_userId', new NotFoundException()); -// } -// await this.ChattingModel.findOneAndUpdate( -// { roomId }, -// { $set: { userList: room.userList } } -// ); -// server -// .to(String(roomId)) -// .emit('left_user', `${nickname} 유저가 채팅방을 떠났습니다.`); -// }