aboutsummaryrefslogtreecommitdiff
path: root/src/commands/moulberry-bush/capes.ts
blob: fe18d89986f89a6d5deaf57db5a3d38bf8897509 (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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import { BushCommand, ButtonPaginator, DeleteButton, OptionalArgType, type BushMessage } from '#lib';
import { type MessageEmbedOptions } from 'discord.js';
import got from 'got';

export default class CapesCommand extends BushCommand {
	public constructor() {
		super('capes', {
			aliases: ['capes', 'cape'],
			category: "Moulberry's Bush",
			description: 'A command to see what a cape looks like.',
			usage: ['cape [cape]'],
			examples: ['capes', 'cape space'],
			args: [
				{
					id: 'cape',
					description: 'The cape to view.',
					type: 'string',
					prompt: 'What cape would you like to see?',
					retry: '{error} Choose a cape to see.',
					optional: true,
					slashType: 'STRING'
					// choices: client.consts.mappings.capes.map((v) => ({ name: v.name, value: v.name }))
				}
			],
			slash: true,
			clientPermissions: (m) => util.clientSendAndPermCheck(m, ['EMBED_LINKS'], true),
			userPermissions: []
		});
	}

	public override async exec(message: BushMessage, args: { cape: OptionalArgType<'string'> }) {
		const { tree: neuFileTree }: GithubTreeApi = await got
			.get('https://api.github.com/repos/Moulberry/NotEnoughUpdates/git/trees/master?recursive=1')
			.json();
		const capes = neuFileTree
			.map((f) => ({
				match: f.path.match(/src\/main\/resources\/assets\/notenoughupdates\/capes\/(?<name>\w+)_preview\.png/),
				f
			}))
			.filter((f) => f.match !== null);

		const capes1: { name: string; url: string; index: number; purchasable?: boolean }[] = [];
		client.consts.mappings.capes.forEach((mapCape) => {
			if (!capes.some((gitCape) => gitCape.match!.groups!.name === mapCape.name) && mapCape.custom) {
				capes1.push({
					name: mapCape.name,
					url: mapCape.custom,
					index: mapCape.index,
					purchasable: mapCape.purchasable
				});
			}
		});
		capes.forEach((gitCape) => {
			const mapCape = client.consts.mappings.capes.find((a) => a.name === gitCape.match!.groups!.name);
			const url = mapCape?.custom ?? `https://github.com/Moulberry/NotEnoughUpdates/raw/master/${gitCape.f.path}`;
			const index = mapCape?.index !== undefined ? mapCape.index : null;
			capes1.push({ name: gitCape.match!.groups!.name, url, index: index!, purchasable: mapCape?.purchasable });
		});

		const sortedCapes = capes1.sort((a, b) => {
			let aWeight: number | undefined = undefined,
				bWeight: number | undefined = undefined;
			aWeight ??= a?.index;
			bWeight ??= b?.index;

			if (aWeight !== undefined && bWeight !== undefined) {
				return aWeight - bWeight;
			} else if (aWeight === undefined) {
				return 1;
			} else if (bWeight === undefined) {
				return -1;
			}
			return 0;
		});

		if (args.cape) {
			const cape = sortedCapes.find((s_cape) => s_cape.name === args.cape);
			if (cape) {
				const embed = this.makeEmbed(cape);
				await DeleteButton.send(message, { embeds: [embed] });
			} else {
				await message.util.reply(`${util.emojis.error} Cannot find a cape called \`${args.cape}\`.`);
			}
		} else {
			const embeds: MessageEmbedOptions[] = sortedCapes.map(this.makeEmbed);
			await ButtonPaginator.send(message, embeds, null);
		}
	}

	private makeEmbed(cape: { name: string; url: string; index: number; purchasable?: boolean | undefined }): MessageEmbedOptions {
		return {
			title: `${cape.name} cape`,
			color: util.colors.default,
			timestamp: Date.now(),
			image: { url: cape.url },
			description: cape.purchasable ? ':money_with_wings: **purchasable** :money_with_wings:' : undefined
		};
	}
}

export interface GithubFile {
	path: string;
	mode: string;
	type: string;
	sha: string;
	size: number;
	url: string;
}

export interface GithubBlob {
	encoding: string;
	content: string;
	sha: string;
	node_id: string;
	url: string;
	size: number;
}

export interface GithubTreeApi {
	sha: string;
	url: string;
	tree: GithubFile[];
	truncated: boolean;
}