jillo-bot/src/commands/color.ts

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
});
}
}
};