Skip to content

Commit

Permalink
fixed some bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
JayNightmare committed Oct 3, 2024
1 parent b03ae71 commit 0d3c838
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 34 deletions.
6 changes: 6 additions & 0 deletions bot.js
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,11 @@ const commands = [
.setDescription('The level at which the milestone will be reached')
.setRequired(true)),

new SlashCommandBuilder()
.setName('view-milestones')
.setDescription('View the milestone levels and their associated roles')
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageRoles),

// //

new SlashCommandBuilder()
Expand Down Expand Up @@ -530,6 +535,7 @@ client.on('interactionCreate', async interaction => {
if (commandName === 'setup-levelup-channel') { console.log(`setup levelup command ran`); await configCommands.setLevelupChannel.execute(interaction, options); }
// //
if (commandName === 'remove-milestone') { console.log(`rm milestone command ran`); await milestoneCommands.removeMilestone.execute(interaction, options); }
if (commandName === 'view-milestones') { console.log(`list milestone command ran`); await milestoneCommands.viewMilestones.execute(interaction); }
// //
if (commandName === 'help') { console.log(`help command ran`); await communityCommands.help.execute(interaction); }

Expand Down
3 changes: 3 additions & 0 deletions commands/admin_commands/admin_commands.js
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,9 @@ module.exports = {
try {
// Convert duration from minutes to milliseconds
const durationMs = duration * 60 * 1000;

// if duration is greater than 40320 mintues, return with "too long"
if (duration > 40320) return interaction.reply('Duration cannot exceed 40320 minutes');

// Apply the timeout
await member.timeout(durationMs, reason);
Expand Down
120 changes: 88 additions & 32 deletions commands/milestone_commands/milestone_commands.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,60 +27,72 @@ module.exports = {

setupMilestone: {
execute: async (interaction) => {
// Check for Manage Roles permission
if (!interaction.member.permissions.has(PermissionsBitField.Flags.ManageRoles)) {
return interaction.reply({ content: 'You do not have permission to manage roles.', ephemeral: true });
}

// Get input options
const level = interaction.options.getInteger('level');
const role = interaction.options.getRole('role');
const guildId = interaction.guild.id;
const members = await interaction.guild.members.fetch();

for (const member of members.values()) {
// Fetch user data for each member
let userData = await getUserData(guildId, member.id);

if (userData) {
const userLevel = userData.level; // Retrieve the member's level from your leveling system
await giveRoleToUserIfNoneArrange(member, interaction.guild.id, userLevel);
}
}

try {
// Check for Manage Roles permission
if (!interaction.member.permissions.has(PermissionsBitField.Flags.ManageRoles)) {
return interaction.reply({ content: 'You do not have permission to manage roles.', ephemeral: true });
}

// Get input options
const level = interaction.options.getInteger('level');
const role = interaction.options.getRole('role');
const guildId = interaction.guild.id;
console.log(`Setting up milestone for guild ${guildId}, level ${level}, role ${role.id}`);

// Fetch all members in the guild
const members = await interaction.guild.members.fetch();
for (const member of members.values()) {
// Fetch user data for each member
let userData = await getUserData(guildId, member.id);

if (userData) {
const userLevel = userData.level; // Retrieve the member's level from your leveling system
await giveRoleToUserIfNoneArrange(member, interaction.guild.id, userLevel);
}
}

// Check if a milestone for this level already exists in the database
const existingMilestone = await MilestoneLevel.findAll({
console.log('Checking if milestone already exists...');
const existingMilestone = await MilestoneLevel.findOne({
where: {
guildId,
level,
reward: role.id
}
});

if (existingMilestone) { return interaction.reply({ content: `A milestone for level ${level} already exists.`, ephemeral: true }); }


if (existingMilestone) {
console.log('Milestone already exists for this level.');
return interaction.reply({ content: `A milestone for level ${level} already exists.`, ephemeral: true });
}

// Save milestone level to the database
console.log('Creating new milestone...');
await MilestoneLevel.create({
guildId,
level,
reward: role.id
});


// Create and send the embed
console.log('Milestone successfully created, preparing embed...');
const embed = new EmbedBuilder()
.setColor(0x008080)
.setTitle('Milestone Set')
.setDescription(`Milestone has been set!`)
.addFields(
{ name: 'Level', value: level },
{ name: 'Level', value: level.toString() },
{ name: 'Reward Role', value: `<@&${role.id}>` }
)
.setTimestamp();

return interaction.reply({ embeds: embed });
} catch (error) { return interaction.reply({ content: 'An error occurred while setting the milestone. Please try again later.', ephemeral: true }); }
return interaction.reply({ embeds: [embed] });
} catch (error) {
// Log the full error for debugging
console.error('Error in setupMilestone:', error);
return interaction.reply({ content: 'An error occurred while setting the milestone. Please try again later.', ephemeral: true });
}
}
},
},

// Remove Milestone level
removeMilestone: {
Expand Down Expand Up @@ -117,7 +129,51 @@ module.exports = {
return interaction.reply({ embeds: embed });
} catch (error) { return interaction.reply({ content: 'An error occurred while removing the milestone. Please try again later.', ephemeral: true }); }
}
}
},

viewMilestones: {
execute: async (interaction) => {
try {
// Get guildId from the interaction
const guildId = interaction.guild.id;

// Fetch all milestones for the server
const milestones = await MilestoneLevel.findAll({
where: {
guildId: guildId
},
order: [['level', 'ASC']] // Order by level ascending
});

// Check if there are any milestones set for the server
if (milestones.length === 0) {
return interaction.reply({ content: 'No milestone levels have been set for this server.', ephemeral: true });
}

// Create a list of milestone levels and their corresponding roles
const milestoneFields = milestones.map((milestone, index) => ({
name: `Milestone ${index + 1}`,
value: `**Level**: ${milestone.level}\n**Role**: <@&${milestone.reward}>`,
inline: true
}));

// Create an embed to display the milestones
const milestoneEmbed = new EmbedBuilder()
.setColor(0x008080) // Set your preferred color
.setTitle('Server Milestone Levels')
.setDescription('Here are all the milestone levels set for this server:')
.addFields(milestoneFields)
.setFooter({ text: `Requested by ${interaction.user.tag}` })
.setTimestamp();

// Send the embed with milestone details
return interaction.reply({ embeds: [milestoneEmbed] });
} catch (error) {
console.error('Failed to fetch milestone levels:', error);
return interaction.reply({ content: 'An error occurred while fetching milestone levels. Please try again later.', ephemeral: true });
}
}
}

// //
}
10 changes: 8 additions & 2 deletions models/models.js
Original file line number Diff line number Diff line change
Expand Up @@ -104,16 +104,22 @@ const MilestoneLevel = sequelize.define('MilestoneLevel', {
guildId: {
type: DataTypes.STRING,
allowNull: false,
primaryKey: true,
},
level: {
type: DataTypes.INTEGER,
allowNull: false,
},
reward: {
type: DataTypes.STRING, // e.g., role ID, badge name
type: DataTypes.STRING,
allowNull: false,
}
}, {
// Composite unique constraint
uniqueKeys: {
actions_unique: {
fields: ['guildId', 'level']
}
}
});

// Syncing the models with the database
Expand Down

0 comments on commit 0d3c838

Please sign in to comment.