Added Basic Leveling System and QoL Updates

This commit is contained in:
Ahmad 2025-03-09 15:52:10 -04:00
parent 7af6d5914d
commit b5ce514397
No known key found for this signature in database
GPG key ID: 8FD8A93530D182BF
15 changed files with 970 additions and 39 deletions

View file

@ -0,0 +1,36 @@
import { PermissionsBitField, SlashCommandBuilder } from 'discord.js';
import { Command } from '../../types/CommandTypes.js';
import { recalculateUserLevels } from '../../util/levelingSystem.js';
const command: Command = {
data: new SlashCommandBuilder()
.setName('recalculatelevels')
.setDescription('(Admin Only) Recalculate all user levels'),
execute: async (interaction) => {
if (
!interaction.memberPermissions?.has(
PermissionsBitField.Flags.Administrator,
)
) {
await interaction.reply({
content: 'You do not have permission to use this command.',
flags: ['Ephemeral'],
});
return;
}
await interaction.deferReply();
await interaction.editReply('Recalculating levels...');
try {
await recalculateUserLevels();
await interaction.editReply('Levels recalculated successfully!');
} catch (error) {
console.error('Error recalculating levels:', error);
await interaction.editReply('Failed to recalculate levels.');
}
},
};
export default command;

132
src/commands/util/xp.ts Normal file
View file

@ -0,0 +1,132 @@
import { SlashCommandBuilder } from 'discord.js';
import { SubcommandCommand } from '../../types/CommandTypes.js';
import { addXpToUser, getUserLevel } from '../../db/db.js';
import { loadConfig } from '../../util/configLoader.js';
const command: SubcommandCommand = {
data: new SlashCommandBuilder()
.setName('xp')
.setDescription('(Manager only) Manage user XP')
.addSubcommand((subcommand) =>
subcommand
.setName('add')
.setDescription('Add XP to a member')
.addUserOption((option) =>
option
.setName('user')
.setDescription('The user to add XP to')
.setRequired(true),
)
.addIntegerOption((option) =>
option
.setName('amount')
.setDescription('The amount of XP to add')
.setRequired(true),
),
)
.addSubcommand((subcommand) =>
subcommand
.setName('remove')
.setDescription('Remove XP from a member')
.addUserOption((option) =>
option
.setName('user')
.setDescription('The user to remove XP from')
.setRequired(true),
)
.addIntegerOption((option) =>
option
.setName('amount')
.setDescription('The amount of XP to remove')
.setRequired(true),
),
)
.addSubcommand((subcommand) =>
subcommand
.setName('set')
.setDescription('Set XP for a member')
.addUserOption((option) =>
option
.setName('user')
.setDescription('The user to set XP for')
.setRequired(true),
)
.addIntegerOption((option) =>
option
.setName('amount')
.setDescription('The amount of XP to set')
.setRequired(true),
),
)
.addSubcommand((subcommand) =>
subcommand
.setName('reset')
.setDescription('Reset XP for a member')
.addUserOption((option) =>
option
.setName('user')
.setDescription('The user to reset XP for')
.setRequired(true),
),
),
execute: async (interaction) => {
if (!interaction.isChatInputCommand()) return;
const commandUser = interaction.guild?.members.cache.get(
interaction.user.id,
);
const config = loadConfig();
const managerRoleId = config.roles.staffRoles.find(
(role) => role.name === 'Manager',
)?.roleId;
if (
!commandUser ||
!managerRoleId ||
commandUser.roles.highest.comparePositionTo(managerRoleId) < 0
) {
await interaction.reply({
content: 'You do not have permission to use this command',
flags: ['Ephemeral'],
});
return;
}
await interaction.deferReply({
flags: ['Ephemeral'],
});
await interaction.editReply('Processing...');
const subcommand = interaction.options.getSubcommand();
const user = interaction.options.getUser('user', true);
const amount = interaction.options.getInteger('amount', false);
const userData = await getUserLevel(user.id);
if (subcommand === 'add') {
await addXpToUser(user.id, amount!);
await interaction.editReply({
content: `Added ${amount} XP to <@${user.id}>`,
});
} else if (subcommand === 'remove') {
await addXpToUser(user.id, -amount!);
await interaction.editReply({
content: `Removed ${amount} XP from <@${user.id}>`,
});
} else if (subcommand === 'set') {
await addXpToUser(user.id, amount! - userData.xp);
await interaction.editReply({
content: `Set ${amount} XP for <@${user.id}>`,
});
} else if (subcommand === 'reset') {
await addXpToUser(user.id, userData.xp * -1);
await interaction.editReply({
content: `Reset XP for <@${user.id}>`,
});
}
},
};
export default command;