From d11dcea6ddf094d2b4994cb8694e93eb0de87cb9 Mon Sep 17 00:00:00 2001 From: BH-Kang Date: Tue, 31 Aug 2021 01:25:37 +0900 Subject: [PATCH] feat/1 Create rooms events --- .gitignore | 2 + app.js | 14 +++++++ package.json | 21 +++++++++++ room/CreateID.js | 13 +++++++ room/Createroom.js | 30 +++++++++++++++ room/Users.js | 0 room/rooms.js | 1 + socket.js | 93 ++++++++++++++++++++++++++++++++++++++++++++++ users.js | 0 9 files changed, 174 insertions(+) create mode 100644 .gitignore create mode 100644 app.js create mode 100644 package.json create mode 100644 room/CreateID.js create mode 100644 room/Createroom.js create mode 100644 room/Users.js create mode 100644 room/rooms.js create mode 100644 socket.js create mode 100644 users.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..25c8fdb --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +package-lock.json \ No newline at end of file diff --git a/app.js b/app.js new file mode 100644 index 0000000..3793a57 --- /dev/null +++ b/app.js @@ -0,0 +1,14 @@ +const express = require('express'); +const path = require('path'); +const fs = require('fs'); + +const app = express(); +app.set('port', process.env.PORT || 8888); +const webSocket = require('./socket.js'); + +// express 서버 litern +const server = app.listen(app.get('port'), () => { + console.log(app.get('port'), '번 포트에서 대기중'); +}) + +webSocket(server); \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..64ea1c6 --- /dev/null +++ b/package.json @@ -0,0 +1,21 @@ +{ + "name": "project1", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node app.js" + }, + "author": "", + "license": "ISC", + "dependencies": { + "cookie-parser": "^1.4.5", + "dotenv": "^10.0.0", + "express": "^4.17.1", + "express-session": "^1.17.2", + "morgan": "^1.10.0", + "nunjucks": "^3.2.3", + "socket.io": "^4.1.3" + } +} diff --git a/room/CreateID.js b/room/CreateID.js new file mode 100644 index 0000000..d58c466 --- /dev/null +++ b/room/CreateID.js @@ -0,0 +1,13 @@ +data = require('./rooms'); + +function Create(data) { + const id = 1 + for (var i in data) { + if (id === i) { + id++; + } + } + data.push(id); +} + +module.exports = Create; \ No newline at end of file diff --git a/room/Createroom.js b/room/Createroom.js new file mode 100644 index 0000000..3139d0a --- /dev/null +++ b/room/Createroom.js @@ -0,0 +1,30 @@ +const CreateID = require('./CreateID.js'); + +module.exports = class Room{ + constructor(data){ + this.Id = CreateID(); + this.roomname = data.roomname; + this.password = data.password; + this.host = data.user; + if (this.password) { + this.isOpen = true; + } else { + this.isOpen = false; + } + this.max_users = data.max_users; + this.members = [] + } + + JoinRoom (data) { + // data 는 user 이름 + this.members.append(data); + } + + LeaveRoom (data) { + this.members.remove(data); + } + + CountUsers() { + return this.members.length + } +} diff --git a/room/Users.js b/room/Users.js new file mode 100644 index 0000000..e69de29 diff --git a/room/rooms.js b/room/rooms.js new file mode 100644 index 0000000..fca485c --- /dev/null +++ b/room/rooms.js @@ -0,0 +1 @@ +module.exports.rooms = []; \ No newline at end of file diff --git a/socket.js b/socket.js new file mode 100644 index 0000000..355fc43 --- /dev/null +++ b/socket.js @@ -0,0 +1,93 @@ +const SocketIO = require('socket.io'); +const Room = require('./room/Createroom'); +const rooms = require('./room/rooms.js'); + +module.exports = (server) => { + const io = SocketIO(server, {path: '/socket.io', transports: ['websocket']}); + + io.on('connection', (socket) => { + const req = socket.request; + const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress; + console.log( ip + '의 새로운 유저가 접속하였습니다.'); + + socket.on('createRoom', function(data) { + console.log("CreateRoom Event"); + room = new Room(data); + + socket.join('room:' + room.roomId); + room.host = data.name; + if (data.password == null) { + room.isOpen = true; + } else { + room.isOpen = false; + room.password = data.password; + } + room.max_user = data.max_user; + room.members.push(data.name); + rooms.push(room); + }); + + socket.on('JoinRoom', function(data) { + console.log("JoinRoom Event"); + if (!rooms.room.data.roomId) { + console.log("방이 존재하지 않습니다."); + socket.emit("Fail", { command : 'not existed'}); + } else { + const currentRoom = rooms.room.data.roomIds; + if (!currentRoom.isOpen && currentRoom.password !== data.password) { + console.log("비밀번호가 틀렸습니다.") + socket.emit("again"); + // 다시 화면으로 + } else if (currentRoom.max_user < data.max_user) { + console.log("방에 인원이 다 차있습니다."); + socket.emit("Fail"); + } else { + socket.join('room:' + data.roomId); + } + } + }); + socket.on('Update', function(data) { + const currentRoom = rooms.room.data.roomId; + currentRoom.name = data.roomName; + currentRoom.password = data.password; + currentRoom.host = data.name; + currentRoom.max_user = data.max_user; + }); + + socket.on('DeleteRoom', function(data) { + // 방소유주가 아닐 경우 + if (rooms.room.data.roomId) { + // 방이 만들어지지 않은 경우 + console.log('방이 만들어져있지 않습니다.') + } else { + const currentRoom = rooms.room.data.roomId; + + if (currentRoom.host == data.name) { + socket.leave(currentRoom); + rooms.remove(room.roomId); + socket.broadcast.to(currentRoom).emit("Delete", { message : + '방이 삭제되었습니다.' }); // 본인제외 방없어진 메시지 보내기 + } else { + console.log("권한이 없습니다."); + socket.emit("Fail_delete",); // event 수정 + } + } + }); + + socket.on('LeaveRoom', function(data) { + const currentRoom = rooms.room.data.roomId; + if (currentRoom.host == data.name) { + const randomNum = Math.random() * currentRoom.length(); + currentRoom.host = currentRoom.members[Math.floor(randomNum)]; + currentRoom.members.remove(data.name); + socket.leave(currentRoom); + } else if (currentRoom.host == data.name && currentRoom.members.length == 1){ + socket.leave(currentRoom); + rooms.remove(room.roomId); + } else { + currentRoom.members.remove(data.name); + socket.leave(currentRoom); + } + }); + }); +}; diff --git a/users.js b/users.js new file mode 100644 index 0000000..e69de29