118 lines
2.9 KiB
JavaScript
118 lines
2.9 KiB
JavaScript
const { Schema, model } = require("mongoose");
|
|
|
|
const user = new Schema({
|
|
id: { type: String },
|
|
username: { type: String },
|
|
xp: { type: Number, default: 0 },
|
|
level: { type: Number, default: 1 },
|
|
message_count: { type: Number, default: 0 }
|
|
});
|
|
|
|
async function checkUser(user) {
|
|
const userId = user.id;
|
|
const username = user.username;
|
|
|
|
// Find user by id
|
|
const existingUser = await User.findOne({ id: userId });
|
|
|
|
// If user doesn't exist, create new user
|
|
if (!existingUser) {
|
|
await User.create({
|
|
id: userId,
|
|
username: username,
|
|
xp: 0,
|
|
level: 1,
|
|
message_count: 0
|
|
});
|
|
}
|
|
}
|
|
|
|
async function getUserXP(userId) {
|
|
let userDoc = await User.findOne({ id: userId });
|
|
|
|
// If user doesn't exist, create new user
|
|
if (!userDoc) {
|
|
userDoc = await User.create({
|
|
id: userId,
|
|
xp: 0,
|
|
level: 1,
|
|
message_count: 0
|
|
});
|
|
}
|
|
|
|
return userDoc;
|
|
}
|
|
|
|
async function updateUserXP(user, xp) {
|
|
const userId = user.id;
|
|
const userDoc = await User.findOne({ id: userId });
|
|
userDoc.xp = xp;
|
|
await userDoc.save();
|
|
}
|
|
|
|
async function updateUserLevel(user, level) {
|
|
const userId = user.id;
|
|
const userDoc = await User.findOne({ id: userId });
|
|
userDoc.level = level;
|
|
await userDoc.save();
|
|
}
|
|
|
|
async function updateUserXPAndLevel(userId, xp, level, message_count) {
|
|
const userDoc = await User.findOne({ id: userId });
|
|
if (!userDoc) {
|
|
return await User.create({
|
|
id: userId,
|
|
xp: xp,
|
|
level: level,
|
|
message_count: message_count
|
|
});
|
|
}
|
|
userDoc.xp = xp;
|
|
userDoc.level = level;
|
|
userDoc.message_count = message_count;
|
|
await userDoc.save();
|
|
}
|
|
|
|
async function updateUserMessageCount(userId, message_count) {
|
|
const userDoc = await User.findOne({ id: userId });
|
|
if (!userDoc) {
|
|
return await User.create({
|
|
id: userId,
|
|
xp: 0,
|
|
level: 1,
|
|
message_count: message_count
|
|
});
|
|
}
|
|
userDoc.message_count = message_count;
|
|
await userDoc.save();
|
|
}
|
|
/**
|
|
* Retrieves the top users sorted by XP
|
|
* @param {number} limit - Maximum number of users to return (default: 10)
|
|
* @returns {Promise<Array>} Array of user objects containing id, username, xp, and level
|
|
*/
|
|
async function getLeaderboard(limit = 10) {
|
|
const users = await User.find()
|
|
.sort({ xp: -1 })
|
|
.limit(limit)
|
|
.select('id username xp level');
|
|
|
|
return users.map(user => ({
|
|
user_id: user.id,
|
|
username: user.username,
|
|
xp: user.xp,
|
|
level: user.level
|
|
}));
|
|
}
|
|
|
|
const User = model("user", user);
|
|
module.exports = {
|
|
checkUser,
|
|
getUserXP,
|
|
updateUserXP,
|
|
updateUserLevel,
|
|
updateUserXPAndLevel,
|
|
getLeaderboard,
|
|
updateUserMessageCount,
|
|
User
|
|
};
|