85 lines
2.7 KiB
JavaScript

const Embed = require("../embed");
const { User, getUserXP, checkUser, updateUserMessageCount, updateUserXPAndLevel } = require("../../models/user");
const { XPSetting, getXPSettings } = require("../../models/xp_setting");
const logger = require("../logger");
const self = module.exports = {
xpSystem: async (client, message) => {
try {
// Check if message is from a server
if (!message.server) {
return; // Skip XP for DMs
}
await checkUser(message.author);
const user = await getUserXP(message.author.id);
const settings = await getXPSettings(message.server.id);
// If no settings exist for this server, create default settings
if (!settings) {
const defaultSettings = {
serverId: message.server.id,
messages_per_xp: 3,
min_xp_per_gain: 2,
max_xp_per_gain: 12,
weekend_multiplier: 2,
weekend_days: "sat,sun",
double_xp_enabled: false,
level_up_enabled: true,
level_up_channel: '01HF7B18Z864E10XSF22F9RFZQ'
};
await XPSetting.create(defaultSettings);
return; // Skip this message, will work from next message
}
user.message_count++;
if (user.message_count >= settings.messages_per_xp) {
user.message_count = 0;
let xpGain = Math.floor(Math.random() * (settings.max_xp_per_gain - settings.min_xp_per_gain + 1)) + settings.min_xp_per_gain;
if (settings.double_xp_enabled || self.isWeekend(settings.weekend_days)) {
xpGain *= settings.weekend_multiplier;
}
user.xp += xpGain;
const newLevel = self.calculateLevel(user.xp);
if (newLevel > user.level) {
user.level = newLevel;
if (settings.level_up_enabled) {
const channel = client.channels.get(settings.level_up_channel);
if (channel) {
await self.sendLevelUpMessage(channel, message.author, newLevel);
}
}
}
await updateUserXPAndLevel(message.author.id, user.xp, user.level, user.message_count);
logger.info('XP SYSTEM', `${message.author.username} gained ${xpGain} XP and is now level ${user.level}`);
} else {
await updateUserMessageCount(message.author.id, user.message_count);
}
} catch (error) {
logger.error('XP SYSTEM', error);
}
},
isWeekend: (weekendDays) => {
const today = new Date().toLocaleDateString('en-US', { weekday: 'short' }).toLowerCase();
return weekendDays.split(',').includes(today);
},
calculateLevel: (xp) => Math.floor(0.47 * Math.sqrt(xp)),
sendLevelUpMessage: async (channel, user, newLevel) => {
const embed = {
title: 'Level Up!',
description: `Congratulations ${user.username}! You've reached level ${newLevel}!`,
colour: '#00FF00'
};
await channel.sendMessage({ embeds: [embed] });
}
};