강동현

방에서 User 객체를 사용하도록 변경

...@@ -8,7 +8,6 @@ export class Connection { ...@@ -8,7 +8,6 @@ export class Connection {
8 public readonly socket: Socket; 8 public readonly socket: Socket;
9 9
10 public user?: User; 10 public user?: User;
11 - public room?: Room;
12 11
13 constructor(socket: Socket) { 12 constructor(socket: Socket) {
14 this.socket = socket; 13 this.socket = socket;
......
1 import { Connection } from "../connection/Connection"; 1 import { Connection } from "../connection/Connection";
2 +import { User } from "../user/User";
2 import { loginHandler } from "./handler/loginHandler"; 3 import { loginHandler } from "./handler/loginHandler";
3 import { roomJoinHandler } from "./handler/roomJoinHandler"; 4 import { roomJoinHandler } from "./handler/roomJoinHandler";
4 import { roomLeaveHandler } from "./handler/roomLeaveHandler"; 5 import { roomLeaveHandler } from "./handler/roomLeaveHandler";
...@@ -7,8 +8,16 @@ import { Message, MessageType } from "./types"; ...@@ -7,8 +8,16 @@ import { Message, MessageType } from "./types";
7 export class MessageHandlerRegistry { 8 export class MessageHandlerRegistry {
8 static registerHandlers(connection: Connection) { 9 static registerHandlers(connection: Connection) {
9 this.registerHandler(connection, MessageType.LOGIN, loginHandler); 10 this.registerHandler(connection, MessageType.LOGIN, loginHandler);
10 - this.registerHandler(connection, MessageType.ROOM_JOIN, roomJoinHandler); 11 + this.registerHandlerAuthed(
11 - this.registerHandler(connection, MessageType.ROOM_LEAVE, roomLeaveHandler); 12 + connection,
13 + MessageType.ROOM_JOIN,
14 + roomJoinHandler
15 + );
16 + this.registerHandlerAuthed(
17 + connection,
18 + MessageType.ROOM_LEAVE,
19 + roomLeaveHandler
20 + );
12 } 21 }
13 22
14 private static registerHandler<T extends Message>( 23 private static registerHandler<T extends Message>(
...@@ -20,4 +29,16 @@ export class MessageHandlerRegistry { ...@@ -20,4 +29,16 @@ export class MessageHandlerRegistry {
20 handler(connection, message); 29 handler(connection, message);
21 }); 30 });
22 } 31 }
32 +
33 + private static registerHandlerAuthed<T extends Message>(
34 + connection: Connection,
35 + typeName: string,
36 + handler: (user: User, message: T) => void
37 + ) {
38 + connection.socket.on(typeName, (message: T) => {
39 + if (connection.user !== undefined) {
40 + handler(connection.user, message);
41 + }
42 + });
43 + }
23 } 44 }
......
...@@ -7,7 +7,7 @@ export function loginHandler( ...@@ -7,7 +7,7 @@ export function loginHandler(
7 connection: Connection, 7 connection: Connection,
8 message: LoginMessage 8 message: LoginMessage
9 ): void { 9 ): void {
10 - connection.user = new User(message.username); 10 + connection.user = new User(message.username, connection);
11 console.log(`User ${message.username} has logged in!`); 11 console.log(`User ${message.username} has logged in!`);
12 12
13 RoomManager.instance().sendList(connection); 13 RoomManager.instance().sendList(connection);
......
1 import { Connection } from "../../connection/Connection"; 1 import { Connection } from "../../connection/Connection";
2 import { RoomManager } from "../../room/RoomManager"; 2 import { RoomManager } from "../../room/RoomManager";
3 +import { User } from "../../user/User";
3 import { RoomJoinMessage } from "../types"; 4 import { RoomJoinMessage } from "../types";
4 5
5 -export function roomJoinHandler( 6 +export function roomJoinHandler(user: User, message: RoomJoinMessage): void {
6 - connection: Connection,
7 - message: RoomJoinMessage
8 -): void {
9 const room = RoomManager.instance().get(message.uuid); 7 const room = RoomManager.instance().get(message.uuid);
10 if (room !== undefined) { 8 if (room !== undefined) {
11 - room.connect(connection); 9 + room.connect(user);
12 } 10 }
13 } 11 }
......
1 import { Connection } from "../../connection/Connection"; 1 import { Connection } from "../../connection/Connection";
2 import { RoomManager } from "../../room/RoomManager"; 2 import { RoomManager } from "../../room/RoomManager";
3 +import { User } from "../../user/User";
3 import { RoomLeaveMessage } from "../types"; 4 import { RoomLeaveMessage } from "../types";
4 5
5 -export function roomLeaveHandler( 6 +export function roomLeaveHandler(user: User, message: RoomLeaveMessage): void {
6 - connection: Connection, 7 + user.room?.disconnect(user);
7 - message: RoomLeaveMessage
8 -): void {
9 - if (connection.room !== undefined) {
10 - connection.room.disconnect(connection);
11 - }
12 } 8 }
......
...@@ -7,60 +7,50 @@ import { ...@@ -7,60 +7,50 @@ import {
7 RoomUserUpdateMessage, 7 RoomUserUpdateMessage,
8 } from "../message/types"; 8 } from "../message/types";
9 import { UserData } from "../user/types"; 9 import { UserData } from "../user/types";
10 +import { User } from "../user/User";
10 11
11 export class Room { 12 export class Room {
12 public readonly uuid: string; 13 public readonly uuid: string;
13 14
14 public name: string; 15 public name: string;
15 - public readonly maxConnections: number; 16 + public readonly maxUsers: number;
16 17
17 - private connections: Connection[] = []; 18 + private users: User[] = [];
18 19
19 private closed: boolean = false; 20 private closed: boolean = false;
20 21
21 - constructor(name: string, maxConnections: number = 8) { 22 + constructor(name: string, maxUsers: number = 8) {
22 this.uuid = uuidv4(); 23 this.uuid = uuidv4();
23 this.name = name; 24 this.name = name;
24 - this.maxConnections = maxConnections; 25 + this.maxUsers = maxUsers;
25 } 26 }
26 27
27 - public connect(connection: Connection): void { 28 + public connect(user: User): void {
28 - // TODO: 더 나은 인증 처리 29 + if (this.users.includes(user) || this.users.length >= this.maxUsers) {
29 - const user = connection.user;
30 - if (user === undefined) {
31 return; 30 return;
32 } 31 }
33 32
34 - if ( 33 + this.users.push(user);
35 - this.connections.includes(connection) || 34 + user.room = this; // TODO: 더 나은 관리
36 - this.connections.length >= this.maxConnections
37 - ) {
38 - return;
39 - }
40 -
41 - this.connections.push(connection);
42 - connection.room = this; // TODO: 더 나은 관리
43 35
44 this.broadcast(new RoomUserUpdateMessage("added", user.getData())); 36 this.broadcast(new RoomUserUpdateMessage("added", user.getData()));
45 37
46 var users: UserData[] = []; 38 var users: UserData[] = [];
47 - this.connections.forEach((con) => { 39 + this.users.forEach((u) => {
48 - if (con.user !== undefined && connection !== con) { 40 + if (user !== u) {
49 - users.push(con.user.getData()); 41 + users.push(u.getData());
50 } 42 }
51 }); 43 });
52 - connection.send(new RoomInfoMessage(users)); 44 + user.connection.send(new RoomInfoMessage(users));
53 } 45 }
54 46
55 - public disconnect(connection: Connection): void { 47 + public disconnect(user: User): void {
56 - const index = this.connections.indexOf(connection); 48 + const index = this.users.indexOf(user);
57 - if (connection.user !== undefined && index > -1) { 49 + if (index > -1) {
58 - this.connections.splice(index, 1); 50 + this.users.splice(index, 1);
59 - connection.room = undefined; 51 + user.room = undefined;
60 52
61 - this.broadcast( 53 + this.broadcast(new RoomUserUpdateMessage("removed", user.getData()));
62 - new RoomUserUpdateMessage("removed", connection.user.getData())
63 - );
64 } 54 }
65 } 55 }
66 56
...@@ -68,22 +58,22 @@ export class Room { ...@@ -68,22 +58,22 @@ export class Room {
68 return { 58 return {
69 uuid: this.uuid, 59 uuid: this.uuid,
70 name: this.name, 60 name: this.name,
71 - currentConnections: this.connections.length, 61 + currentUsers: this.users.length,
72 - maxConnections: this.maxConnections, 62 + maxUsers: this.maxUsers,
73 }; 63 };
74 } 64 }
75 65
76 - public broadcast(message: Message, except?: Connection): void { 66 + public broadcast(message: Message, except?: User): void {
77 - this.connections.forEach((connection) => { 67 + this.users.forEach((u) => {
78 - if (connection !== except) { 68 + if (u !== except) {
79 - connection.send(message); 69 + u.connection.send(message);
80 } 70 }
81 }); 71 });
82 } 72 }
83 73
84 public close(): void { 74 public close(): void {
85 if (!this.closed) { 75 if (!this.closed) {
86 - this.connections.forEach((connection) => this.disconnect(connection)); 76 + this.users.forEach((u) => this.disconnect(u));
87 this.closed = true; 77 this.closed = true;
88 } 78 }
89 } 79 }
......
1 export interface RoomData { 1 export interface RoomData {
2 uuid: string; 2 uuid: string;
3 name: string; 3 name: string;
4 - currentConnections: number; 4 + currentUsers: number;
5 - maxConnections: number; 5 + maxUsers: number;
6 } 6 }
......
1 +import { Connection } from "../connection/Connection";
2 +import { Room } from "../room/Room";
1 import { UserData } from "./types"; 3 import { UserData } from "./types";
2 4
3 export class User { 5 export class User {
4 public readonly username: string; 6 public readonly username: string;
5 7
6 - constructor(username: string) { 8 + public readonly connection: Connection;
9 +
10 + public room?: Room;
11 +
12 + constructor(username: string, connection: Connection) {
7 this.username = username; 13 this.username = username;
14 + this.connection = connection;
8 } 15 }
9 16
10 public getData(): UserData { 17 public getData(): UserData {
......