UNPKG

xp-flow

Version:

A robust and customizable leveling system for Discord.js bots with multi-database support and beautiful rank cards.

62 lines (52 loc) 1.78 kB
const mongoose = require('mongoose'); const fluident = require('fluident'); /** * Prefix for console responses using my own package "fluident"; */ const prefix = fluident.gradient( '[XPFLOW] ', ['#ff0000ff', '#ff3300ff', '#ff8800ff', '#ff4800ff'] ); const userSchema = new mongoose.Schema({ userId: { type: String, required: true }, guildId: { type: String, required: true }, xp: { type: Number, default: 0 }, level: { type: Number, default: 0 } }); // Create a compound index for efficient lookups userSchema.index({ userId: 1, guildId: 1 }, { unique: true }); const User = mongoose.model('XPFlowUser', userSchema); /** * Handles all MongoDB database operations. */ class MongoDBHandler { constructor(uri) { if (!uri) throw new Error(prefix + fluident.red("MongoDB URI is required.")); this.uri = uri; this.init(); } async init() { try { await mongoose.connect(this.uri); console.log(prefix + fluident.green('MongoDB connection successful.')); } catch (err) { console.error(prefix + fluident.yellow('MongoDB connection error:'), err); } } async getUser(userId, guildId) { return User.findOne({ userId, guildId }).lean(); } async createUser(userId, guildId) { return User.create({ userId, guildId }); } async updateUser(userId, guildId, xp, level) { return User.updateOne({ userId, guildId }, { $set: { xp, level } }); } async getLeaderboard(guildId, limit) { return User.find({ guildId }) .sort({ level: -1, xp: -1 }) .limit(limit) .lean(); } } module.exports = MongoDBHandler;