@@ -6,6 +6,7 @@ import com.gitlab.kordlib.common.entity.Permissions
66import com.gitlab.kordlib.core.entity.Guild
77import com.gitlab.kordlib.core.entity.Member
88import com.gitlab.kordlib.core.entity.PermissionOverwrite
9+ import com.gitlab.kordlib.core.entity.User
910import kotlinx.coroutines.Job
1011import kotlinx.coroutines.flow.toList
1112import 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