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';
}
}
|