Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 3 additions & 7 deletions commands/admin/ban.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const { SlashCommandBuilder, EmbedBuilder, PermissionFlagsBits } = require('discord.js');
const { embedColor, adminRole } = require('../../config/botConfig.json');
const { safeErrorReply } = require('../../utils/safeReply');

module.exports = {
data: new SlashCommandBuilder()
Expand Down Expand Up @@ -70,13 +71,8 @@ module.exports = {
await interaction.reply({ embeds: [successEmbed] });

} catch (error) {
client.logger?.error(`❌ Ban Command Error: ${error.message}`);
const errorEmbed = new EmbedBuilder()
.setColor('Red')
.setTitle('❌ Error Banning User')
.setDescription(`An unexpected error occurred while trying to ban the user.`);

await interaction.reply({ embeds: [errorEmbed], ephemeral: true });
client.logger?.error(`❌ Ban Command Error: ${error.stack || error.message}`);
await safeErrorReply(interaction, '❌ Error Banning User', 'An unexpected error occurred while trying to ban the user.');
}
}
};
10 changes: 3 additions & 7 deletions commands/admin/clear.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const { SlashCommandBuilder, EmbedBuilder, PermissionFlagsBits } = require('discord.js');
const { embedColor, adminRole } = require('../../config/botConfig.json');
const { safeErrorReply } = require('../../utils/safeReply');

module.exports = {
data: new SlashCommandBuilder()
Expand Down Expand Up @@ -44,13 +45,8 @@ module.exports = {
await interaction.reply({ embeds: [successEmbed], ephemeral: true });

} catch (error) {
client.logger?.error(`❌ Clear Command Error: ${error.message}`);
const errorEmbed = new EmbedBuilder()
.setColor('Red')
.setTitle('❌ Deletion Failed')
.setDescription('An error occurred while trying to delete messages.');

await interaction.reply({ embeds: [errorEmbed], ephemeral: true });
client.logger?.error(`❌ Clear Command Error: ${error.stack || error.message}`);
await safeErrorReply(interaction, '❌ Deletion Failed', 'An error occurred while trying to delete messages.');
}
}
};
10 changes: 3 additions & 7 deletions commands/admin/kick.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const { SlashCommandBuilder, EmbedBuilder, PermissionFlagsBits } = require('discord.js');
const { embedColor, adminRole } = require('../../config/botConfig.json');
const { safeErrorReply } = require('../../utils/safeReply');

module.exports = {
data: new SlashCommandBuilder()
Expand Down Expand Up @@ -63,13 +64,8 @@ module.exports = {
await interaction.reply({ embeds: [successEmbed] });

} catch (error) {
client.logger?.error(`❌ Kick Command Error: ${error.message}`);
const errorEmbed = new EmbedBuilder()
.setColor('Red')
.setTitle('❌ Error Kicking User')
.setDescription('An unexpected error occurred while trying to kick the user.');

await interaction.reply({ embeds: [errorEmbed], ephemeral: true });
client.logger?.error(`❌ Kick Command Error: ${error.stack || error.message}`);
await safeErrorReply(interaction, '❌ Error Kicking User', 'An unexpected error occurred while trying to kick the user.');
}
}
};
9 changes: 3 additions & 6 deletions commands/admin/mute.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const { SlashCommandBuilder, EmbedBuilder, PermissionFlagsBits } = require('discord.js');
const { embedColor, adminRole } = require('../../config/botConfig.json');
const { safeErrorReply } = require('../../utils/safeReply');

module.exports = {
data: new SlashCommandBuilder()
Expand Down Expand Up @@ -87,12 +88,8 @@ module.exports = {
await interaction.reply({ embeds: [successEmbed] });

} catch (error) {
client.logger?.error(`❌ Mute Command Error: ${error.message}`);
const errorEmbed = new EmbedBuilder()
.setColor('Red')
.setTitle('❌ Error Muting User')
.setDescription('An unexpected error occurred while trying to mute the user.');
await interaction.reply({ embeds: [errorEmbed], ephemeral: true });
client.logger?.error(`❌ Mute Command Error: ${error.stack || error.message}`);
await safeErrorReply(interaction, '❌ Error Muting User', 'An unexpected error occurred while trying to mute the user.');
}
}
};
26 changes: 15 additions & 11 deletions commands/fun/coinflip.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,23 @@ module.exports = {


setTimeout(async () => {
const result = Math.random() < 0.5 ? 'Heads' : 'Tails';
const resultEmoji = result === 'Heads' ? '🙂' : '🐍';
try {
const result = Math.random() < 0.5 ? 'Heads' : 'Tails';
const resultEmoji = result === 'Heads' ? '🙂' : '🐍';

const resultEmbed = new EmbedBuilder()
.setColor(embedColor)
.setTitle('🪙 Coin Flip Result')
.addFields(
{ name: 'Result', value: `**${result}** ${resultEmoji}`, inline: true },
{ name: 'Requested by', value: interaction.user.tag, inline: true }
)
.setTimestamp();
const resultEmbed = new EmbedBuilder()
.setColor(embedColor)
.setTitle('🪙 Coin Flip Result')
.addFields(
{ name: 'Result', value: `**${result}** ${resultEmoji}`, inline: true },
{ name: 'Requested by', value: interaction.user.tag, inline: true }
)
.setTimestamp();

await interaction.editReply({ embeds: [resultEmbed] });
await interaction.editReply({ embeds: [resultEmbed] });
} catch (error) {
client.logger?.error(`❌ Coinflip editReply failed: ${error.message}`);
}
}, 1500);
}
};
26 changes: 15 additions & 11 deletions commands/fun/roll.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,18 +21,22 @@ module.exports = {
return interaction.reply({ embeds: [errorEmbed], ephemeral: true });
}

