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