mirror of
https://github.com/KevinMidboe/zoff.git
synced 2025-10-29 18:00:23 +00:00
824 lines
20 KiB
JavaScript
824 lines
20 KiB
JavaScript
import {
|
|
handlersPath
|
|
} from "../settings/globals";
|
|
|
|
let path = require("path");
|
|
try {
|
|
var mongo_config = require(path.join(
|
|
path.join(__dirname, "../config/"),
|
|
"mongo_config.js"
|
|
));
|
|
} catch (e) {
|
|
console.log(
|
|
"(!) Missing file - /config/mongo_config.js. Have a look at /config/mongo_config.example.js. The server won't run without this existing."
|
|
);
|
|
process.exit(1);
|
|
}
|
|
let mongojs = require("mongojs");
|
|
let connected_db = mongojs(
|
|
"mongodb://" + mongo_config.host + "/user_credentials"
|
|
);
|
|
let crypto = require("crypto");
|
|
let db = require(handlersPath + "/db.js");
|
|
let uniqid = require("uniqid");
|
|
let Filter = require("bad-words");
|
|
let filter = new Filter({
|
|
placeHolder: "x"
|
|
});
|
|
|
|
let Chat = require(handlersPath + "/chat.js");
|
|
|
|
function encodeChannelName(str) {
|
|
const _fn = encodeURIComponent;
|
|
str = filter.clean(str);
|
|
let toReturn = _fn(str);
|
|
toReturn = toReturn.replace(/_/g, "%5F");
|
|
toReturn = toReturn.replace(/'/g, "%27");
|
|
toReturn = toReturn.replace(/%26amp%3B/g, "%26").replace(/%26amp%3b/g, "%26");
|
|
toReturn = toReturn.toLowerCase();
|
|
return toReturn;
|
|
}
|
|
|
|
function decodeChannelName(str) {
|
|
const _fn = decodeURIComponent;
|
|
str = str.toUpperCase();
|
|
let toReturn = _fn(str.replace(/%5F/g, "_").replace(/%27/g, "'"));
|
|
toReturn = filter.clean(toReturn);
|
|
return toReturn.toLowerCase();
|
|
}
|
|
|
|
function remove_unique_id(short_id) {
|
|
db.collection("unique_ids").update({
|
|
_id: "unique_ids"
|
|
}, {
|
|
$pull: {
|
|
unique_ids: short_id
|
|
}
|
|
},
|
|
function (err, docs) {}
|
|
);
|
|
}
|
|
|
|
function remove_name_from_db(guid, channel) {
|
|
// Use temporary, with caution. Can bottleneck in large quantity of users.
|
|
//
|
|
// Find a way of indexing users in lists in a clever way, to avoid the search here
|
|
db.collection("connected_users").find({
|
|
_id: "total_users"
|
|
}, function (
|
|
err,
|
|
all_users
|
|
) {
|
|
var hasOne = all_users[0].total_users.some(function (v) {
|
|
return v.indexOf(guid) >= 0;
|
|
});
|
|
if (!hasOne) {
|
|
db.collection("user_names").find({
|
|
guid: guid
|
|
}, function (err, user) {
|
|
if (user.length == 1) {
|
|
db.collection("user_names").update({
|
|
_id: "all_names"
|
|
}, {
|
|
$pull: {
|
|
names: user[0].name
|
|
}
|
|
},
|
|
function (err, updated) {
|
|
db.collection("user_names").remove({
|
|
guid: guid
|
|
}, function (
|
|
err,
|
|
removed
|
|
) {});
|
|
}
|
|
);
|
|
}
|
|
});
|
|
} else {
|
|
if (channel == undefined || channel == "") return;
|
|
db.collection("user_names").update({
|
|
guid
|
|
}, {
|
|
$pull: {
|
|
channels: channel
|
|
}
|
|
},
|
|
function (err, docs) {}
|
|
);
|
|
}
|
|
});
|
|
}
|
|
|
|
function isUrl(str) {
|
|
const pattern = new RegExp(
|
|
"\\b(((ht|f)tp(s?)\\:\\/\\/|~\\/|\\/)|www.)" +
|
|
"(\\w+:\\w+@)?(([-\\w]+\\.)+(com|org|net|gov" +
|
|
"|mil|biz|info|mobi|name|aero|jobs|museum" +
|
|
"|travel|[a-z]{2}))(:[\\d]{1,5})?" +
|
|
"(((\\/([-\\w~!$+|.,=]|%[a-f\\d]{2})+)+|\\/)+|\\?|#)?" +
|
|
"((\\?([-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?" +
|
|
"([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)" +
|
|
"(&(?:[-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?" +
|
|
"([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)*)*" +
|
|
"(#([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)?\\b"
|
|
);
|
|
if (!pattern.test(str)) {
|
|
return false;
|
|
} else {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
function getSession(socket) {
|
|
try {
|
|
if (socket.cookie_id == undefined) throw "Undefined error";
|
|
return socket.cookie_id;
|
|
} catch (e) {
|
|
// Returning "sessiong"-based on place of connection
|
|
return hash_pass(
|
|
socket.handshake.headers["user-agent"] +
|
|
socket.handshake.address +
|
|
socket.handshake.headers["accept-language"]
|
|
);
|
|
}
|
|
}
|
|
|
|
function remove_from_array(array, element) {
|
|
if (contains(array, element)) {
|
|
const index = array.indexOf(element);
|
|
if (index != -1) array.splice(index, 1);
|
|
}
|
|
}
|
|
|
|
function generate_channel_name(res) {
|
|
const trying_id = uniqid.time().toLowerCase();
|
|
db.collection("frontpage_lists").find({
|
|
frontpage: {
|
|
$exists: true
|
|
},
|
|
_id: trying_id
|
|
}, {
|
|
_id: 1
|
|
},
|
|
function (err, docs) {
|
|
if (docs.length == 0) {
|
|
res.send(trying_id);
|
|
return;
|
|
}
|
|
generate_channel_name(res);
|
|
}
|
|
);
|
|
}
|
|
|
|
function get_short_id(socket) {
|
|
const new_short_id = uniqid.time().toLowerCase();
|
|
|
|
socket.join(new_short_id);
|
|
socket.emit("id", new_short_id);
|
|
}
|
|
|
|
function check_inlist(coll, guid, socket, offline, callback, double_check) {
|
|
if (coll == undefined) {
|
|
if (typeof callback == "function") callback();
|
|
return;
|
|
}
|
|
if (!offline && coll != undefined) {
|
|
db.collection("connected_users").update({
|
|
_id: coll
|
|
}, {
|
|
$addToSet: {
|
|
users: guid
|
|
}
|
|
}, {
|
|
upsert: true
|
|
},
|
|
function (err, updated) {
|
|
if (updated.nModified > 0 || updated.upserted != undefined) {
|
|
db.collection("connected_users").find({
|
|
_id: coll
|
|
}, function (
|
|
err,
|
|
new_doc
|
|
) {
|
|
db.collection("frontpage_lists").update({
|
|
_id: coll
|
|
}, {
|
|
$set: {
|
|
viewers: new_doc[0].users.length
|
|
}
|
|
},
|
|
function () {
|
|
if (
|
|
new_doc[0].users == undefined ||
|
|
new_doc[0].users.length == undefined
|
|
) {
|
|
io.to(coll).emit("viewers", 1);
|
|
} else {
|
|
io.to(coll).emit("viewers", new_doc[0].users.length);
|
|
}
|
|
Chat.namechange({
|
|
initial: true,
|
|
first: true,
|
|
channel: coll
|
|
},
|
|
guid,
|
|
socket,
|
|
false,
|
|
function (enabled) {
|
|
db.collection("user_names").find({
|
|
guid: guid
|
|
}, function (
|
|
err,
|
|
docs
|
|
) {
|
|
if (docs.length == 1) {
|
|
let icon = "";
|
|
if (docs[0].icon != undefined) icon = docs[0].icon;
|
|
db.collection("user_names").update({
|
|
guid
|
|
}, {
|
|
$addToSet: {
|
|
channels: coll
|
|
}
|
|
},
|
|
function (err, doc) {}
|
|
);
|
|
if (enabled) {
|
|
socket.broadcast.to(coll).emit("chat", {
|
|
from: docs[0].name,
|
|
icon,
|
|
msg: " joined"
|
|
});
|
|
}
|
|
} else if (docs.length == 0) {
|
|
Chat.get_name(guid, {
|
|
announce: false,
|
|
socket,
|
|
channel: coll
|
|
});
|
|
}
|
|
});
|
|
db.collection("connected_users").update({
|
|
_id: "total_users"
|
|
}, {
|
|
$addToSet: {
|
|
total_users: guid + coll
|
|
}
|
|
},
|
|
function (err, docs) {
|
|
if (
|
|
callback != undefined &&
|
|
typeof callback == "function"
|
|
)
|
|
callback();
|
|
}
|
|
);
|
|
}
|
|
);
|
|
}
|
|
);
|
|
});
|
|
} else {
|
|
db.collection("connected_users").find({
|
|
_id: coll
|
|
}, function (
|
|
err,
|
|
new_doc
|
|
) {
|
|
io.to(coll).emit("viewers", new_doc[0].users.length);
|
|
});
|
|
if (callback != undefined && typeof callback == "function")
|
|
callback();
|
|
}
|
|
}
|
|
);
|
|
} else {
|
|
if (offline) {
|
|
db.collection("connected_users").update({
|
|
_id: "offline_users"
|
|
}, {
|
|
$addToSet: {
|
|
users: guid
|
|
}
|
|
},
|
|
function (err, docs) {}
|
|
);
|
|
} else {
|
|
db.collection("connected_users").update({
|
|
_id: coll
|
|
}, {
|
|
$addToSet: {
|
|
users: guid
|
|
}
|
|
},
|
|
function (err, docs) {}
|
|
);
|
|
}
|
|
if (coll != undefined && coll != "") {
|
|
db.collection("connected_users").update({
|
|
_id: "total_users"
|
|
}, {
|
|
$addToSet: {
|
|
total_users: guid + coll
|
|
}
|
|
},
|
|
function (err, docs) {}
|
|
);
|
|
}
|
|
if (callback != undefined && typeof callback == "function") callback();
|
|
}
|
|
}
|
|
|
|
function rndName(seed, len) {
|
|
const vowels = ["a", "e", "i", "o", "u"];
|
|
consts = [
|
|
"b",
|
|
"c",
|
|
"d",
|
|
"f",
|
|
"g",
|
|
"h",
|
|
"j",
|
|
"k",
|
|
"l",
|
|
"m",
|
|
"n",
|
|
"p",
|
|
"r",
|
|
"s",
|
|
"t",
|
|
"v",
|
|
"w",
|
|
"x",
|
|
"y"
|
|
];
|
|
len = Math.floor(len);
|
|
word = "";
|
|
is_vowel = false;
|
|
let arr;
|
|
try {
|
|
for (let i = 0; i < len; i++) {
|
|
if (is_vowel) arr = vowels;
|
|
else arr = consts;
|
|
is_vowel = !is_vowel;
|
|
word += arr[(seed[i % seed.length].charCodeAt() + i) % (arr.length - 1)];
|
|
}
|
|
} catch (e) {
|
|
return rndName(uniqid.time().toLowerCase(), len);
|
|
}
|
|
return word;
|
|
}
|
|
|
|
function removeEmojis(string) {
|
|
//https://stackoverflow.com/a/41164278/4266467
|
|
const regex = /(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/g;
|
|
return string.replace(regex, "");
|
|
}
|
|
|
|
function decrypt_string(pw) {
|
|
try {
|
|
return Buffer.from(pw, "base64").toString("ascii");
|
|
} catch (e) {
|
|
return "";
|
|
}
|
|
}
|
|
|
|
function get_time() {
|
|
const d = new Date();
|
|
const time = Math.floor(d.getTime() / 1000);
|
|
return time;
|
|
}
|
|
|
|
function contains(a, obj) {
|
|
try {
|
|
let i = a.length;
|
|
while (i--) {
|
|
if (a[i] === obj) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function hash_pass(adminpass, hex) {
|
|
if (adminpass == undefined || adminpass == "") return "";
|
|
if (hex)
|
|
return crypto
|
|
.createHash("sha256")
|
|
.update(adminpass)
|
|
.digest("hex");
|
|
return crypto
|
|
.createHash("sha256")
|
|
.update(adminpass)
|
|
.digest("base64");
|
|
}
|
|
|
|
function setSessionAdminPass(id, adminpass, list, callback) {
|
|
try {
|
|
if (id == "empty" || id == undefined) {
|
|
callback();
|
|
return;
|
|
}
|
|
|
|
connected_db
|
|
.collection(id)
|
|
.update({
|
|
_id: list
|
|
}, {
|
|
$set: {
|
|
adminpass: hash_pass(decrypt_string(adminpass), true)
|
|
}
|
|
}, {
|
|
upsert: true
|
|
},
|
|
function (e, d) {
|
|
callback();
|
|
return;
|
|
}
|
|
);
|
|
} catch (e) {}
|
|
}
|
|
|
|
function setSessionChatPass(id, name, pass, callback) {
|
|
try {
|
|
if (id == "empty" || id == undefined) {
|
|
callback();
|
|
return;
|
|
}
|
|
connected_db
|
|
.collection(id)
|
|
.update({
|
|
_id: "_chat_"
|
|
}, {
|
|
$set: {
|
|
password: pass,
|
|
name: name
|
|
}
|
|
}, {
|
|
upsert: true
|
|
},
|
|
function (e) {
|
|
callback();
|
|
return;
|
|
}
|
|
);
|
|
} catch (e) {
|
|
callback();
|
|
return;
|
|
}
|
|
}
|
|
|
|
function getSessionChatPass(id, callback) {
|
|
try {
|
|
if (id == "empty" || id == undefined) {
|
|
callback("", "", false);
|
|
return;
|
|
}
|
|
|
|
connected_db.collection(id).find({
|
|
_id: "_chat_"
|
|
}, function (e, d) {
|
|
if (d.length > 0) {
|
|
let name = "";
|
|
let pass = "";
|
|
if (d[0].name != undefined) name = d[0].name;
|
|
if (d[0].password != undefined) pass = d[0].password;
|
|
callback(name, pass);
|
|
return;
|
|
} else {
|
|
callback("", "", false);
|
|
return;
|
|
}
|
|
});
|
|
} catch (e) {
|
|
callback();
|
|
return;
|
|
}
|
|
}
|
|
|
|
function setChromecastHost(id, other_id, list, callback) {
|
|
try {
|
|
if (
|
|
id == "empty" ||
|
|
id == undefined ||
|
|
other_id == "empty" ||
|
|
other_id == undefined
|
|
) {
|
|
callback();
|
|
return;
|
|
}
|
|
connected_db
|
|
.collection(id)
|
|
.update({
|
|
_id: list
|
|
}, {
|
|
chromecast: true,
|
|
id: other_id
|
|
}, {
|
|
upsert: true
|
|
},
|
|
function (e, docs) {
|
|
callback(true);
|
|
return;
|
|
}
|
|
);
|
|
} catch (e) {
|
|
callback(false);
|
|
}
|
|
}
|
|
|
|
function setSessionUserPass(id, userpass, list, callback) {
|
|
try {
|
|
if (id == "empty" || id == undefined || userpass == undefined) {
|
|
callback();
|
|
return;
|
|
}
|
|
|
|
connected_db
|
|
.collection(id)
|
|
.update({
|
|
_id: list
|
|
}, {
|
|
$set: {
|
|
userpass: userpass
|
|
}
|
|
}, {
|
|
upsert: true
|
|
},
|
|
function (e, d) {
|
|
callback();
|
|
return;
|
|
}
|
|
);
|
|
} catch (e) {
|
|
callback();
|
|
}
|
|
}
|
|
|
|
function getSessionAdminUser(id, list, callback) {
|
|
try {
|
|
if (id == "empty" || id == undefined) {
|
|
callback("", "", false);
|
|
return;
|
|
}
|
|
connected_db.collection(id).find({
|
|
_id: list
|
|
}, function (e, d) {
|
|
let userpass = "";
|
|
let adminpass = "";
|
|
if (d.length > 0) {
|
|
if (d[0].hasOwnProperty("chromecast") && d[0].chromecast) {
|
|
getSessionAdminUser(d[0].id, list, callback);
|
|
} else {
|
|
if (d[0].userpass != undefined) userpass = d[0].userpass;
|
|
if (d[0].adminpass != undefined) adminpass = d[0].adminpass;
|
|
callback(userpass, adminpass, true);
|
|
}
|
|
} else {
|
|
callback(userpass, adminpass, true);
|
|
}
|
|
});
|
|
} catch (e) {
|
|
callback("", "", false);
|
|
}
|
|
}
|
|
|
|
function removeSessionChatPass(id, callback) {
|
|
if (id == "empty" || id == undefined) {
|
|
callback();
|
|
return;
|
|
}
|
|
connected_db.collection(id).remove({
|
|
_id: "_chat_"
|
|
}, function () {
|
|
callback();
|
|
return;
|
|
});
|
|
}
|
|
|
|
function removeSessionAdminPass(id, channel, callback) {
|
|
if (id == "empty" || id == undefined) {
|
|
callback();
|
|
return;
|
|
}
|
|
connected_db
|
|
.collection(id)
|
|
.update({
|
|
_id: channel
|
|
}, {
|
|
$set: {
|
|
adminpass: ""
|
|
}
|
|
}, function () {
|
|
callback();
|
|
return;
|
|
});
|
|
}
|
|
|
|
function remove_from_chat_channel(coll, guid) {
|
|
db.collection("user_names").update({
|
|
guid: guid
|
|
}, {
|
|
$pull: {
|
|
channels: coll
|
|
}
|
|
},
|
|
function (err, docs) {}
|
|
);
|
|
}
|
|
|
|
function left_channel(coll, guid, short_id, in_list, socket, change, caller) {
|
|
if (!coll) {
|
|
if (!change) {
|
|
remove_name_from_db(guid, coll);
|
|
} else {
|
|
remove_from_chat_channel(coll, guid);
|
|
}
|
|
return;
|
|
}
|
|
db.collection("connected_users").update({
|
|
_id: coll
|
|
}, {
|
|
$pull: {
|
|
users: guid
|
|
}
|
|
},
|
|
function (err, updated) {
|
|
if (updated.nModified > 0) {
|
|
db.collection("connected_users").update({
|
|
_id: "total_users"
|
|
}, {
|
|
$pull: {
|
|
total_users: guid + coll
|
|
}
|
|
},
|
|
function (err, updated) {}
|
|
);
|
|
db.collection("connected_users").find({
|
|
_id: coll
|
|
}, function (
|
|
err,
|
|
new_doc
|
|
) {
|
|
db.collection("frontpage_lists").update({
|
|
_id: coll,
|
|
viewers: {
|
|
$gt: 0
|
|
}
|
|
}, {
|
|
$inc: {
|
|
viewers: -1
|
|
}
|
|
},
|
|
function (err, doc) {
|
|
db.collection("user_names").find({
|
|
guid: guid
|
|
}, function (
|
|
err,
|
|
docs
|
|
) {
|
|
if (docs.length == 1) {
|
|
let icon = "";
|
|
if (docs[0].icon != undefined) icon = docs[0].icon;
|
|
io.to(coll).emit("chat", {
|
|
from: docs[0].name,
|
|
icon: icon,
|
|
msg: " left"
|
|
});
|
|
}
|
|
});
|
|
io.to(coll).emit("viewers", new_doc[0].users.length);
|
|
socket.leave(coll);
|
|
if (!change) {
|
|
remove_name_from_db(guid, coll);
|
|
} else {
|
|
remove_from_chat_channel(coll, guid);
|
|
}
|
|
}
|
|
);
|
|
});
|
|
} else {
|
|
db.collection("connected_users").update({
|
|
_id: "offline_users"
|
|
}, {
|
|
$pull: {
|
|
users: guid
|
|
}
|
|
},
|
|
function (err, updated) {
|
|
db.collection("connected_users").update({
|
|
_id: "total_users"
|
|
}, {
|
|
$pull: {
|
|
total_users: guid + coll
|
|
}
|
|
},
|
|
function (err, updated) {}
|
|
);
|
|
if (!change) {
|
|
remove_name_from_db(guid, coll);
|
|
} else {
|
|
remove_from_chat_channel(coll, guid);
|
|
}
|
|
}
|
|
);
|
|
}
|
|
}
|
|
);
|
|
remove_unique_id(short_id);
|
|
}
|
|
|
|
function checkTimeout(
|
|
type,
|
|
timeout,
|
|
channel,
|
|
guid,
|
|
conf_pass,
|
|
this_pass,
|
|
socket,
|
|
callback,
|
|
error_message,
|
|
error_callback
|
|
) {
|
|
if (conf_pass != "" && conf_pass == this_pass) {
|
|
callback();
|
|
return;
|
|
}
|
|
db.collection("timeout_api").find({
|
|
type,
|
|
guid
|
|
},
|
|
function (err, docs) {
|
|
if (docs.length > 0) {
|
|
const date = new Date(docs[0].createdAt);
|
|
date.setSeconds(date.getSeconds() + timeout);
|
|
const now = new Date();
|
|
|
|
const retry_in = (date.getTime() - now.getTime()) / 1000;
|
|
if (retry_in > 0) {
|
|
if (typeof error_callback == "function") {
|
|
error_callback();
|
|
} else if (error_message) {
|
|
const sOrNot =
|
|
Math.ceil(retry_in) > 1 || Math.ceil(retry_in) == 0 ? "s" : "";
|
|
socket.emit(
|
|
"toast",
|
|
error_message + Math.ceil(retry_in) + " second" + sOrNot + "."
|
|
);
|
|
} else {
|
|
socket.emit("toast", "wait_longer");
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
db.collection("timeout_api").update({
|
|
type,
|
|
guid
|
|
}, {
|
|
$set: {
|
|
createdAt: now,
|
|
type,
|
|
guid
|
|
}
|
|
}, {
|
|
upsert: true
|
|
},
|
|
function (err, docs) {
|
|
callback();
|
|
return;
|
|
}
|
|
);
|
|
}
|
|
);
|
|
}
|
|
|
|
module.exports.checkTimeout = checkTimeout;
|
|
module.exports.left_channel = left_channel;
|
|
module.exports.setChromecastHost = setChromecastHost;
|
|
module.exports.decodeChannelName = decodeChannelName;
|
|
module.exports.encodeChannelName = encodeChannelName;
|
|
module.exports.isUrl = isUrl;
|
|
module.exports.removeEmojis = removeEmojis;
|
|
module.exports.getSessionChatPass = getSessionChatPass;
|
|
module.exports.setSessionChatPass = setSessionChatPass;
|
|
module.exports.removeSessionAdminPass = removeSessionAdminPass;
|
|
module.exports.removeSessionChatPass = removeSessionChatPass;
|
|
module.exports.setSessionAdminPass = setSessionAdminPass;
|
|
module.exports.setSessionUserPass = setSessionUserPass;
|
|
module.exports.getSessionAdminUser = getSessionAdminUser;
|
|
module.exports.getSession = getSession;
|
|
module.exports.generate_channel_name = generate_channel_name;
|
|
module.exports.remove_unique_id = remove_unique_id;
|
|
module.exports.remove_name_from_db = remove_name_from_db;
|
|
module.exports.remove_from_array = remove_from_array;
|
|
module.exports.get_short_id = get_short_id;
|
|
module.exports.check_inlist = check_inlist;
|
|
module.exports.rndName = rndName;
|
|
module.exports.decrypt_string = decrypt_string;
|
|
module.exports.get_time = get_time;
|
|
module.exports.contains = contains;
|
|
module.exports.hash_pass = hash_pass; |