-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmuteHandler.js
127 lines (109 loc) · 3.93 KB
/
muteHandler.js
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
125
126
127
const EFTClient = require("./eftClient")
const { MessageEmbed, Message } = require("discord.js")
const { TextChannel } = require("discord.js")
const { GuildMember, GuildMemberRoleManager } = require("discord.js")
const { DateTime } = require("luxon")
/**
*
* @class MuteHandler
*/
class MuteHandler {
/**
* Creates an instance of MuteHandler.
* @param {EFTClient} client
* @memberof MuteHandler
*/
constructor(client) {
this.client = client
this.dbHandler = client.databaseHandler
this.roleId = client.configServer.MutedRole
this.mutedMembers = {}
client.addListener("ready", async () => {
let mutes = await this.dbHandler.getMutes()
for (const mute of mutes)
{
this.mutedMembers[mute.member_id] = {
memberId: mute.member_id,
issuerId: mute.issuer_id,
duration: mute.duration,
endDate: mute.end_date
}
}
console.log(`Loaded ${mutes.length} existing mutes in the database.`)
this.muteUpdateTimer = setInterval(() => {
for (const mute of Object.values(this.mutedMembers))
{
let endDate = DateTime.fromJSDate(mute.endDate)
if (DateTime.local() >= endDate)
{
this.unmuteMember(mute.memberId)
console.log(`${mute.memberId} has been automatically unmuted.`)
}
}
}, 1000 * 60)
})
client.addListener("message", async (message) => {
let member = message.member
// This happens apparently. I think because of DMs? TODO: test
if (member == null) return
let isMuted = this.isMemberMuted(member.id)
if (isMuted && message.deletable && !message.deleted)
{
await message.delete()
console.log(`Deleted message from muted member ${member.id}`)
}
})
}
/**
* Check if a member is muted
*
* @param {string} memberId The id of the member to check
* @returns {boolean}
* @memberof MuteHandler
*/
isMemberMuted(memberId)
{
return this.mutedMembers[memberId] !== undefined
}
/**
* Mute a member with a duration in minutes
*
* @param {string} memberId The id of the member being muted
* @param {number} duration The duration of the mute in minutes
* @param {GuildMember} issuerId The id of the member issuing the mute
* @memberof MuteHandler
*/
async muteMember(memberId, duration, issuerId)
{
let endDate = DateTime.local().plus({minutes: duration}).toJSDate()
await this.dbHandler.addMute(memberId, issuerId, endDate)
this.mutedMembers[memberId] = {
memberId: memberId,
issuerId: issuerId,
duration: duration,
endDate: endDate
}
let member = await this.client.getGuild().members.fetch({
user: memberId
}).catch((err) => console.error("Failed to fetch member to add muted role."))
if (member == null || member.roles.cache.has(this.roleId)) return
await member.roles.add(this.roleId)
}
/**
* Unmute a member
*
* @param {GuildMember} memberId The member to unmute
* @memberof MuteHandler
*/
async unmuteMember(memberId)
{
await this.dbHandler.removeMute(memberId)
delete this.mutedMembers[memberId]
let member = await this.client.getGuild().members.fetch({
user: memberId
}).catch((err) => console.error("Failed to fetch member to remove muted role."))
if (member == null || !member.roles.cache.has(this.roleId)) return
await member.roles.remove(this.roleId)
}
}
module.exports = MuteHandler