const result = Math.floor(Math.random() * sides) + 1;
try {
const result = Math.floor(Math.random() * sides) + 1;

const embed = new EmbedBuilder()
.setColor(embedColor)
.setTitle('🎲 Dice Roll')
.addFields(
{ name: 'Sides', value: `${sides}`, inline: true },
{ name: 'Result', value: `**${result}**`, inline: true }
)
.setFooter({ text: `Rolled by ${interaction.user.username}`, iconURL: interaction.user.displayAvatarURL() })
.setTimestamp();
const embed = new EmbedBuilder()
.setColor(embedColor)
.setTitle('🎲 Dice Roll')
.addFields(
{ name: 'Sides', value: `${sides}`, inline: true },
{ name: 'Result', value: `**${result}**`, inline: true }
)
.setFooter({ text: `Rolled by ${interaction.user.username}`, iconURL: interaction.user.displayAvatarURL() })
.setTimestamp();

await interaction.reply({ embeds: [embed] });
await interaction.reply({ embeds: [embed] });
} catch (error) {
client.logger?.error(`❌ Roll Command Error: ${error.stack || error.message}`);
}
}
};
12 changes: 3 additions & 9 deletions commands/moderation/lock.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const { SlashCommandBuilder, EmbedBuilder, PermissionFlagsBits } = require('discord.js');
const { embedColor, adminRole } = require('../../config/botConfig.json');
const { safeErrorReply } = require('../../utils/safeReply');

module.exports = {
data: new SlashCommandBuilder()
Expand Down Expand Up @@ -31,15 +32,8 @@ module.exports = {

await interaction.reply({ embeds: [successEmbed] });
} catch (error) {
client.logger?.error(`❌ Lock Command Error: ${error.message}`);

const errorEmbed = new EmbedBuilder()
.setColor('Red')
.setTitle('❌ Error Locking Channel')
.setDescription('An error occurred while trying to lock this channel.')
.setTimestamp();

await interaction.reply({ embeds: [errorEmbed], ephemeral: true });
client.logger?.error(`❌ Lock Command Error: ${error.stack || error.message}`);
await safeErrorReply(interaction, '❌ Error Locking Channel', 'An error occurred while trying to lock this channel.');
}
}
};
12 changes: 3 additions & 9 deletions commands/moderation/slowmode.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const { SlashCommandBuilder, EmbedBuilder, PermissionFlagsBits } = require('discord.js');
const { embedColor, adminRole } = require('../../config/botConfig.json');
const { safeErrorReply } = require('../../utils/safeReply');

module.exports = {
data: new SlashCommandBuilder()
Expand Down Expand Up @@ -47,15 +48,8 @@ module.exports = {

await interaction.reply({ embeds: [successEmbed] });
} catch (error) {
client.logger?.error(`❌ Slowmode Command Error: ${error.message}`);

const errorEmbed = new EmbedBuilder()
.setColor('Red')
.setTitle('❌ Error Setting Slowmode')
.setDescription('An error occurred while trying to set the slowmode for this channel.')
.setTimestamp();

await interaction.reply({ embeds: [errorEmbed], ephemeral: true });
client.logger?.error(`❌ Slowmode Command Error: ${error.stack || error.message}`);
await safeErrorReply(interaction, '❌ Error Setting Slowmode', 'An error occurred while trying to set the slowmode for this channel.');
}
}
};
20 changes: 13 additions & 7 deletions commands/utility/Good.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
const { SlashCommandBuilder, EmbedBuilder, PermissionFlagsBits } = require('discord.js');
const { adminRole } = require('../../config/botConfig.json');
const goodMode = require('../../storage/goodMode');
const { safeErrorReply } = require('../../utils/safeReply');

