85 lines
2.7 KiB
JavaScript
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] });
|
|
}
|
|
};
|