aboutsummaryrefslogtreecommitdiff
path: root/src/lib/extensions/discord.js/BushGuild.ts
blob: efc780df90e70479b9f028fbc5f053c80315aaad (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
import { Guild } from 'discord.js';
import { RawGuildData } from 'discord.js/typings/rawDataTypes';
import { Guild as GuildDB, GuildFeatures, GuildModel } from '../../models/Guild';
import { ModLogType } from '../../models/ModLog';
import { BushClient, BushUserResolvable } from '../discord-akairo/BushClient';
import { BushGuildMember } from './BushGuildMember';
import { BushGuildMemberManager } from './BushGuildMemberManager';
import { BushUser } from './BushUser';

export class BushGuild extends Guild {
	public declare readonly client: BushClient;
	public declare readonly me: BushGuildMember | null;
	public declare members: BushGuildMemberManager;
	public constructor(client: BushClient, data: RawGuildData) {
		super(client, data);
	}

	public async hasFeature(feature: GuildFeatures): Promise<boolean> {
		const features = await this.getSetting('enabledFeatures');
		return features.includes(feature);
	}

	public async getSetting<K extends keyof GuildModel>(setting: K): Promise<GuildModel[K]> {
		return (
			client.cache.guilds.get(this.id)?.[setting] ??
			((await GuildDB.findByPk(this.id)) ?? GuildDB.build({ id: this.id }))[setting]
		);
	}

	public async setSetting<K extends keyof GuildModel>(setting: K, value: GuildDB[K]): Promise<GuildDB> {
		const row = (await GuildDB.findByPk(this.id)) ?? GuildDB.build({ id: this.id });
		row[setting] = value;
		client.cache.guilds.set(this.id, row.toJSON() as GuildDB);
		return await row.save();
	}

	public async unban(options: {
		user: BushUserResolvable | BushUser;
		reason?: string;
		moderator?: BushUserResolvable;
	}): Promise<
		| 'success'
		| 'missing permissions'
		| 'user not banned'
		| 'error unbanning'
		| 'error creating modlog entry'
		| 'error removing ban entry'
	> {
		const user = client.users.resolveId(options.user)!;
		const moderator = client.users.cache.get(client.users.resolveId(options.moderator!)!)!;

		const bans = await this.bans.fetch();

		let notBanned = false;
		if (!bans.has(user)) notBanned = true;

		const unbanSuccess = await this.bans
			// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
			.remove(user, `${moderator.tag} | ${options.reason || 'No reason provided.'}`)
			.catch((e) => {
				if (e?.code === 'UNKNOWN_BAN') {
					notBanned = true;
					return true;
				} else return false;
			});

		if (!unbanSuccess) return 'error unbanning';

		// add modlog entry
		const modlog = await util
			.createModLogEntry({
				type: ModLogType.UNBAN,
				user,
				moderator: moderator.id,
				reason: options.reason,
				guild: this
			})
			.catch(() => null);
		if (!modlog) return 'error creating modlog entry';

		// remove punishment entry
		const removePunishmentEntrySuccess = await util
			.removePunishmentEntry({
				type: 'ban',
				user,
				guild: this
			})
			.catch(() => null);
		if (!removePunishmentEntrySuccess) return 'error removing ban entry';

		const userObject = client.users.cache.get(user);

		// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
		userObject?.send(`You have been unbanned from **${this}** for **${options.reason || 'No reason provided'}**.`);

		if (notBanned) return 'user not banned';
		return 'success';
	}
}