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