-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
148 lines (125 loc) · 4 KB
/
server.js
File metadata and controls
148 lines (125 loc) · 4 KB
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/***************************
Server
***************************/
var express = require('express');
var app = express();
var web_server = require('http').createServer(app);
var web_socket = require('socket.io')(web_server);
var port = 3000;
app.use('/', express.static(__dirname + '/www'));
var roomNo = 1;
var playerNo = 1;
var roomsList = [];
// Create Room
function createRoom(client) {
// Join room and push infos
roomsList.push({ r: roomNo, status: 'joinable', creator: client.nickname });
client.join('room-' + roomNo);
console.log('>>', client.nickname, ' joined room-' + roomNo);
client.inroom = roomNo;
playerNo = 2; // So he has to wait another player
// Send infos to clients
roomInfo = { n: roomNo, player: playerNo, nick: client.nickname };
client.emit('roomInfo', roomInfo);
console.log('Rooms: ', roomsList);
client.broadcast.emit('roomList', roomsList);
roomNo++;
}
// Join room
function joinRoom(client, id) {
if (!id) {
// Client didn't select a room
client.emit('roomNull');
return;
}
let index = roomsList.findIndex((rooms) => rooms.r == id); // Get where room is (index)
if (index === -1) {
// Room isn't in list
client.emit('reset');
return;
}
if (roomsList[index].status === 'full' || roomsList[index].status === 'half') {
// If non-joinable room
client.emit('roomIsFull');
return;
}
// Join room
client.join('room-' + id);
console.log('>>', client.nickname, ' joined room-' + id);
client.inroom = id;
roomsList[index].status = 'full'; // Room is full (2 players inside)
playerNo = 1;
// Send infos to clients
roomInfo = { n: id, player: playerNo, nick: client.nickname };
client.emit('roomInfo', roomInfo);
console.log('Rooms: ', roomsList);
client.broadcast.emit('roomList', roomsList);
}
// exit
function exit(client) {
client.in('room-' + client.inroom).emit('tableWin');
remove(client.inroom);
client.leave('room-' + client.inroom);
client.broadcast.emit('clientDisconnected', roomsList);
client.broadcast.emit('roomList', roomsList);
}
// removeRoom
function remove(socketInRoom) {
let index = roomsList.findIndex((rooms) => rooms.r == socketInRoom);
if (index === -1) return;
if (roomsList[index].status !== 'half')
roomsList[index].status = 'half'; // Check if there is a player in the room
else roomsList.splice(index, 1);
setTimeout(clearHalf, 60000); // Clear half rooms after 60 secs
}
// clear half rooms
function clearHalf() {
roomsList.forEach((obj) => {
if (obj.status === 'half') roomsList.splice(roomsList[roomsList.indexOf(obj)], 1);
});
}
// Socket Connection
web_socket.on('connection', (client) => {
var socket = client;
console.log('New connection: ' + socket.id);
socket.broadcast.emit('roomList', roomsList);
// login handler
socket.on('login', (nickname) => {
socket.nickname = nickname;
console.log('>>', socket.nickname, ' connected');
socket.broadcast.emit('roomList', roomsList);
// createRoom handler
socket.on('createRoom', () => {
console.log('>>', socket.nickname, ' trying to create room');
createRoom(socket);
});
// joinRoom handler
socket.on('joinRoom', (id) => {
console.log('>>', socket.nickname, ' trying to join room ', id);
joinRoom(socket, id);
});
// updateGrid handler sendig to other socket data
socket.on('updateGrid', (data) => {
console.log('\t\tReceived data from player-' + data.player + ' in room-' + data.room);
socket.broadcast.in('room-' + data.room).emit('updateGrid', data); // Sending received data to other socket in room
});
// winner handler
socket.on('winner', (winner) => {
winner
? console.log('\t\tMatch ended and player ' + winner + ' won!')
: console.log('\t\tMatch ended in draw!');
});
// exit handler
socket.on('exit', () => {
console.log('>>', socket.nickname, ' out from room-' + socket.inroom);
exit(socket);
});
// disconnect handler
socket.on('disconnect', () => {
console.log('>>', socket.nickname, ' disconnected');
exit(socket);
});
});
});
web_server.listen(port);
console.log('Server listening on port ' + port);