Files
SupportBot/Addons/SupportBot Sanctions/sanction.js
T
2026-07-26 20:33:00 +01:00

157 lines
6.6 KiB
JavaScript

const Discord = require('discord.js');
const fs = require('fs');
const yaml = require('js-yaml');
const { Command } = require('../Structures/Addon.js');
const supportbot = yaml.load(fs.readFileSync('./Configs/supportbot.yml', 'utf8'));
const sactionaddon = yaml.load(fs.readFileSync('./Addons/Configs/sactionaddon.yml', 'utf8'));
module.exports = new Command({
name: 'sanction',
description: 'Sanction a user (kick, ban, or timeout).',
options: [
{
name: 'action',
type: 3,
description: 'The action to perform (kick, ban, timeout)',
required: true,
choices: [
{ name: 'Kick', value: 'kick' },
{ name: 'Ban', value: 'ban' },
{ name: 'Timeout', value: 'timeout' }
]
},
{
name: 'user',
type: 6,
description: 'The user to sanction',
required: true
},
{
name: 'reason',
type: 3,
description: 'Reason for the sanction',
required: false
},
{
name: 'duration',
type: 3,
description: 'Duration of the timeout (e.g., "10m", "2h", "1d")',
required: false
}
],
permissions: [],
async run(interaction) {
const action = interaction.options.getString('action');
const user = interaction.options.getUser('user');
const reason = interaction.options.getString('reason') || 'No reason provided';
const duration = interaction.options.getString('duration');
const staffRoleId = supportbot.Roles.StaffMember.Staff;
const member = interaction.guild.members.cache.get(interaction.user.id);
if (!member || !member.roles.cache.has(staffRoleId)) {
return interaction.reply({ content: 'You do not have permission to use this command.', ephemeral: true });
}
const targetMember = interaction.guild.members.cache.get(user.id);
if (!targetMember) {
return interaction.reply({ content: 'The user is not a member of this guild.', ephemeral: true });
}
try {
let actionMessage = '';
let logEmbed = new Discord.EmbedBuilder().setColor(supportbot.Embed.Colours.General);
switch (action) {
case 'kick':
if (!targetMember.kickable) return interaction.reply({ content: 'I cannot kick this user.', ephemeral: true });
await targetMember.kick(reason);
actionMessage = `Successfully kicked ${user.tag} for: ${reason}`;
logEmbed
.setTitle('User Kicked')
.setDescription(`**User:** ${user.tag}\n**Reason:** ${reason}`)
.addFields(
{ name: 'Action By', value: interaction.user.tag, inline: true },
{ name: 'Action', value: 'Kick', inline: true },
{ name: 'Timestamp', value: new Date().toISOString(), inline: true }
);
break;
case 'ban':
if (!targetMember.bannable) return interaction.reply({ content: 'I cannot ban this user.', ephemeral: true });
await targetMember.ban({ reason });
actionMessage = `Successfully banned ${user.tag} for: ${reason}`;
logEmbed
.setTitle('User Banned')
.setDescription(`**User:** ${user.tag}\n**Reason:** ${reason}`)
.addFields(
{ name: 'Action By', value: interaction.user.tag, inline: true },
{ name: 'Action', value: 'Ban', inline: true },
{ name: 'Timestamp', value: new Date().toISOString(), inline: true }
);
break;
case 'timeout':
// Ensure a valid duration is provided
if (!duration) return interaction.reply({ content: 'You must specify a duration for the timeout.', ephemeral: true });
// Convert duration to milliseconds
const parsedDuration = ms(duration);
if (!parsedDuration) return interaction.reply({ content: 'Invalid duration format. Use "1s", "5m", "2h", or "1d".', ephemeral: true });
// Apply the timeout
await targetMember.timeout(parsedDuration, reason);
actionMessage = `Successfully timed out ${user.tag} for ${duration} with reason: ${reason}`;
logEmbed
.setTitle('User Timed Out')
.setDescription(`**User:** ${user.tag}\n**Duration:** ${duration}\n**Reason:** ${reason}`)
.addFields(
{ name: 'Action By', value: interaction.user.tag, inline: true },
{ name: 'Action', value: 'Timeout', inline: true },
{ name: 'Timestamp', value: new Date().toISOString(), inline: true }
);
break;
default:
return interaction.reply({ content: 'Invalid action specified.', ephemeral: true });
}
// Send the action message
interaction.reply({ content: actionMessage, ephemeral: true });
// Log the action to the logging channel
const logChannel = interaction.guild.channels.cache.get(sactionaddon.LogChannel);
if (logChannel) {
logChannel.send({ embeds: [logEmbed] });
} else {
console.error('Logging channel not found.');
}
} catch (error) {
console.error('Error executing sanction command:', error);
interaction.reply({ content: 'An error occurred while executing the command.', ephemeral: true });
}
},
});
/**
* Converts a time duration string to milliseconds.
* @param {string} duration - The duration string (e.g., "10m", "2h", "1d").
* @returns {number} - The duration in milliseconds.
*/
function ms(duration) {
const regex = /^(\d+)([smhd])$/;
const match = regex.exec(duration);
if (!match) return null;
const value = parseInt(match[1], 10);
const unit = match[2];
switch (unit) {
case 's': return value * 1000; // seconds
case 'm': return value * 60 * 1000; // minutes
case 'h': return value * 60 * 60 * 1000; // hours
case 'd': return value * 24 * 60 * 60 * 1000; // days
default: return null;
}
}