color command

This commit is contained in:
Jill 2022-07-16 18:33:30 +03:00
parent 4b3486e926
commit 3e23a78a31
3 changed files with 89 additions and 0 deletions

View File

@ -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",

View File

@ -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'}

69
src/commands/color.ts Normal file
View File

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