diff --git a/lib/common.js b/lib/common.js index 0e1944c..264ea6e 100644 --- a/lib/common.js +++ b/lib/common.js @@ -146,6 +146,43 @@ module.exports = (config) => { } } catch (err) { } + }, + async banUser (username, remove = false) { + const user = await db.users.findOne({ username: username }) + if (!user) { + return `Can't find user "${username}"` + } + + const _id = user._id + if (!remove) { + if (user.banned) { + return `User "${username}" ${_id} is already banned.` + } + await db.users.update({ _id }, { $set: { active: 0, banned: true } }) + console.log(`Suspended user "${username}" ${_id}`) + return `Suspended user "${username}" ${_id}` + } else { + await utils.respawnUser(_id) + // Remove the bot user from the database + await db.users.removeWhere({ _id }) + await db['users.code'].removeWhere({ user: _id }) + await env.del(env.keys.MEMORY + _id) + await env.del(env.keys.MEMORY_SEGMENTS + _id) + console.log(`Removed user "${username}" ${_id}`) + return `Removed user "${username}" ${_id}` + } + }, + async unbanUser (username) { + const user = await db.users.findOne({ username: username }) + if (!user) { + return `Can't find user "${username}"` + } else if (user.active !== 0) { + return `User "${username}" ${user._id} is not banned.` + } + + await db.users.update({ _id: user._id }, { $set: { active: 10000, banned: false } }) + console.log(`Unbanned user "${username}" ${user._id}`) + return `Unbanned user "${username}" ${user._id}` } }) @@ -157,6 +194,9 @@ module.exports = (config) => { config.utils.setSocketUpdateRate._help = 'setSocketUpdateRate(value) Sets socket update rate (in ms)' config.utils.getSocketUpdateRate._help = 'getSocketUpdateRate() Returns current socket update rate' config.utils.setShardName._help = 'setShardName(value) Sets the shard name' + config.utils.banUser._help = 'banUser(username, remove = false) Ban the specified user from the server.\n' + + '\tPassing `false` will suspend their CPU usage, `true` will delete their data entirely.' + config.utils.unbanUser._help = 'unbanUser(username) Unban the specified user from the server.' Object.defineProperty(config.utils, '_help', { get () { // Using a getter here so that loaded services are also included diff --git a/lib/services/whitelist/cronjobs.js b/lib/services/whitelist/cronjobs.js index b3df99a..32e6de5 100644 --- a/lib/services/whitelist/cronjobs.js +++ b/lib/services/whitelist/cronjobs.js @@ -5,7 +5,7 @@ module.exports = (config) => { const WHITELIST = JSON.parse(await env.get(env.keys.WHITELIST) || '[]').map(u => u.toLowerCase()) const users = await db.users.find() for (const user of users) { - const blocked = !(user.allowed || WHITELIST.length === 0 || (user.username && WHITELIST.includes(user.username.toLowerCase()))) + const blocked = !(user.allowed || !user.banned || WHITELIST.length === 0 || (user.username && WHITELIST.includes(user.username.toLowerCase()))) db.users.update({ _id: user._id }, { $set: { blocked } }) } }]