forked from DJJS/ballhalla
-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
106 lines (92 loc) · 3.12 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
require('dotenv').config();
require('@risingstack/trace');
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var port = process.env.PORT || 8081;
app.use(express.static(__dirname + '/public'));
var redis;
if (process.env.REDISTOGO_URL) {
console.log('theres a redis url, here we go');
var rtg = require('url').parse(process.env.REDISTOGO_URL);
redis = require('redis').createClient(rtg.port, rtg.hostname);
redis.auth(rtg.auth.split(':')[1]);
} else {
redis = require('redis').createClient();
}
var scoreboardCallback = function(err, response) {
if (err) {console.error(err);}
};
var players = [];
function Player (id) {
this.id = id;
this.x = 0;
this.y = 0;
this.z = 0;
this.entity = null;
this.lastCollision = null;
}
io.sockets.on('connection', function(socket) {
socket.on('initialize', function(nickName) {
var idNum = players.length;
var newPlayer = new Player (idNum);
newPlayer.nickName = nickName;
players.push(newPlayer);
redis.zadd('scoreboard', 0, '' + idNum + ' ' + nickName);
socket.emit('playerData', {id: idNum, players: players});
socket.broadcast.emit('playerJoined', newPlayer);
var initialCallback = function(err, res) {
if (err) {
console.log(err);
} else {
socket.emit('leaderboardUpdate', res);
socket.broadcast.emit('leaderboardUpdate', res);
}
};
redis.zrevrangebyscore('scoreboard', '+inf', '-inf', 'WITHSCORES', initialCallback);
});
socket.on('deletePlayer', function(id, lastCollision) {
if (players[lastCollision]) {
redis.zrem('scoreboard', '' + id + ' ' + players[id].nickName);
var playerGettingPoint = '' + lastCollision + ' ' + players[lastCollision].nickName;
if (players[lastCollision] !== 'dead') {
redis.zincrby('scoreboard', 1, playerGettingPoint);
}
players[id] = 'dead';
var leaderboardCallback = function (err, res) {
if (err) {
console.log(err);
} else {
socket.broadcast.emit('leaderboardUpdate', res);
}
};
redis.zrevrangebyscore('scoreboard', '+inf', '-inf', 'WITHSCORES', leaderboardCallback);
}
});
socket.on('positionUpdate', function(data) { //-----------------------------
if (players[data.id] && players[data.id] !== 'dead') {
var dataKeys = Object.keys(data);
dataKeys.map(function(curKey) {
if (curKey !== 'id') {
players[data.id][curKey] = data[curKey];
}
});
socket.broadcast.emit('playerMoved', data);
}
});
// currently this emites 1 point which everyone takes per second
// even though it sends an id, the clients currently always take the
// point, even if it's not 'theirs' so that it mimics time-based scoring
var randPlayerId;
setInterval(function() {
randPlayerId = 0;
//console.log('emitting point', randPlayerId);
socket.emit('pointScored', randPlayerId);
}, 1000);
});
console.log('server running on port ', port);
server.listen(port);
exports.players = players;
exports.Player = Player;
exports.app = app;