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