-
Notifications
You must be signed in to change notification settings - Fork 26
Expand file tree
/
Copy pathepsile-server.js
More file actions
executable file
·146 lines (124 loc) · 3.83 KB
/
epsile-server.js
File metadata and controls
executable file
·146 lines (124 loc) · 3.83 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
#!/usr/bin/env node
// epsile server
// created by djazz
'use strict';
// config
var port = 8001;
// load and initialize modules
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io').listen(server);
server.listen(port, function () {
console.log('epsile server listening at port %d', port);
});
app.use(express.compress());
app.use(express.static(__dirname + '/'));
io.set('log level', 1);
// global variables, keeps the state of the app
var sockets = {},
users = {},
strangerQueue = false,
peopleActive = 0,
peopleTotal = 0;
// helper functions, for logging
function fillZero (val) {
if (val > 9) return ""+val;
return "0"+val;
}
function timestamp () {
var now = new Date();
return "["+fillZero(now.getHours())+":"+fillZero(now.getMinutes())+":"+fillZero(now.getSeconds())+"]";
}
// listen for connections
io.sockets.on('connection', function (socket) {
// store the socket and info about the user
sockets[socket.id] = socket;
users[socket.id] = {
connectedTo: -1,
isTyping: false
};
// connect the user to another if strangerQueue isn't empty
if (strangerQueue !== false) {
users[socket.id].connectedTo = strangerQueue;
users[socket.id].isTyping = false;
users[strangerQueue].connectedTo = socket.id;
users[strangerQueue].isTyping = false;
socket.emit('conn');
sockets[strangerQueue].emit('conn');
strangerQueue = false;
} else {
strangerQueue = socket.id;
}
peopleActive++;
peopleTotal++;
console.log(timestamp(), peopleTotal, "connect");
io.sockets.emit('stats', {people: peopleActive});
socket.on("new", function () {
// Got data from someone
if (strangerQueue !== false) {
users[socket.id].connectedTo = strangerQueue;
users[strangerQueue].connectedTo = socket.id;
users[socket.id].isTyping = false;
users[strangerQueue].isTyping = false;
socket.emit('conn');
sockets[strangerQueue].emit('conn');
strangerQueue = false;
} else {
strangerQueue = socket.id;
}
peopleActive++;
io.sockets.emit('stats', {people: peopleActive});
});
// Conversation ended
socket.on("disconn", function () {
var connTo = users[socket.id].connectedTo;
if (strangerQueue === socket.id || strangerQueue === connTo) {
strangerQueue = false;
}
users[socket.id].connectedTo = -1;
users[socket.id].isTyping = false;
if (sockets[connTo]) {
users[connTo].connectedTo = -1;
users[connTo].isTyping = false;
sockets[connTo].emit("disconn", {who: 2});
}
socket.emit("disconn", {who: 1});
peopleActive -= 2;
io.sockets.emit('stats', {people: peopleActive});
});
socket.on('chat', function (message) {
if (users[socket.id].connectedTo !== -1 && sockets[users[socket.id].connectedTo]) {
sockets[users[socket.id].connectedTo].emit('chat', message);
}
});
socket.on('typing', function (isTyping) {
if (users[socket.id].connectedTo !== -1 && sockets[users[socket.id].connectedTo] && users[socket.id].isTyping !== isTyping) {
users[socket.id].isTyping = isTyping;
sockets[users[socket.id].connectedTo].emit('typing', isTyping);
}
});
socket.on("disconnect", function (err) {
// Someone disconnected, ctoed or was kicked
//console.log(timestamp(), socket.id+" disconnected");
var connTo = (users[socket.id] && users[socket.id].connectedTo);
if (connTo === undefined) {
connTo = -1;
}
if (connTo !== -1 && sockets[connTo]) {
sockets[connTo].emit("disconn", {who: 2, reason: err && err.toString()});
users[connTo].connectedTo = -1;
users[connTo].isTyping = false;
peopleActive -= 2;
}
delete sockets[socket.id];
delete users[socket.id];
if (strangerQueue === socket.id || strangerQueue === connTo) {
strangerQueue = false;
peopleActive--;
}
peopleTotal--;
console.log(timestamp(), peopleTotal, "disconnect");
io.sockets.emit('stats', {people: peopleActive});
});
});