Skip to content

Commit 00402d7

Browse files
authored
Merge pull request #35 from the-programmers-hangout/fix/muted-user-leaving
fix: user leaving guild with active mute didn't remove punishment
2 parents bbab2d9 + 6350286 commit 00402d7

File tree

4 files changed

+36
-32
lines changed

4 files changed

+36
-32
lines changed

src/main/kotlin/me/ddivad/judgebot/commands/MuteCommands.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ fun createMuteCommands(muteService: MuteService) = commands("Mute") {
4040
return@execute
4141
}
4242

43-
muteService.removeMute(targetMember)
43+
muteService.removeMute(guild, targetMember.asUser())
4444
respond("User ${args.first.username} has been unmuted")
4545
}
4646
}

src/main/kotlin/me/ddivad/judgebot/embeds/InfractionEmbeds.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ fun EmbedBuilder.createMuteEmbed(guild: Guild, user: User, reason: String, lengt
113113
}
114114
}
115115

116-
fun EmbedBuilder.createUnmuteEmbed(guild: Guild, user: Member) {
116+
fun EmbedBuilder.createUnmuteEmbed(guild: Guild, user: User) {
117117
color = Color.GREEN
118118
title = "Mute Removed"
119119
description = "${user.mention} you have been unmuted from **${guild.name}**."

src/main/kotlin/me/ddivad/judgebot/services/infractions/BadPfpService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class BadPfpService(private val muteService: MuteService,
5454
badPfpTracker[key]?.cancel()
5555
badPfpTracker.remove(key)
5656
loggingService.badPfpCancelled(guild, target)
57-
muteService.removeMute(target)
57+
muteService.removeMute(guild, target.asUser())
5858
}
5959
}
6060
}

