2
0
mirror of https://github.com/thedevs-network/the-guard-bot synced 2025-08-23 10:28:09 +00:00

146 lines
2.6 KiB
JavaScript
Raw Normal View History

'use strict';
2017-09-25 09:56:39 +03:30
// Utils
const { logError } = require('../utils/log');
const Datastore = require('nedb-promise');
const R = require('ramda');
const User = new Datastore({
autoload: true,
filename: 'data/User.db'
});
User.ensureIndex({
fieldName: 'id',
unique: true
});
2017-09-27 00:11:20 +03:30
User.ensureIndex({
fieldName: 'status',
});
const normalizeTgUser = R.pipe(
R.pick([ 'first_name', 'id', 'last_name', 'username' ]),
R.evolve({ username: R.toLower }),
R.merge({ first_name: '', last_name: '', username: '' }),
);
const getUpdatedDocument = R.prop(1);
const addUser = ({ id, first_name = '', last_name = '', username = '' }) =>
2017-09-27 00:11:20 +03:30
User.update(
{ id },
{
first_name,
id,
last_name,
status: 'member',
username: username.toLowerCase(),
warns: []
},
{ upsert: true }
)
.catch(logError);
const isUser = ({ id }) =>
User.findOne({ id });
2017-09-27 00:11:20 +03:30
const getUser = user =>
2017-09-25 12:40:04 +03:30
User.findOne(user);
const updateUser = async (rawTgUser) => {
const tgUser = normalizeTgUser(rawTgUser);
const { id } = tgUser;
const rawDbUser = await getUser({ id });
if (rawDbUser === null) {
return User.update(
{ id },
{ status: 'member', warns: [], ...tgUser },
{ returnUpdatedDocs: true, upsert: true }
).then(getUpdatedDocument);
}
const dbUser = rawDbUser;
if (!R.whereEq(tgUser, dbUser)) {
return User.update(
{ id },
{ $set: tgUser },
{ returnUpdatedDocs: true }
).then(getUpdatedDocument);
}
return dbUser;
};
const admin = ({ id }) =>
2017-09-27 00:11:20 +03:30
User.update(
{ id },
{ $set: { status: 'admin' } }
);
2017-09-27 00:11:20 +03:30
const getAdmins = () =>
User.find({ status: 'admin' });
const unadmin = ({ id }) =>
User.update({ id }, { $set: { status: 'member' } });
const isAdmin = ({ id }) =>
User.findOne({ id, status: 'admin' });
const ban = ({ id }, ban_reason) =>
User.update({ id }, { $set: { ban_reason, status: 'banned' } });
2017-09-27 00:11:20 +03:30
const unban = ({ id }) =>
User.update(
{ id },
{ $set: { ban_reason: null, status: 'member', warns: [] } }
);
2017-09-27 00:11:20 +03:30
const isBanned = ({ id }) =>
User.findOne({ id, status: 'banned' })
.then(user => user ? user.ban_reason : null);
const warn = ({ id }, reason) =>
User.update(
{ id },
{ $push: { warns: reason } },
{ returnUpdatedDocs: true }
).then(getUpdatedDocument);
const unwarn = ({ id }) =>
User.update(
{ id },
{ $pop: { warns: 1 }, $set: { ban_reason: null, status: 'member' } }
);
2017-11-17 18:53:51 +01:00
const nowarns = unban;
const getWarns = ({ id }) =>
User.findOne({ id })
.then(user => user && user.warns.length > 0
? user.warns
: null);
2017-09-27 00:11:20 +03:30
module.exports = {
addUser,
2017-09-27 00:11:20 +03:30
admin,
ban,
getAdmins,
2017-09-25 12:40:04 +03:30
getUser,
getWarns,
2017-09-27 00:11:20 +03:30
isAdmin,
isBanned,
isUser,
nowarns,
2017-09-27 00:11:20 +03:30
unadmin,
unban,
unwarn,
updateUser,
warn
};