const WebSocket = require("ws").Server;
const HttpsServer = require('https').createServer;
const fs = require("fs");
var keys = [];
var clients = [];
var user = [];
var timenow = Date.now();
function heartbeat() {
this.isAlive = true;
}
keys["oxi-jon.pl"] = "samba";
server = HttpsServer({
cert: fs.readFileSync('/etc/letsencrypt/live/websocket.oxi-jon.pl/cert.pem'),
key: fs.readFileSync('/etc/letsencrypt/live/websocket.oxi-jon.pl/privkey.pem')
})
socket = new WebSocket({
server: server
});
socket.on('connection', function connection(ws, req) {
var userID = req.url.substr(1);
clients.push({
id: userID,
wsoc: ws,
isAlive: true,
});
if (userID in user) {
return true;
} else {
user[userID] = []
}
user[userID]["ws"] = ws;
/*clients[userID] = [];
clients[userID]["ws"] = ws;
console.log('Połączono: ' + userID + ' in ' + Object.getOwnPropertyNames(clients));*/
console.log(`[+] ${req.socket.remoteAddress} Connected`);
socket.clients.forEach(function each(client) {
if (client.readyState === WebSocket.OPEN) {
message = {
type: "alert",
msg: `${queryData.id} has Connected.`,
};
console.log("Connected`");
client.send(JSON.stringify(message), { binary: false });
}
});
ws.on("message", function incoming(message) {
console.log(`[!] Message Receieved from ${req.socket.remoteAddress}`);
msg = JSON.parse(message);
if ("action" in msg) {
if (msg["action"] == "start") {
console.log("action")
if ("page" in user[userID]) {
if (user[userID]["page"] != msg["page"]) {
savePage(user[userID]["page"]);
user[userID]["page"] = msg["page"];
user[userID][user[userID]["page"]] = 0;
user[userID]["pos"] = 0;
changewsoc(user[userID]["ws"]);
} else {
return true;
}
} else {
console.log("nie ma page");
user[userID]["page"] = msg["page"];
user[userID][user[userID]["page"]] = 0;
user[userID]["pos"] = 0;
changewsoc(user[userID]["ws"]);
}
} else {
// continue
if ("pos" in user[userID]) {
console.log("pos");
if (user[userID]["pos"] != msg["pos"]) {
user[userID]["pos"] = msg["pos"];
user[userID][user[userID]["page"]] += 5;
console.log("obywatel na stronie przez "+user[userID][user[userID]["page"]]+" sekund");
} else {
console.log("obywatel AFK");
}
}
}
}
msg = { ...msg, time: new Date().toISOString() };
socket.clients.forEach(function each(client) {
if (client.readyState === WebSocket.OPEN) {
client.send(JSON.stringify(msg), { binary: false });
}
});
});
ws.isAlive = true;
ws.on('pong', heartbeat);
});
/*
socket.addListener("customClose", function (m) {
socket.clients.forEach(function each(client) {
if (client.readyState === WebSocket.OPEN) {
message = {
type: "alert",
msg: `${m} has Disconnected.`,
};
client.send(JSON.stringify(message), { binary: false });
}
});
});*/
function getData(ws) {
// console.log("checking time!");
var message = {
"get": "data"
};
ws.send(JSON.stringify(message));
console.log("Message was sent");
}
function changewsoc(ws) {
clients.forEach((clnt, index) => {
clnt.wsoc = ws;
});
}
function savePage(page, time, domain) {
console.log(key[domain]);
}
const interval = setInterval(function ping() {
socket.clients.forEach(function each(ws) {
if (ws.isAlive === false) {
//console.log(ws);
//savePage(user[ws.id], time, domain)
return ws.terminate();
} else {
getData(ws)
}
//console.log(ws);
ws.isAlive = false;
ws.ping();
});
}, 5000);
server.listen(1111);