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