강동현

방 접속시 유저 정보 업데이트

1 import { RoomData } from "../room/types"; 1 import { RoomData } from "../room/types";
2 +import { UserData } from "../user/types";
2 3
3 export interface Message { 4 export interface Message {
4 readonly type: string; 5 readonly type: string;
...@@ -24,9 +25,24 @@ export class RoomLeaveMessage implements Message { ...@@ -24,9 +25,24 @@ export class RoomLeaveMessage implements Message {
24 constructor() {} 25 constructor() {}
25 } 26 }
26 27
28 +export class RoomInfoMessage implements Message {
29 + readonly type = MessageType.ROOM_INFO;
30 + constructor(public userdata: UserData[]) {}
31 +}
32 +
33 +export class RoomUserUpdateMessage implements Message {
34 + readonly type = MessageType.ROOM_USER_UPDATE;
35 + constructor(
36 + public state: "added" | "updated" | "removed",
37 + public userdata: UserData
38 + ) {}
39 +}
40 +
27 export class MessageType { 41 export class MessageType {
28 static readonly LOGIN = "login"; 42 static readonly LOGIN = "login";
29 static readonly ROOM_LIST = "room_list"; 43 static readonly ROOM_LIST = "room_list";
30 static readonly ROOM_JOIN = "room_join"; 44 static readonly ROOM_JOIN = "room_join";
31 static readonly ROOM_LEAVE = "room_leave"; 45 static readonly ROOM_LEAVE = "room_leave";
46 + static readonly ROOM_INFO = "room_info";
47 + static readonly ROOM_USER_UPDATE = "room_user_update";
32 } 48 }
......
1 import { Connection } from "../connection/Connection"; 1 import { Connection } from "../connection/Connection";
2 import { v4 as uuidv4 } from "uuid"; 2 import { v4 as uuidv4 } from "uuid";
3 import { RoomData } from "./types"; 3 import { RoomData } from "./types";
4 +import {
5 + Message,
6 + RoomInfoMessage,
7 + RoomUserUpdateMessage,
8 +} from "../message/types";
9 +import { UserData } from "../user/types";
4 10
5 export class Room { 11 export class Room {
6 public readonly uuid: string; 12 public readonly uuid: string;
...@@ -19,6 +25,12 @@ export class Room { ...@@ -19,6 +25,12 @@ export class Room {
19 } 25 }
20 26
21 public connect(connection: Connection): void { 27 public connect(connection: Connection): void {
28 + // TODO: 더 나은 인증 처리
29 + const user = connection.user;
30 + if (user === undefined) {
31 + return;
32 + }
33 +
22 if ( 34 if (
23 this.connections.includes(connection) || 35 this.connections.includes(connection) ||
24 this.connections.length >= this.maxConnections 36 this.connections.length >= this.maxConnections
...@@ -28,13 +40,27 @@ export class Room { ...@@ -28,13 +40,27 @@ export class Room {
28 40
29 this.connections.push(connection); 41 this.connections.push(connection);
30 connection.room = this; // TODO: 더 나은 관리 42 connection.room = this; // TODO: 더 나은 관리
43 +
44 + this.broadcast(new RoomUserUpdateMessage("added", user.getData()));
45 +
46 + var users: UserData[] = [];
47 + this.connections.forEach((con) => {
48 + if (con.user !== undefined && connection !== con) {
49 + users.push(con.user.getData());
50 + }
51 + });
52 + connection.send(new RoomInfoMessage(users));
31 } 53 }
32 54
33 public disconnect(connection: Connection): void { 55 public disconnect(connection: Connection): void {
34 const index = this.connections.indexOf(connection); 56 const index = this.connections.indexOf(connection);
35 - if (index > -1) { 57 + if (connection.user !== undefined && index > -1) {
36 this.connections.splice(index, 1); 58 this.connections.splice(index, 1);
37 connection.room = undefined; 59 connection.room = undefined;
60 +
61 + this.broadcast(
62 + new RoomUserUpdateMessage("removed", connection.user.getData())
63 + );
38 } 64 }
39 } 65 }
40 66
...@@ -47,6 +73,14 @@ export class Room { ...@@ -47,6 +73,14 @@ export class Room {
47 }; 73 };
48 } 74 }
49 75
76 + public broadcast(message: Message, except?: Connection): void {
77 + this.connections.forEach((connection) => {
78 + if (connection !== except) {
79 + connection.send(message);
80 + }
81 + });
82 + }
83 +
50 public close(): void { 84 public close(): void {
51 if (!this.closed) { 85 if (!this.closed) {
52 this.connections.forEach((connection) => this.disconnect(connection)); 86 this.connections.forEach((connection) => this.disconnect(connection));
......
1 +import { UserData } from "./types";
2 +
1 export class User { 3 export class User {
2 public readonly username: string; 4 public readonly username: string;
3 5
4 constructor(username: string) { 6 constructor(username: string) {
5 this.username = username; 7 this.username = username;
6 } 8 }
9 +
10 + public getData(): UserData {
11 + return {
12 + username: this.username,
13 + };
14 + }
7 } 15 }
......
1 +export interface UserData {
2 + username: string;
3 +}