mirror of
				https://github.com/KevinMidboe/zoff.git
				synced 2025-10-29 18:00:23 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			403 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			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;
 |