color command
This commit is contained in:
parent
4b3486e926
commit
3e23a78a31
|
@ -15,9 +15,11 @@
|
|||
"@discordjs/builders": "^0.13.0",
|
||||
"@discordjs/rest": "^0.4.1",
|
||||
"discord.js": "^13.8.0",
|
||||
"parse-color": "^1.0.0",
|
||||
"random-seed": "^0.3.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/parse-color": "^1.0.1",
|
||||
"@typescript-eslint/eslint-plugin": "^5.27.1",
|
||||
"@typescript-eslint/parser": "^5.27.1",
|
||||
"eslint": "^8.17.0",
|
||||
|
|
|
@ -3,10 +3,12 @@ lockfileVersion: 5.4
|
|||
specifiers:
|
||||
'@discordjs/builders': ^0.13.0
|
||||
'@discordjs/rest': ^0.4.1
|
||||
'@types/parse-color': ^1.0.1
|
||||
'@typescript-eslint/eslint-plugin': ^5.27.1
|
||||
'@typescript-eslint/parser': ^5.27.1
|
||||
discord.js: ^13.8.0
|
||||
eslint: ^8.17.0
|
||||
parse-color: ^1.0.0
|
||||
random-seed: ^0.3.0
|
||||
typescript: 4.8.0-dev.20220606
|
||||
|
||||
|
@ -14,9 +16,11 @@ dependencies:
|
|||
'@discordjs/builders': 0.13.0
|
||||
'@discordjs/rest': 0.4.1
|
||||
discord.js: 13.8.0
|
||||
parse-color: 1.0.0
|
||||
random-seed: 0.3.0
|
||||
|
||||
devDependencies:
|
||||
'@types/parse-color': 1.0.1
|
||||
'@typescript-eslint/eslint-plugin': 5.27.1_555veff7pbs3zkovuk7bd6t3v4
|
||||
'@typescript-eslint/parser': 5.27.1_tk6tc2atvak5hdwmpl7y3anzei
|
||||
eslint: 8.17.0
|
||||
|
@ -167,6 +171,10 @@ packages:
|
|||
resolution: {integrity: sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==}
|
||||
dev: false
|
||||
|
||||
/@types/parse-color/1.0.1:
|
||||
resolution: {integrity: sha512-IEWhURMWTsse+MWUsebpmHw1yS0hI/yFxO4kY12Rh0MzW/AUbuk1cc6GlWUCRTEYtXuW6M0rP8Q8IDZY/YGX0Q==}
|
||||
dev: true
|
||||
|
||||
/@types/ws/8.5.3:
|
||||
resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==}
|
||||
dependencies:
|
||||
|
@ -378,6 +386,10 @@ packages:
|
|||
supports-color: 7.2.0
|
||||
dev: true
|
||||
|
||||
/color-convert/0.5.3:
|
||||
resolution: {integrity: sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==}
|
||||
dev: false
|
||||
|
||||
/color-convert/2.0.1:
|
||||
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
|
||||
engines: {node: '>=7.0.0'}
|
||||
|
@ -891,6 +903,12 @@ packages:
|
|||
callsites: 3.1.0
|
||||
dev: true
|
||||
|
||||
/parse-color/1.0.0:
|
||||
resolution: {integrity: sha512-fuDHYgFHJGbpGMgw9skY/bj3HL/Jrn4l/5rSspy00DoT4RyLnDcRvPxdZ+r6OFwIsgAuhDh4I09tAId4mI12bw==}
|
||||
dependencies:
|
||||
color-convert: 0.5.3
|
||||
dev: false
|
||||
|
||||
/path-is-absolute/1.0.1:
|
||||
resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
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
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
Loading…
Reference in New Issue