/* * 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 };