Files
zoff/server/handlers/dbFunctions/advancedFunctions/chat.js
Kasper Rynning-Tønnesen cb712d9555 More intermediary work
2019-10-08 15:52:55 +02:00

403 lines
12 KiB
JavaScript

var path = require("path");
var mongojs = require("mongojs");
var db = require(pathThumbnails + "/handlers/db.js");
var find = require(pathThumbnails + "/handlers/dbFunctions/find.js");
var update = require(pathThumbnails + "/handlers/dbFunctions/update.js");
var findAndModify = require(pathThumbnails +
"/handlers/dbFunctions/findAndModify.js");
var Helpers = require(pathThumbnails + "/handlers/helpers.js");
var SessionHandler = require(pathThumbnails +
"/handlers/dbFunctions/advancedFunctions/sessionHandler.js");
async function checkIfChatEnabled(channel, socket, callback) {
return new Promise(async (resolve, reject) => {
if (channel == "" || channel == undefined) resolve();
else {
var docs = await find(channel + "_settings");
if (
docs.length > 0 &&
(docs[0].hasOwnProperty("toggleChat") && !docs[0].toggleChat)
) {
socket.emit("chat", {
from: "System",
msg: ": Chat for this channel has been disabled.",
icon: "https://zoff.me/assets/images/favicon-32x32.png"
});
resolve(false);
} else {
resolve(true);
}
}
});
}
async function checkIfUserIsBanned(channel, socket, guid) {
return new Promise(async (resolve, reject) => {
var connection_id = Helpers.hash_pass(
socket.handshake.headers["user-agent"] +
socket.handshake.address +
socket.handshake.headers["accept-language"]
);
var docs = await find(channel + "_banned_chat", {
$or: [{ connection_id: connection_id }, { connection_id: guid }]
});
if (docs.length == 0) resolve();
else {
var d = await findAndModify("user_names", {
query: { guid, guid },
update: { $addToSet: { channels: channel } }
});
socket.emit("chat", {
from: "System",
msg:
": You can't chat in this channel, you are banned. The reason is: " +
docs[0].reason,
icon: "https://zoff.me/assets/images/favicon-32x32.png"
});
reject();
}
});
}
async function namechange(data, guid, socket, tried) {
return new Promise(async (resolve, reject) => {
var enabled = await checkIfChatEnabled(data.channel, socket);
if (!enabled) {
resolve(false);
return;
}
try {
await checkIfUserIsBanned(data.channel, socket, guid);
} catch (e) {
return;
}
var pw = "";
var new_password;
var first = false;
var sessionObject = await SessionHandler.getSessionChatPass(
Helpers.getSession(socket)
);
var name = sessionObject.name;
var pass = sessionObject.pass;
var fetched = false;
if (data.hasOwnProperty("first") && data.first) {
pw = pass;
name = name;
data.name = name;
data.password = pass;
new_password = false;
if (name == "" || pass == "") {
resolve(true);
return;
}
fetched = true;
password = pw;
} else {
var name = data.name;
if (data.hasOwnProperty("first")) {
first = data.first;
}
if (data.hasOwnProperty("password")) {
pw = data.password;
new_password = false;
} else if (
data.hasOwnProperty("new_password") &&
data.hasOwnProperty("old_password")
) {
pw = data.old_password;
new_password = Helpers.decrypt_string(data.new_password);
}
password = Helpers.decrypt_string(pw);
password = Helpers.hash_pass(password);
doubled = true;
}
if (name == "") {
resolve(true);
return;
}
var docs = await find("registered_users", { _id: name.toLowerCase() });
var accepted_password = false;
var icon = false;
if (docs.length == 0) {
if (new_password) {
resolve(true);
return;
}
accepted_password = true;
await SessionHandler.setSessionChatPass(
Functions.getSession(socket),
name.toLowerCase(),
data.password
);
update(
"registered_users",
{ _id: name.toLowerCase() },
{ $set: { password: password } },
{ upsert: true }
);
} else if (docs[0].password == password) {
if (docs[0].icon) {
icon = docs[0].icon;
}
accepted_password = true;
if (new_password) {
await SessionHandler.setSessionChatPass(
Helpers.getSession(socket),
name.toLowerCase(),
data.new_password
);
update(
"registered_users",
{ _id: name.toLowerCase(), password: password },
{
$set: { password: Helpers.hash_pass(new_password) }
}
);
} else {
await SessionHandler.setSessionChatPass(
Helpers.getSession(socket),
name.toLowerCase(),
fetched
? data.password
: Helpers.hash_pass(Helpers.decrypt_string(data.password))
);
}
}
if (accepted_password) {
var names = await find("user_names", { guid: guid });
if (
names.length > 0 ||
(docs.length != 0 && docs[0].password == password)
) {
var no_name = false;
if (names.length == 0) no_name = true;
if (!no_name) {
var old_name = names[0].name;
update(
"user_names",
{ _id: "all_names" },
{ $pull: { names: old_name } }
);
}
var connection_id = Helpers.hash_pass(
socket.handshake.headers["user-agent"] +
socket.handshake.address +
socket.handshake.headers["accept-language"]
);
var updateElement = {
$set: {
name: name,
icon: icon,
connection_id: connection_id
}
};
if (data.hasOwnProperty("channel") && data.channel != "") {
updateElement["$addToSet"] = { channels: data.channel };
}
await update("user_names", { guid: guid }, updateElement, {
upsert: true
});
await update(
"user_names",
{ _id: "all_names" },
{ $addToSet: { names: name } }
);
//socket.emit('name', {type: "name", accepted: true});
if (old_name != name && !first && !no_name) {
if (
data.hasOwnProperty("channel") &&
typeof data.channel == "string"
) {
io.to(data.channel).emit("chat", {
from: old_name,
msg: " changed name to " + name
});
io.sockets.emit("chat.all", {
from: old_name,
msg: " changed name to " + name,
channel: data.channel
});
}
}
resolve(true);
} else {
if (tried < 3 || tried == undefined) {
if (tried == undefined) {
tried = 1;
}
namechange(data, guid, socket, tried + 1);
}
}
} else {
await SessionHandler.removeSessionChatPass(Functions.Helpers(socket));
socket.emit("name", { type: "name", accepted: false });
}
});
}
async function get_name(guid, announce_payload, first) {
return new Promise(async (resolve, reject) => {
if (
!announce_payload.announce &&
announce_payload.hasOwnProperty("socket")
) {
var sessionObject = await SessionHandler.getSessionChatPass(
Helpers.getSession(announce_payload.socket)
);
var name = sessionObject.name;
var pass = sessionObject.pass;
if (name == "" || pass == "") {
get_name_generate(
guid,
announce_payload,
first,
announce_payload.channel
);
return;
}
var docs = find("registered_users", { _id: name.toLowerCase() });
if (docs[0].password == Helpers.hash_pass(Helpers.decrypt_string(pass))) {
var icon = false;
if (docs[0].icon) {
icon = docs[0].icon;
}
SessionHandler.setSessionChatPass(
Functions.getSession(announce_payload.socket),
name.toLowerCase(),
pass
);
var connection_id = Helpers.hash_pass(
announce_payload.socket.handshake.headers["user-agent"] +
announce_payload.socket.handshake.address +
announce_payload.socket.handshake.headers["accept-language"]
);
var updateElement = {
$set: { name: name, icon: icon, connection_id: connection_id }
};
if (
announce_payload.hasOwnProperty("channel") &&
announce_payload.channel != ""
)
updateElement["$addToSet"] = {
channel: announce_payload.channel
};
await update("user_names", { guid: guid }, updateElement, {
upsert: true
});
await update(
"user_names",
{ _id: "all_names" },
{ $addToSet: { names: name } }
);
name = name;
resolve();
}
} else {
get_name_generate(
guid,
announce_payload,
first,
announce_payload.channel
);
resolve();
}
});
}
async function get_name_generate(guid, announce_payload, first, channel) {
return new Promise(async (resolve, reject) => {
var docs = await find("user_names", { guid: guid });
if (docs.length == 0) {
generate_name(guid, announce_payload, undefined);
} else {
name = docs[0].name;
}
});
}
async function generate_name(guid, announce_payload, second, round, channel) {
if (round == undefined) round = 0;
var tmp_name = Helpers.rndName(second ? second : guid, Math.floor(8 + round));
var docs = await find("registered_users", { _id: tmp_name });
if (docs.length == 0) {
var updated = await update(
"user_names",
{ _id: "all_names" },
{ $addToSet: { names: tmp_name } },
{ upsert: true }
);
if (
updated.nModified == 1 ||
(updated.hasOwnProperty("upserted") &&
updated.hasOwnProperty("n") &&
updated.n == 1)
) {
var connection_id = Helpers.hash_pass(
announce_payload.socket.handshake.headers["user-agent"] +
announce_payload.socket.handshake.address +
announce_payload.socket.handshake.headers["accept-language"]
);
var updateElement = {
$set: {
name: tmp_name,
icon: false,
connection_id: connection_id
}
};
if (channel != undefined && channel != "") {
updateElement["$addToSet"] = { channels: channel };
}
if (
announce_payload.hasOwnProperty("channel") &&
announce_payload.channel != ""
) {
updateElement["$addToSet"] = {
channels: announce_payload.channel
};
}
var updateElement = await update(
"user_names",
{ guid: guid },
updateElement,
{ upsert: true }
);
name = tmp_name;
if (announce_payload.announce) {
io.to(announce_payload.channel).emit("chat", {
from: announce_payload.old_name,
msg: " changed name to " + name
});
io.sockets.emit("chat.all", {
from: announce_payload.old_name,
msg: " changed name to " + name,
channel: announce_payload.channel
});
} else if (announce_payload.message && !announce_payload.all) {
io.to(announce_payload.channel).emit("chat", {
from: name,
msg: ": " + announce_payload.message
});
} else if (announce_payload.message && announce_payload.all) {
io.sockets.emit("chat.all", {
from: name,
msg: ": " + announce_payload.message,
channel: announce_payload.channel
});
}
} else {
generate_name(guid, announce_payload, tmp_name, round + 0.25, channel);
}
} else {
generate_name(guid, announce_payload, tmp_name, round + 0.25, channel);
}
}
module.exports.get_name = get_name;
module.exports.checkIfChatEnabled = checkIfChatEnabled;
module.exports.checkIfUserIsBanned = checkIfUserIsBanned;
module.exports.namechange = namechange;
module.exports.get_name_generate = get_name_generate;