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