mpp-server-dev2/oldsrc/Database.js

216 lines
5.2 KiB
JavaScript
Raw Normal View History

2023-03-31 16:43:24 +02:00
const fs = require("fs");
const { promisify } = require("util");
const createKeccakHash = require("keccak");
const ColorEncoder = require("./ColorEncoder");
const UserModel = require("./UserModel");
const mongoose = require("mongoose");
const level = require("level");
const { db } = require("./UserModel");
const Logger = require("./Logger");
2021-05-09 22:34:22 +02:00
2023-04-17 01:34:32 +02:00
const logger = new Logger("Database");
2021-05-09 10:52:41 +02:00
2023-03-31 16:43:24 +02:00
mongoose.connect(
process.env.MONGO_URL,
{
useNewUrlParser: true,
useUnifiedTopology: true,
connectTimeoutMS: 1000
},
err => {
if (err) {
console.error(err);
logger.error("Unable to connect to database service");
process.exit(1);
}
2023-04-17 01:34:32 +02:00
logger.log("Connected to Mongo");
2021-05-09 10:52:41 +02:00
}
2023-03-31 16:43:24 +02:00
);
2023-04-17 01:34:32 +02:00
// TODO implement this with an if statement instead
2023-03-31 16:43:24 +02:00
fs.mkdirSync("db/", {
recursive: true
2021-05-09 10:52:41 +02:00
});
2021-04-12 23:29:02 +02:00
class Database {
static userdb;
2021-05-09 10:52:41 +02:00
static roomdb;
2023-04-01 07:05:12 +02:00
static bandb;
2023-04-17 01:34:32 +02:00
static utildb;
2021-04-12 23:29:02 +02:00
static async load() {
2023-04-17 01:34:32 +02:00
logger.log("Initializing level stores...");
2021-05-09 10:52:41 +02:00
this.userdb = mongoose.connection;
2023-03-31 16:43:24 +02:00
this.roomdb = level("db/rooms.db");
2023-04-01 07:05:12 +02:00
this.bandb = level("db/ban.db");
2023-04-17 01:34:32 +02:00
this.utildb = level("db/util.db");
logger.log("Level stores initialized");
2023-04-01 07:05:12 +02:00
2021-05-09 10:52:41 +02:00
// const writeFile = promisify(fs.writeFile);
// const readdir = promisify(fs.readdir);
// let files = await readdir("src/db/");
// if (!files.includes("users.json")) {
// await writeFile('src/db/users.json', JSON.stringify(this.default_db, null, 2))
// this.userdb = new Map(Object.entries(require("./db/users.json")));
// } else {
// this.userdb = new Map(Object.entries(require("./db/users.json")));
// }
2021-04-12 23:29:02 +02:00
}
static async getUserData(cl, server) {
2021-05-09 10:52:41 +02:00
if (!this.userdb) {
2021-04-12 23:29:02 +02:00
await this.load();
}
2023-03-31 16:43:24 +02:00
let _id = createKeccakHash("keccak256")
.update(cl.server._id_Private_Key + cl.ip)
.digest("hex")
.substr(0, 24);
let user = await UserModel.findById(_id).exec();
2021-05-09 10:52:41 +02:00
if (user == null) {
2023-03-31 16:43:24 +02:00
user = await this.createUser(_id);
2021-05-09 10:52:41 +02:00
}
2021-04-12 23:29:02 +02:00
2021-05-09 10:52:41 +02:00
return user;
}
2021-04-12 23:29:02 +02:00
2021-05-09 10:52:41 +02:00
static async createUser(_id) {
2022-12-06 13:30:36 +01:00
if (!this.userdb) {
await this.load();
}
2021-05-09 10:52:41 +02:00
let user = new UserModel({
name: "Anonymous",
_id: _id,
color: "#" + ColorEncoder.intToRGB(ColorEncoder.hashCode(_id)),
2023-03-31 16:43:24 +02:00
flags: {}
2021-05-09 10:52:41 +02:00
});
2023-03-31 16:43:24 +02:00
2021-05-09 10:52:41 +02:00
user.save();
2021-04-12 23:29:02 +02:00
return user;
}
2021-05-09 10:52:41 +02:00
static async updateUser(_id, data) {
2022-12-06 13:30:36 +01:00
if (!this.userdb) {
await this.load();
}
2023-03-31 16:43:24 +02:00
let user = await UserModel.findOne({ _id: _id }).exec();
2021-05-10 04:02:04 +02:00
user.name = data.name;
user._id = data._id;
user.flags = data.flags;
user.color = data.color;
2021-05-10 03:13:15 +02:00
await user.save();
2021-05-09 10:52:41 +02:00
}
static async wipe() {
2022-12-06 13:30:36 +01:00
if (!this.userdb) {
await this.load();
}
2023-03-31 16:43:24 +02:00
2021-05-09 10:52:41 +02:00
await UserModel.find({}, (err, docs) => {
docs.forEach(doc => {
doc.remove();
});
}).exec();
2021-04-12 23:29:02 +02:00
}
static strMapToObj(strMap) {
2023-03-31 16:43:24 +02:00
return [...strMap.entries()].reduce(
(obj, [key, value]) => ((obj[key] = value), obj),
{}
);
2021-04-12 23:29:02 +02:00
}
2021-05-09 10:52:41 +02:00
static getRoomSettings(_id, cb) {
2023-03-31 16:43:24 +02:00
let key = "room~" + _id;
roomSettings;
2021-05-09 10:52:41 +02:00
this.roomdb.get(key, (err, value) => {
if (err || !value || value == "") {
cb(err, value);
return;
}
cb(undefined, value);
});
}
static setRoomSettings(_id, roomSettings, chat) {
let roomData = new RoomDataModel(roomSettings, chat);
2023-03-31 16:43:24 +02:00
let key = "room~" + _id;
2021-05-09 10:52:41 +02:00
this.roomdb.put(key, JSON.stringify(roomData));
}
static getRoomSettings(_id, cb) {
2023-03-31 16:43:24 +02:00
let key = "room~" + _id;
2021-05-09 10:52:41 +02:00
this.roomdb.get(key, (err, value) => {
if (err) {
cb(err);
return;
}
let settings = JSON.parse(value);
cb(err, settings);
});
}
static deleteRoomSettings(_id) {
2023-04-17 01:34:32 +02:00
if (!this.bandb) return this.load();
2023-03-31 16:43:24 +02:00
this.roomdb.del("room~" + _id);
2021-05-09 10:52:41 +02:00
}
2023-04-01 07:05:12 +02:00
static addIPBan(ip) {
2023-04-17 01:34:32 +02:00
if (!this.bandb) return this.load();
2023-04-01 07:05:12 +02:00
this.bandb.put("ipban~" + ip, true);
}
static removeIPBan(ip) {
2023-04-17 01:34:32 +02:00
if (!this.bandb) return this.load();
2023-04-01 07:05:12 +02:00
this.bandb.del("ipban~" + ip);
}
static isIPBanned(ip, cb) {
2023-04-17 01:34:32 +02:00
if (!this.bandb) {
// FIXME this was causing a crash :/ maybe it should be async instead of return false?
this.load();
return false;
}
2023-04-01 07:05:12 +02:00
this.roomdb.get("ipban~" + ip, (err, value) => {
if (err) {
return false;
}
console.log("ban:", value);
if (value == true) return true;
});
}
2023-04-17 01:34:32 +02:00
static utilSet(key, value) {
return this.utildb.put(key, value);
}
static utilGet(key) {
return this.utildb.get(key);
}
static utilDel(key) {
return this.utildb.del(key);
}
2021-05-09 10:52:41 +02:00
}
class RoomDataModel {
2023-03-31 16:43:24 +02:00
constructor(settings, chat) {
2021-05-09 10:52:41 +02:00
this.settings = settings;
this.chat = chat;
}
2021-04-12 23:29:02 +02:00
}
module.exports = Database;