src/main/kotlin/me/ddivad/judgebot/services/infractions/MuteService.kt

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.gitlab.kordlib.common.entity.Permissions
66
import com.gitlab.kordlib.core.entity.Guild
77
import com.gitlab.kordlib.core.entity.Member
88
import com.gitlab.kordlib.core.entity.PermissionOverwrite
9+
import com.gitlab.kordlib.core.entity.User
910
import kotlinx.coroutines.Job
1011
import kotlinx.coroutines.flow.toList
1112
import kotlinx.coroutines.runBlocking
@@ -38,10 +39,9 @@ class MuteService(val configuration: Configuration,
3839
private val discord: Discord,
3940
private val databaseService: DatabaseService,
4041
private val loggingService: LoggingService) {
41-
private val punishmentTimerMap = hashMapOf<Pair<GuildID, UserId>, Job>()
42-
private suspend fun toKey(member: Member) = member.guild.id.value to member.asUser().id.value
42+
private val muteTimerMap = hashMapOf<Pair<UserId, GuildID>, Job>()
4343
private suspend fun getMutedRole(guild: Guild) = guild.getRole(configuration[guild.id.longValue]?.mutedRole?.toSnowflake()!!)
44-
44+
private fun toKey(user: User, guild: Guild) = user.id.value to guild.id.value
4545
suspend fun initGuilds() {
4646
configuration.guildConfigurations.forEach { config ->
4747
val guild = config.value.id.toSnowflake().let { discord.api.getGuild(it) } ?: return@forEach
@@ -52,21 +52,20 @@ class MuteService(val configuration: Configuration,
5252

5353
suspend fun applyMute(member: Member, time: Long, reason: String) {
5454
val guild = member.guild.asGuild()
55-
val userId = member.asUser().id.value
56-
val key = toKey(member)
55+
val user = member.asUser()
5756
val clearTime = DateTime.now().plus(time).millis
57+
val punishment = Punishment(user.id.value, InfractionType.Mute, reason, "", clearTime)
5858
val muteRole = getMutedRole(guild)
59-
60-
if (key in punishmentTimerMap) {
61-
punishmentTimerMap[key]?.cancel()
62-
punishmentTimerMap.remove(key)
59+
val key = toKey(user, guild)
60+
if (key in muteTimerMap) {
61+
muteTimerMap[key]?.cancel()
62+
muteTimerMap.remove(key)
6363
databaseService.guilds.removePunishment(guild, member.asUser().id.value, InfractionType.Mute)
6464
loggingService.muteOverwritten(guild, member)
6565
}
66-
val punishment = Punishment(userId, InfractionType.Mute, reason, "", clearTime)
6766
databaseService.guilds.addPunishment(guild.asGuild(), punishment)
68-
punishmentTimerMap[key] = applyRoleWithTimer(member, muteRole, time) {
69-
removeMute(member)
67+
muteTimerMap[key] = applyRoleWithTimer(member, muteRole, time) {
68+
removeMute(guild, user)
7069
}.also {
7170
loggingService.roleApplied(guild, member.asUser(), muteRole)
7271
member.sendPrivateMessage {
@@ -79,19 +78,22 @@ class MuteService(val configuration: Configuration,
7978
this.applyMute(target, 1000L * 60 * 5, "You've been muted temporarily so that a mod can handle something.")
8079
}
8180

82-
fun removeMute(member: Member) {
81+
fun removeMute(guild: Guild, user: User) {
8382
runBlocking {
84-
val guild = member.guild.asGuild()
85-
val key = toKey(member)
8683
val muteRole = getMutedRole(guild)
87-
member.removeRole(muteRole.id)
88-
databaseService.guilds.removePunishment(guild, member.asUser().id.value, InfractionType.Mute)
89-
punishmentTimerMap[key]?.cancel()
90-
punishmentTimerMap.remove(toKey(member))
91-
member.sendPrivateMessage {
92-
createUnmuteEmbed(guild, member)
84+
databaseService.guilds.removePunishment(guild, user.id.value, InfractionType.Mute)
85+
val key = toKey(user, guild)
86+
muteTimerMap[key]?.cancel()
87+
muteTimerMap.remove(key)
88+
89+
guild.getMemberOrNull(user.id)?.let {
90+
it.removeRole(muteRole.id)
91+
it.sendPrivateMessage {
92+
createUnmuteEmbed(guild, user)
93+
}
9394
}
94-
loggingService.roleRemoved(guild, member.asUser(), muteRole)
95+
96+
loggingService.roleRemoved(guild, user, muteRole)
9597
}
9698
}
9799

@@ -100,9 +102,10 @@ class MuteService(val configuration: Configuration,
100102
if (it.clearTime != null) {
101103
val difference = it.clearTime - DateTime.now().millis
102104
val member = guild.getMemberOrNull(it.userId.toSnowflake()) ?: return
103-
val key = toKey(member)
104-
punishmentTimerMap[key] = applyRoleWithTimer(member, getMutedRole(guild), difference) {
105-
removeMute(member)
105+
val user = member.asUser()
106+
val key = toKey(user, guild)
107+
muteTimerMap[key] = applyRoleWithTimer(member, getMutedRole(guild), difference) {
108+
removeMute(guild, user)
106109
}
107110
}
108111
}
@@ -112,9 +115,10 @@ class MuteService(val configuration: Configuration,
112115
val mute = databaseService.guilds.checkPunishmentExists(guild, member, InfractionType.Mute).first()
113116
if (mute.clearTime != null) {
114117
val difference = mute.clearTime - DateTime.now().millis
115-
val key = toKey(member)
116-
punishmentTimerMap[key] = applyRoleWithTimer(member, getMutedRole(guild), difference) {
117-
removeMute(member)
118+
val user = member.asUser()
119+
val key = toKey(user, guild)
120+
muteTimerMap[key] = applyRoleWithTimer(member, getMutedRole(guild), difference) {
121+
removeMute(guild, user)
118122
}
119123
}
120124
}
@@ -140,7 +144,7 @@ class MuteService(val configuration: Configuration,
140144
} catch (ex: RequestException) {
141145
println("No permssions to add overwrite to ${it.id.value}")
142146
}
143-
147+
144148
}
145149
}
146150
}

0 commit comments

Comments
 (0)