-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
303 lines (287 loc) · 13.4 KB
/
server.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
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
//imported node libraries
//server.js
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var Game = require("./g.js");
var shufflecards = require("./cards.js");
//holds all the games
var games = [];
//holds all the users
var userList = [];
/*//redirect to test webpage
app.get('/', function (req, res) {
res.sendFile(__dirname + '/deckSnapTest.html');
});*/
//redirect to folder: public
app.use(express.static(__dirname + '/public'));
//redirect / to our index.html file
app.get('/', function (req, res, next) {
res.sendFile(__dirname + '/public/index.html');
});
//room counter for rooms
var roomno = 1;
/*//////////////////////////////////////////////////////////////////////////////////////
this is if a user connects to the app
/////////////////////////////////////////////////////////////////////////////////////////*/
//when a client connects, do this
io.on('connection', function (client) {
// console.log('Client connected...'); --testing
//when a user logs in the will sent this messahe and a wait a call back
//this fuction will not allow a client to be assigned a username already in user on the server
client.on("connectPlayer", function (clientNickname, callback) {
//test message
var message = "User " + clientNickname + " was connected.";
console.log(message);
//holds the user info
var userInfo = {};
//will be used to see if the user has used the app before
var foundUser = false;
var sendusers = true;
//for loop searching all the users in the system
for (var i = 0; i < userList.length; i++) {
//if the user is found
if (userList[i]["nickname"] == clientNickname) {
//the user cant be currently playing and this should already be false
//userInfo["isPlaying"] = false;
//sets the user to connected -- used to check if friends are online
if (userList[i]["isConnected"] == true) {
//this tells the user this nickname is already in use
callback(false);
sendusers = false;
foundUser = true;
break;
}
else {
userList[i]["isConnected"] = true;
//updates the users id to the one assigned by socket io
userList[i]["id"] = client.id;
//replaces the user in the users array with the new user settings
userInfo = userList[i];
//sets the user to found
}
foundUser = true;
//end the loop as the user is updated and not a new user
break;
}
} //close for loop
//if the user is a new user and has never used the system before
if (!foundUser) {
//stores the id allocaed by socket io
userInfo["id"] = client.id;
//stores the users nickname --
//the nickname will be the users
userInfo["nickname"] = clientNickname;
//the user cant be currently playing
//userInfo["isPlaying"] = false;
//the user is set to connected
userInfo["isConnected"] = true;
//the new user is added to the user list
userList.push(userInfo);
}
//sends an updated list of users to all users
if (sendusers) {
io.emit("userList", userList);
}
callback(true);
//advsies the what has been connected
// io.emit("userConnectUpdate", userInfo);
});
//
//when a user challenges a player to a game
//
client.on('challange', function (player1, player2) {
//loops trough all users
console.log("incoming challange" + player1 + player2);
//creates the room
var room;
//loops through all the users to find the palyer
for (var i = 0; i < userList.length; i++) {
//find the player the challange is issued to
if (userList[i]["nickname"] == player2) {
//checkes if they are connected
if (userList[i]["isConnected"] == true) {
//advises the user of the challange details
room = "challenge--" + roomno;
//increaments for the next challange
roomno += 1;
client.join(room);
console.log(room);
client.broadcast.to(userList[i]["id"]).emit('incomingchallange', player1, room);
} //if the user is not logged in
else {
//advises challanger the user is offline
client.broadcast.to(client.id).emit('notavailable', player2);
}
//ends loop
break;
}
} //close for
});
/*//////////////////////////////////////////////////////////////////////////////////////
this is if a user accepts a challage informs the challanger
and starts the game
/////////////////////////////////////////////////////////////////////////////////////////*/
client.on('acceptchallenge', function (player1, player2, room) {
// var cards = new shufflecards();
console.log("accepted");
console.log("accepted p1" + player1);
console.log("accepted p2" + player2);
console.log("accepted room " + room);
//loops through all users
for (var i = 0; i < userList.length; i++) {
//finds user 1 and ensures they ase still connected
if (userList[i]["nickname"] == player1 && userList[i]["isConnected"] === true) {
//sends the load game msg
io.to(userList[i]["id"]).emit("loadgame", room);
//adds the challanger to the room
//sends protocl msg
//create a new game from this room adding the player cat, and assigning it the same same as the room, so it is easy to reference both
var newgame = new Game(room, player1, player2);
//console.log(userid);
//puts to the end of the games array
games.push(newgame);
//the room is created here if it hasnt already been created
client.join(room);
//advise the players game is loading
io.sockets.in(room).emit('connectToRoom', "game loading" + room);
//advises the players the room and game name **NB they are the same
io.sockets.in(room).emit('roomname', room);
if (newgame.shufflecards()) {
console.log("cards got");
//advises the users the game details to trigger the game on each client device
io.sockets.in(room).emit("gameloaded", newgame.name, newgame.playerTurn, newgame.playerCurrentCard(player1), newgame.playerCurrentCard(player2), newgame.player1);
}
}
}
});
/////////////////////////////////////////////////////////////////////////////////////////*/
client.on('delinechallenge', function (player1, player2, room) {
//loops through all users
console.log("declined challange");
for (var i = 0; i < userList.length; i++) {
//locates the user who issuesed the challange
if (userList[i]["nickname"] == player1) {
//if that user is still connected
if (userList[i]["isConnected"] == true) {
console.log("declined challange p1 found");
//inform them the challange has been declined
client.broadcast.to(userList[i]["id"]).emit('delinedby', player2, room);
}
//breaks loop
break;
}
} //end for
});
///////////////////////////////////////////
client.on('closeroom', function (room) {
client.leave(room);
});
/*//////////////////////////////////////////////////////////////////////////////////////
this is if a user player makes a move
/////////////////////////////////////////////////////////////////////////////////////////*/
client.on('playermove', function (move, playerId, roomId) {
//ensure the move is valid
if (move != "cat1" && move != "cat2" && move != "cat3" && move != "cat4" && move != "cat5" && move != "cat6") {
console.log("type" + typeof (move));
console.log("move2 " + move);
return;
}
console.log(move + playerId + roomId)
//loops througn all the games
for (var i = games.length - 1; i >= 0; i--) {
console.log("loop run");
//when the game is found
if (games[i].name === roomId) {
//if the ame is still in play
if (games[i].inProgress()) {
//compares the cards and returns the winner
if (games[i].returnPlayerTurn() === playerId) {
//returns a message with the winner
io.sockets.in(roomId).emit('handWonBy', games[i].compare(move));
//io.sockets.in(roomId).emit(games[i].player1, "parseInt(games[i].player1Cards.length)");
}
else {
return;
}
//checks is the game over
if (games[i] == "undefined") {
var id;
if (games[i].player1 == playerId) {
id = games[i].player1;
}
else {
id = games[i].player2;
}
io.sockets.in(games[i].name).emit('disco', id);
return
}
var checkStatus = games[i].inProgress();
//if the game is over--one user has no cards left
if (games[i].inProgress() !== true) {
//tell the players who won
// io.emit('winnerid', checkStatus);
//advises the winner
io.sockets.in(roomId).emit('winnerid', checkStatus);
console.log('winner id : ' + checkStatus);
//deletes the game from the games array as its over
games.splice(i, 1);
///////the game object can be destroyed now
//endGame(roomId);
} //updates the users with their next card and the users turn
else {
//advises both playes the relsts of the hand, and the cards for each users next hand
io.sockets.in(roomId).emit('result', move, parseInt(games[i].player1Cards.length), parseInt(games[i].player2Cards.length), games[i].returnPlayerTurn(), games[i].playerCurrentCard(games[i].player1), games[i].playerCurrentCard(games[i].player2), games[i].handwinner, move);
}
} //close if
break;
} //close if
} //clsoe for
});
client.on('disconnect', function () {
//Useful to know when someone disconnects
//console.log('\t socket.io:: client disconnected ' + client.id);
console.log('user disconnected');
//gets the clients nickname
var clientNickname;
//;opps through all the users
for (var i = 0; i < userList.length; i++) {
//finds the ser
if (userList[i]["id"] == client.id) {
console.log("found" + userList[i]["isConnected"]);
userList[i]["isConnected"] = false;
console.log("change" + userList[i]["isConnected"]);
//loops through all the active games
for (var x = games.length - 1; x >= 0; x--) {
//if the player is in this game and p1
if (games[x].player1 == userList[i]["nickname"]) {
io.sockets.in(games[x]).emit('winnerid', games[x].player2);
//removes and distoryes the game
games.splice(x, 1);
} //if the player is in this game and p2
else if (games[x].player2 == userList[i]["nickname"]) {
console.log('user 2');
//advises the other player f the disco
io.sockets.in(games[x]).emit('winnerid', games[x].player1);
//removes and distoryes the game
games.splice(x, 1);
}
//sets the user to not connected
}
//ends the loop
//seds an updated list of users to all users
io.emit("userList", userList);
break;
}
}
}); //client.on disconnect
});
/*//////////////////////////////////////////////////////////////////////////////////////
This is part of the socket io library to listen for connections on port
3000
/////////////////////////////////////////////////////////////////////////////////////////*/
//start our web server and socket.io server listening
server.listen(3000, function () {
console.log('listening on *:3000');
});