-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
185 lines (134 loc) · 4.49 KB
/
index.js
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
//include gameSettings.js
const gameSettings = require(__dirname + '/gameSettings.js');
//SETUP
///////////////////////////////////////////////////
// load express package
const express = require('express');
//create express app
const app = express();
//compress files
app.use(require('compression')());
// minify files (dont use minification during testing)
// app.use(require('express-minify')());
//serve http over app
const serv = require('http').Server(app);
// connect socket.io to server
const io = require('socket.io')(serv);
//Database Library for high scores
const Database = require(__dirname + '/js/Database.js');
//create db if it doesn't exist already
Database.createDB();
// HTTP SERVER
///////////////////////////////////////////////////
//Start Server
serv.listen(process.env.PORT || 8000, () => {
console.log(`Server Listening on port ${process.env.PORT || 8000}`);
}); // specified port or 8k as backup
//route main page to index.html
app.get('/', (req, res) => {
res.sendFile(__dirname + '/client/index.html');
});
//Serve client files
app.use('/client',express.static(__dirname + '/client'));
//Serve gameSettings.js file
app.get('/gameSettings.js', (req, res) => {
res.sendFile(__dirname + '/gameSettings.js');
});
//send list of high scores
app.get('/highscores', (req, res) => {
Database.getTopScores(gameSettings.highScoreCount, (scores) => {
res.send(scores);
});
});
console.log("SERVER BOOTED SUCCESSFULLY");
// GAME ROOMS
///////////////////////////////////////////////////
//include Room constructor from Room.js
const Room = require(__dirname + '/js/Room.js');
//object to hold individual game rooms
var rooms = {};
//generates new, currently-unused roomId
function generateRoomId(rooms) {
var roomId;
do{
roomId = Math.floor(Math.random()*9999)+1;
}
while (roomId.toString() in rooms);
return roomId.toString();
}
//logs current rooms and their populations
function showRooms (rooms) {
console.log('\n');
if (Object.keys(rooms).length > 0) {
console.log("ROOM STATUS ######################");
for (let roomId in rooms) {
console.log(
`Game Room ${roomId}: ${rooms[roomId].playerCount()} Players`
);
}
console.log("##################################");
}
else {
console.log("ROOM STATUS: No Rooms Active");
}
console.log('\n');
}
// HANDLE NEW SOCKETS
///////////////////////////////////////////////////
io.sockets.on('connection', function (socket) {
//handle disconnects
socket.once('disconnect', function () {
//remove from room if in one
if ('roomId' in socket) {
rooms[socket.roomId].removePlayer(socket);
//delete room if empty
if (rooms[socket.roomId].isEmpty()) {
//properly shut down room
rooms[socket.roomId].shutDown();
delete rooms[socket.roomId];
}
//show current room status
showRooms(rooms);
}
});
//set up ping listener
socket.on ('pinging', function () {
socket.emit('ponging');
});
// JOIN ROOM
////////////////////////////////
//connect socket to room
socket.once ('join_game', function (roomId, name) {
//set name of socket
let nameTrimmed = name.trim().substring(0, gameSettings.nameMax);
//reject socket if room does not exist
if (!(roomId in rooms) && roomId != 'new_game') {
socket.emit('rejection', 'Game Does Not Exist');
}
//reject socket if room full
else if (roomId in rooms && rooms[roomId].isFull()) {
socket.emit('rejection', 'Game Full');
}
//create new room on request
else if (roomId == 'new_game') {
//generate new room id
let newRoomId = generateRoomId(rooms);
//create room object
rooms[newRoomId] = new Room(newRoomId, io);
//place socket into room
rooms[newRoomId].addPlayer(socket, nameTrimmed);
//show current room status
showRooms(rooms);
}
//add to room if room exists and has space
else if (roomId in rooms) {
rooms[roomId].addPlayer(socket, nameTrimmed);
//show current room status
showRooms(rooms);
}
//reject if any other situation
else {
socket.emit('rejection', 'Reason Unknown');
}
});
});