module.exports = {
data: new SlashCommandBuilder()
Expand All @@ -13,7 +14,7 @@ module.exports = {
)
.setDefaultMemberPermissions(PermissionFlagsBits.Administrator),

async execute(interaction) {
async execute(interaction, client) {
if (!interaction.member.roles.cache.has(adminRole)) {
return interaction.reply({
embeds: [
Expand All @@ -25,13 +26,18 @@ module.exports = {
});
}

const state = interaction.options.getBoolean('state');
goodMode.setGoodMode(state);
try {
const state = interaction.options.getBoolean('state');
goodMode.setGoodMode(state);

const embed = new EmbedBuilder()
.setColor(state ? 'Green' : 'Orange')
.setDescription(state ? '✅ Good mode filter is now **ENABLED**.' : '⚠️ Good mode filter is now **DISABLED**.');
const embed = new EmbedBuilder()
.setColor(state ? 'Green' : 'Orange')
.setDescription(state ? '✅ Good mode filter is now **ENABLED**.' : '⚠️ Good mode filter is now **DISABLED**.');

await interaction.reply({ embeds: [embed] });
await interaction.reply({ embeds: [embed] });
} catch (error) {
client.logger?.error(`❌ Good Command Error: ${error.stack || error.message}`);
await safeErrorReply(interaction, '❌ Error', 'An error occurred while toggling good mode.');
}
}
};
24 changes: 15 additions & 9 deletions commands/utility/avatar.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,18 +54,24 @@ module.exports = {
});

collector.on('collect', async i => {
const size = parseInt(i.values[0]);
const newAvatarUrl = user.displayAvatarURL({ dynamic: true, size });

const newEmbed = EmbedBuilder.from(embed)
.setImage(newAvatarUrl)
.setDescription(`[Download PNG](${user.displayAvatarURL({ dynamic: false, size, format: 'png' })}) | [Download WEBP](${user.displayAvatarURL({ dynamic: false, size, format: 'webp' })})${avatarUrlGIF.endsWith('.gif') ? ` | [Download GIF](${user.displayAvatarURL({ dynamic: true, size, format: 'gif' })})` : ''}`);

await i.update({ embeds: [newEmbed] });
try {
const size = parseInt(i.values[0]);
const newAvatarUrl = user.displayAvatarURL({ dynamic: true, size });

const newEmbed = EmbedBuilder.from(embed)
.setImage(newAvatarUrl)
.setDescription(`[Download PNG](${user.displayAvatarURL({ dynamic: false, size, format: 'png' })}) | [Download WEBP](${user.displayAvatarURL({ dynamic: false, size, format: 'webp' })})${avatarUrlGIF.endsWith('.gif') ? ` | [Download GIF](${user.displayAvatarURL({ dynamic: true, size, format: 'gif' })})` : ''}`);

await i.update({ embeds: [newEmbed] });
} catch (error) {
client.logger?.error(`❌ Avatar select menu error: ${error.message}`);
}
});

collector.on('end', () => {
interaction.editReply({ components: [] }).catch(() => {});
interaction.editReply({ components: [] }).catch(err => {
client.logger?.warn(`Avatar collector cleanup failed: ${err.message}`);
});
});
}
};
56 changes: 29 additions & 27 deletions commands/utility/ping.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,32 +7,34 @@ module.exports = {
.setDescription('Check the bot\'s response time'),

async execute(interaction, client) {
await interaction.deferReply();


const sentTimestamp = Date.now();
const latency = sentTimestamp - interaction.createdTimestamp;
const apiLatency = Math.round(client.ws.ping);


const getColor = (ms) => {
if (ms < 100) return '#00FF00';
if (ms < 200) return '#FFFF00';
return '#FF0000';
};

const embed = new EmbedBuilder()
.setColor(embedColor)
.setTitle('🏓 Pong!')
.addFields(
{ name: '🤖 Bot Latency', value: `\`${latency} ms\``, inline: true },
{ name: '🌐 API Latency', value: `\`${apiLatency} ms\``, inline: true }
)
.setTimestamp()
.setFooter({ text: `Requested by ${interaction.user.tag}`, iconURL: interaction.user.displayAvatarURL() });

embed.setColor(getColor(latency));

await interaction.editReply({ embeds: [embed] });
try {
await interaction.deferReply();

const sentTimestamp = Date.now();
const latency = sentTimestamp - interaction.createdTimestamp;
const apiLatency = Math.round(client.ws.ping);

const getColor = (ms) => {
if (ms < 100) return '#00FF00';
if (ms < 200) return '#FFFF00';
return '#FF0000';
};

const embed = new EmbedBuilder()
.setColor(embedColor)
.setTitle('🏓 Pong!')
.addFields(
{ name: '🤖 Bot Latency', value: `\`${latency} ms\``, inline: true },
{ name: '🌐 API Latency', value: `\`${apiLatency} ms\``, inline: true }
)
.setTimestamp()
.setFooter({ text: `Requested by ${interaction.user.tag}`, iconURL: interaction.user.displayAvatarURL() });

embed.setColor(getColor(latency));

await interaction.editReply({ embeds: [embed] });
} catch (error) {
client.logger?.error(`❌ Ping Command Error: ${error.stack || error.message}`);
}
}
};
Loading
Loading