Spaces:
Paused
Paused
| var { apis } = global.mira; | |
| var log = require("../../lib/log"); | |
| var { getType } = require("../../lib/utils"); | |
| module.exports = async function UserDataBase(SQL, sql) { | |
| var User = SQL.define("User", { | |
| userID: { | |
| type: sql.BIGINT, | |
| unique: true | |
| }, | |
| name: { | |
| type: sql.STRING, | |
| allowNull: false, | |
| validate: { | |
| notEmpty: true | |
| } | |
| }, | |
| money: { | |
| type: sql.BIGINT, | |
| defaultValue: 0, | |
| validate: { | |
| isInt: true, | |
| min: 0 | |
| } | |
| }, | |
| info: { | |
| type: sql.JSON, | |
| validate: { | |
| isJSON: value => JSON.stringify(value) | |
| } | |
| }, | |
| data: { | |
| type: sql.JSON, | |
| validate: { | |
| isJSON: value => JSON.stringify(value) | |
| } | |
| }, | |
| banAt: { | |
| type: sql.BIGINT, | |
| defaultValue: 0, | |
| validate: { | |
| isInt: true, | |
| min: 0 | |
| } | |
| }, | |
| reason: { | |
| type: sql.STRING, | |
| allowNull: true, | |
| validate: { | |
| notEmpty: true | |
| } | |
| } | |
| }); | |
| User.sync({ force: false }); | |
| function getAll() { | |
| return User.findAll(); | |
| } | |
| function find(conditions = {}) { | |
| if (getType(conditions) !== "Object") | |
| throw new Error("conditions must be an JSON Object."); | |
| return User.findAll({ where: conditions }); | |
| } | |
| async function getInfo(userID) { | |
| if (isNaN(parseInt(userID))) | |
| throw new Error("userID must be a string number."); | |
| var infoObj = await apis.getUserInfo(userID); | |
| return infoObj[userID] || {} | |
| } | |
| async function findOne(userID) { | |
| if (isNaN(parseInt(userID))) | |
| throw new Error("userID must be a string number."); | |
| var userData = await User.findOne({ where: { userID } }); | |
| if (!userData) { | |
| await createData(userID); | |
| return await findOne(userID); | |
| } | |
| return userData.get({ plain: true }); | |
| } | |
| async function createData(userID) { | |
| var info = await getInfo(userID); | |
| var infoObj = { | |
| userID, | |
| name: info.name || "User", | |
| money: 0, | |
| info, | |
| data: {}, | |
| banAt: 0, | |
| reason: null | |
| } | |
| delete infoObj.info.name; | |
| await User.findOrCreate({ where: { userID }, defaults: infoObj }); | |
| log.info("database.create.success", userID); | |
| return; | |
| } | |
| async function setData(userID, data) { | |
| if (isNaN(parseInt(userID))) | |
| throw new Error("userID must be a string number."); | |
| if (getType(data) !== "Object") | |
| throw new Error("data must be an JSON Object."); | |
| await User.update(data, { where: { userID } }); | |
| return; | |
| } | |
| async function setDataAll(data, conditions = {}) { | |
| if (getType(conditions) !== "Object") | |
| throw new Error("conditions must be an JSON Object."); | |
| if (getType(data) !== "Object") | |
| throw new Error("data must be an JSON Object."); | |
| await User.update(data, { where: conditions }); | |
| return; | |
| } | |
| async function deleteUser(userID) { | |
| if (isNaN(parseInt(userID))) | |
| throw new Error("userID must be a string number."); | |
| await User.destroy({ where: { userID } }); | |
| return; | |
| } | |
| log.info("database.model", "User.sqlite3"); | |
| return global.database.model.User = { | |
| getAll, | |
| find, | |
| findOne, | |
| setData, | |
| setDataAll, | |
| deleteUser | |
| } | |
| } |