var express = require("express");
var app = express();
var server = require("http").createServer(app);
var io = require("socket.io")(server);
var port = process.env.PORT || 3000;
const fs = require("fs");
server.listen(port, () => console.log("Server listening at port %d", port));
app.use(express.static("public"));
var users = [
{
id: 0,
username: "JavaScript",
password: "this-is-not-my-password",
avatar: "www.site.com/avatar.png",
state: "on"
}
];
function getRandomIntInclusive(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1) + min);
}
var current = 0;
var typing = [];
var active = [];
var app = { buildID: 0 };
function getUser(socket) {
for (var i = 0; i < active.length; i++) {
if (active[i].socket.id == socket.id) {
return active[i].user;
}
}
return null;
}
function getUsers() {
var users = [];
for (var i = 0; i < active.length; i++) {
users.push(active[i].user);
}
return users;
}
function activateUser(socket, user) {
if (doesUserExists(user.id)) return;
active.push({
socket: socket,
user: {
username: user.username,
avatar: user.avatar,
state: user.state
}
});
}
function doesUserExists(id) {
for (var i = 0; i < active.length; i++) {
if (active[i].user.id == id) { return true; }
}
return false;
}
var asyncStringify = (value) => { return new Promise((resolve, reject) => resolve(JSON.stringify(value))); }
var asyncParse = (value) => { return new Promise((resolve, reject) => resolve(JSON.parse(value))); }
var asyncWrite = (value) => {
return new Promise((resolve, reject) => {
asyncStringify(value).then((newValue) => {
fs.writeFile("database.json", newValue, "utf8", () => resolve());
});
});
}
var asyncRead = () => {
return new Promise((resolve, reject) => {
fs.readFile("database.json", "utf8", (errors, contents) => {
asyncParse(contents).then((newValue) => {
resolve(newValue);
});
});
});
}
asyncWrite(users);
io.on("connection", (socket) => {
current++;
io.sockets.emit("status-viewers", current);
socket.on("server-message", (data) => {
if (data.content.length >= 2000) { socket.emit("alert", "Too much work!"); return; }
data.id = getRandomIntInclusive(1, 100000000000);
io.sockets.emit("client-message", data);
});
socket.on("server-message-delete", (data) => {
io.sockets.emit("client-message-delete", data);
});
socket.on("server-message-edit", (data) => {
io.sockets.emit("client-message-edit", data);
});
socket.on("server-login", (data) => {
for (var i = 0; i < users.length; i++) {
if (users[i].id == data.id) {
socket.emit("client-login", users[i]);
activateUser(socket, users[i]);
io.sockets.emit("status-active", getUsers());
return;
}
}
socket.emit("client-login", null);
});
socket.on("server-typing", (data) => {
try {
if (!data) return;
if (data.typing && data.user) {
var duplicated = false;
for (var i = 0; i < typing.length; i++) {
if (
typing[i].hasOwnProperty("id") &&
data.user.hasOwnProperty("id")
) {
if (typing[i].id == data.user.id) {
duplicated = true;
}
}
}
if (!duplicated) {
typing.push(data.user);
}
} else {
for (var i = 0; i < typing.length; i++) {
if (typing[i] && data.user) {
if (typing[i].id == data.user.id) {
typing.splice(i, 1);
break;
}
}
}
}
io.sockets.emit("client-typing", typing);
} catch (e) { console.log(e); }
});
socket.on("update-state", (data) => {
try {
if (!data.user) return;
fs.readFile("database.json", "utf8", (errors, contents) => {
asyncParse(contents).then((accounts) => {
for (var i = 0; i < accounts.length; i++) {
if (accounts[i].id == data.user.id) {
accounts[i].state = data.user.state;
asyncStringify(accounts).then((value) => {
fs.writeFile("database.json", value, "utf8", () => io.sockets.emit("status-active", accounts));
});
break;
}
}
});
});
} catch (e) { console.log(e); }
});
socket.on("account-change-avatar", (data) => {
try {
fs.readFile("database.json", "utf8", (errors, contents) => {
asyncParse(contents).then((accounts) => {
for (var i = 0; i < accounts.length; i++) {
if (accounts[i].id == data.id) {
accounts[i].avatar = data.url;
asyncStringify(accounts).then((value) => {
fs.writeFile("database.json", value, "utf8", () => socket.emit("account-refresh", data.url));
});
}
}
});
});
} catch (e) { console.log(e); }
});
socket.on("disconnect", () => {
current--;
io.sockets.emit("status-viewers", current);
for (var i = 0; i < active.length; i++) {
if (active[i].socket.id == socket.id) {
active.splice(i, 1);
break;
}
}
io.sockets.emit("status-active", getUsers());
});
});
setInterval(() => { io.sockets.emit("update-check", app); }, 1000);
The code is bit of a mess, because I kept trying to change the code and implement new ways to save and read database without breaking it.
Do you see where or what may be causing the error?
and yes I used this not recommended method to quickly suppress the errors: