aboutsummaryrefslogtreecommitdiff
path: root/src/commands/info/color.ts
blob: 93dd439a845eef2680e7f229e28954759c67eacb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import { AllowedMentions, BushCommand, BushGuildMember, BushMessage, BushRole, BushSlashMessage } from '@lib';
import { Argument } from 'discord-akairo';
import { MessageEmbed, Role } from 'discord.js';
import { Constructor } from 'tinycolor2';

// eslint-disable-next-line @typescript-eslint/no-var-requires
const tinycolor: Constructor = require('tinycolor2'); // this is the only way I got it to work consistently
const isValidTinyColor = (_message: BushMessage, phase: string) => {
	// if the phase is a number it converts it to hex incase it could be representing a color in decimal
	const newPhase = Number.isNaN(phase) ? phase : `#${Number(phase).toString(16)}`;
	return tinycolor(newPhase).isValid() ? newPhase : null;
};

export default class ColorCommand extends BushCommand {
	public constructor() {
		super('color', {
			aliases: ['color'],
			category: 'info',
			description: {
				content: 'Find the color of a hex code, user, or role.',
				usage: 'color <color|role|user>',
				examples: ['color #0000FF']
			},
			args: [
				{
					id: 'color',
					customType: Argument.union(isValidTinyColor, 'role', 'member'),
					prompt: {
						start: 'What color code, role, or user would you like to find the color of?',
						retry: '{error} Choose a valid color, role, or member.'
					}
				}
			],
			channel: 'guild',
			clientPermissions: ['EMBED_LINKS', 'SEND_MESSAGES']
		});
	}

	public removePrefixAndParenthesis(color: string): string {
		return color.substr(4, color.length - 5);
	}

	public override async exec(
		message: BushMessage | BushSlashMessage,
		args: { color: string | BushRole | BushGuildMember }
	): Promise<unknown> {
		const color =
			typeof args.color === 'string'
				? tinycolor(args.color)
				: args.color instanceof Role
				? tinycolor(args.color.hexColor)
				: tinycolor(args.color.displayHexColor);

		if (args.color instanceof Role && args.color.hexColor === '#000000') {
			return await message.util.reply({
				content: `${util.emojis.error} <@&${args.color.id}> does not have a color.`,
				allowedMentions: AllowedMentions.none()
			});
		}

		const embed = new MessageEmbed()
			.addField('» Hexadecimal', color.toHexString())
			.addField('» Decimal', `${parseInt(color.toHex(), 16)}`)
			.addField('» HSL', this.removePrefixAndParenthesis(color.toHslString()))
			.addField('» RGB', this.removePrefixAndParenthesis(color.toRgbString()))
			.setColor(color.toHex() as `#${string}`);

		return await message.util.reply({ embeds: [embed] });
	}
}