69 lines
2.0 KiB
TypeScript
69 lines
2.0 KiB
TypeScript
import { SlashCommandBuilder } from '@discordjs/builders';
|
|
import { CommandInteraction, Guild, GuildMember } from 'discord.js';
|
|
import { default as parseColor } from 'parse-color';
|
|
|
|
function isColorRole(name: string) {
|
|
return name.startsWith('#') && name.length === 7;
|
|
}
|
|
|
|
function removeAllColorRoles(member: GuildMember) {
|
|
return Promise.all(member.roles.cache.map(role => {
|
|
if (isColorRole(role.name)) {
|
|
return member.roles.remove(role);
|
|
}
|
|
}));
|
|
}
|
|
|
|
function garbageCollectRoles(guild: Guild) {
|
|
return Promise.all(guild.roles.cache.map(role => {
|
|
if (isColorRole(role.name)) {
|
|
const members = role.members;
|
|
if (members.size === 0) {
|
|
return role.delete();
|
|
}
|
|
}
|
|
}));
|
|
}
|
|
|
|
module.exports = {
|
|
data: new SlashCommandBuilder()
|
|
.setName('color')
|
|
.setDescription('Change your role color.')
|
|
.addStringOption((option) => option.setName('color').setDescription('Color to set. Must be a parsable HTML color. Examples include: #ff0000, rgb(50, 0, 0), red, etc.')),
|
|
|
|
execute: async (interaction: CommandInteraction, member: GuildMember) => {
|
|
const color = interaction.options.getString('color');
|
|
|
|
if (color) {
|
|
const parsed = parseColor(color);
|
|
if (!parsed.hex) {
|
|
interaction.reply({
|
|
content: 'Invalid color. Try an HTML color like `#ff0000`, `rgb(50, 0, 0)`, `red`, etc.',
|
|
ephemeral: true,
|
|
});
|
|
return;
|
|
}
|
|
await removeAllColorRoles(member);
|
|
|
|
const role = member.guild.roles.cache.find(role => role.name === parsed.hex) || await member.guild.roles.create({
|
|
name: parsed.hex,
|
|
color: parsed.rgb,
|
|
hoist: false,
|
|
mentionable: false,
|
|
permissions: 0n,
|
|
});
|
|
await member.roles.add(role);
|
|
//await garbageCollectRoles(member.guild);
|
|
interaction.reply({
|
|
content: 'Your color has been set.',
|
|
ephemeral: true
|
|
});
|
|
} else {
|
|
await removeAllColorRoles(member);
|
|
interaction.reply({
|
|
content: 'Removed all colors.',
|
|
ephemeral: true
|
|
});
|
|
}
|
|
}
|
|
}; |