-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
-
43
-
44
-
45
-
46
-
47
-
48
-
49
-
50
-
51
-
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
-
66
-
67
-
68
-
69
-
70
-
71
-
72
-
73
-
74
import Client from './Client';
import Game from './Game';
import logSocket from './logSocket';
import server from './server';
export default class Room {
static rooms = new Map();
static get(name: string) {
return this.rooms.get(name);
}
name: string;
password: string;
clients: Client[] = [];
host: Client;
game: Game | null = null;
constructor(name: string, password: string, host: Client) {
this.name = name;
this.password = password;
this.host = host;
this.add(host);
host.once('startGame', () => this.startGame());
Room.rooms.set(name, this);
}
add(client: Client) {
this.clients.push(client);
client.room = this;
server.to(this.name).emit('roomUpdate', {
users: this.clients.map((client: Client) => client.username),
host: this.host.username
});
client.once('leaveRoom', () => this.remove(client));
this.updateSocket(client);
}
updateSocket(client: Client) {
client.socket.join(this.name);
client.socket.emit('joinRoom', {name: this.name});
client.socket.emit('roomUpdate', {
users: this.clients.map((client: Client) => client.username),
host: this.host.username
});
if (this.game)
this.game.updateSocket(client);
}
remove(client: Client) {
this.clients.splice(this.clients.indexOf(client), 1);
client.room = null;
client.socket.leave(this.name);
client.socket.emit('leaveRoom');
if (!this.clients.length) {
Room.rooms.delete(this.name);
return;
}
if (this.host === client) {
this.host.removeAllListeners('startGame');
this.host = this.clients[0];
if (!this.game)
this.host.once('startGame', () => this.startGame());
}
server.to(this.name).emit('roomUpdate', {
users: this.clients.map((client: Client) => client.username),
host: this.host.username
});
if (this.game)
this.game.remove(client);
}
startGame() {
if (this.clients.length < 2) {
this.host.socket.disconnect();
logSocket(this.host.socket, 'Not enough users for startGame');
return;
}
this.game = new Game(this);
}
};