104 lines
2.0 KiB
JavaScript
104 lines
2.0 KiB
JavaScript
/*
|
|
* Acces Levels:
|
|
* * -1 - banned
|
|
* * 0 - user
|
|
* * 1 - moderator
|
|
* * 2 - editor
|
|
* * 3 - admin
|
|
* * 4 - superadmin
|
|
* * 5 - root
|
|
*/
|
|
|
|
const ACCESS_LEVELS = {
|
|
"-1": "banned",
|
|
0: "user",
|
|
1: "helper",
|
|
2: "moderator",
|
|
3: "admin",
|
|
4: "superadmin",
|
|
5: "root",
|
|
};
|
|
|
|
class AccessLevel {
|
|
static validate (value) {
|
|
const access = Object.fromEntries(Object.keys(ACCESS_LEVELS)
|
|
.map(level => [level, true]));
|
|
return (
|
|
Number.isInteger(value) &&
|
|
access["" + value] === true
|
|
);
|
|
}
|
|
|
|
constructor (accessLevel) {
|
|
if (!this.__proto__.constructor.validate(accessLevel))
|
|
throw new Error(
|
|
`Invalid access level: ${accessLevel}`,
|
|
);
|
|
this.code = accessLevel;
|
|
}
|
|
|
|
get accessName () {
|
|
return ACCESS_LEVELS[""+this.code]
|
|
}
|
|
}
|
|
|
|
class User {
|
|
constructor (name, accessLevel) {
|
|
this.name = name;
|
|
if (accessLevel instanceof AccessLevel)
|
|
this.accessLevel = accessLevel;
|
|
else
|
|
this.accessLevel = new AccessLevel(accessLevel);
|
|
}
|
|
|
|
static async getUserByName(name) {
|
|
if (User.cache[name]) return User.cache[name];
|
|
if (
|
|
!!global.config.rootuser?.activated &&
|
|
name === global.config.rootuser.login
|
|
) {
|
|
const user = new User(name, 5);
|
|
User.cache[name] = user;
|
|
return user;
|
|
}
|
|
// TODO: Потом добавить чтение из БД
|
|
//return null;
|
|
|
|
const userdata = await global.database.getUserRowByName(name);
|
|
if (!userdata)
|
|
return null;
|
|
const user = new User(userdata.username, userdata.accessLevel);
|
|
User.cache[name] = user;
|
|
return user;
|
|
}
|
|
|
|
static getByToken(token) {
|
|
const user = global.authed.tokens[token];
|
|
return user ?? null;
|
|
}
|
|
|
|
getUserForAPI(getFullInfo = false, fields = "*") {
|
|
const getted = {
|
|
username: this.name,
|
|
accessLevel: this.accessLevel.code,
|
|
};
|
|
|
|
if (fields !== "*") {
|
|
const selected = Object.fromEntries(fields.split(/\s*,\s*/g).map(field => [field, true]));
|
|
for (let field in getted) {
|
|
if (!selected[field])
|
|
getted[field] = undefined;
|
|
}
|
|
}
|
|
|
|
return getted;
|
|
}
|
|
|
|
async getCharacters () {
|
|
return [];
|
|
}
|
|
}
|
|
User.cache = {};
|
|
|
|
module.exports = { User, AccessLevel };
|