aboutsummaryrefslogtreecommitdiff
path: root/src/listeners/member-custom/levelUpdate.ts
blob: 53734fdd0a56082380b24c933d42eaac1c76c641 (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
import { BotListener, Emitter, format, TanzaniteEvent, type BotClientEvents } from '#lib';
import assert from 'assert/strict';
import { type TextChannel } from 'discord.js';

type Args = BotClientEvents[TanzaniteEvent.LevelUpdate];

export default class LevelUpdateListener extends BotListener {
	public constructor() {
		super(TanzaniteEvent.LevelUpdate, {
			emitter: Emitter.Client,
			event: TanzaniteEvent.LevelUpdate
		});
	}

	public async exec(...[member, _oldLevel, newLevel, _currentXp, message]: Args) {
		void this.sendLevelUpMessages(member, newLevel, message);
		void this.assignLevelRoles(member, newLevel, message);
	}

	private async sendLevelUpMessages(member: Args[0], newLevel: Args[2], message: Args[4]) {
		assert(message.inGuild());
		if (!(await message.guild.hasFeature('sendLevelUpMessages'))) return;

		const channel = ((await message.guild.channels
			.fetch((await message.guild.getSetting('levelUpChannel')) ?? message.channelId)
			.catch(() => null)) ?? message.channel) as TextChannel;

		const success = await channel
			.send(`${format.input(member.user.tag)} leveled up to level ${format.input(`${newLevel}`)}.`)
			.catch(() => null);

		if (!success)
			await message.guild.error(
				'LevelUpdate',
				`Could not send level up message for ${member.user.tag} in <#${message.channel.id}>.`
			);
	}

	private async assignLevelRoles(member: Args[0], newLevel: Args[2], message: Args[4]) {
		assert(message.inGuild());
		const levelRoles = await message.guild.getSetting('levelRoles');

		if (!Object.keys(levelRoles).length) return;

		const promises = [];
		for (let i = 1; i <= newLevel; i++) {
			if (levelRoles[i]) {
				if (member.roles.cache.has(levelRoles[i])) continue;
				else promises.push(member.roles.add(levelRoles[i], `[LevelRoles] Role given for reaching level ${i}`));
			}
		}
		try {
			if (promises.length) await Promise.all(promises);
		} catch (e: any) {
			await member.guild.error(
				'LevelUpdate',
				`There was an error adding level roles to ${member.user.tag} upon reaching to level ${newLevel}.\n${
					'message' in e ? e.message : e
				}`
			);
		}
	}
}