diff --git a/backend/src/plugins/ModActions.ts b/backend/src/plugins/ModActions.ts index 578fd7c7..74042b9f 100644 --- a/backend/src/plugins/ModActions.ts +++ b/backend/src/plugins/ModActions.ts @@ -892,16 +892,16 @@ export class ModActionsPlugin extends ZeppelinPlugin { async unmuteCmd(msg: Message, args: { user: string; time?: number; reason?: string; mod?: Member }) { const user = await this.resolveUser(args.user); if (!user) return this.sendErrorMessage(msg.channel, `User not found`); + const memberToUnmute = await this.getMember(user.id); + const mutesPlugin = this.getPlugin("mutes"); + const hasMuteRole = mutesPlugin.hasMutedRole(memberToUnmute); // Check if they're muted in the first place - if (!(await this.mutes.isMuted(args.user))) { + if (!(await this.mutes.isMuted(args.user)) && !hasMuteRole) { this.sendErrorMessage(msg.channel, "Cannot unmute: member is not muted"); return; } - // Find the server member to unmute - const memberToUnmute = await this.getMember(user.id); - if (!memberToUnmute) { const isBanned = await this.isBanned(user.id); const prefix = this.guildConfig.prefix; diff --git a/backend/src/plugins/Mutes.ts b/backend/src/plugins/Mutes.ts index 0f3c2884..64169a2a 100644 --- a/backend/src/plugins/Mutes.ts +++ b/backend/src/plugins/Mutes.ts @@ -275,14 +275,18 @@ export class MutesPlugin extends ZeppelinPlugin { caseArgs: Partial = {}, ): Promise { const existingMute = await this.mutes.findExistingMuteForUserId(userId); - if (!existingMute) return; - const user = await this.resolveUser(userId); const member = await this.getMember(userId, true); // Grab the fresh member so we don't have stale role info + if (!existingMute && !this.hasMutedRole(member)) return; + if (unmuteTime) { // Schedule timed unmute (= just set the mute's duration) - await this.mutes.updateExpiryTime(userId, unmuteTime); + if (!existingMute) { + await this.mutes.addMute(userId, unmuteTime); + } else { + await this.mutes.updateExpiryTime(userId, unmuteTime); + } } else { // Unmute immediately if (member) { @@ -295,8 +299,9 @@ export class MutesPlugin extends ZeppelinPlugin { `Member ${userId} not found in guild ${this.guild.name} (${this.guildId}) when attempting to unmute`, ); } - - await this.mutes.clear(userId); + if (existingMute) { + await this.mutes.clear(userId); + } } const timeUntilUnmute = unmuteTime && humanizeDuration(unmuteTime); @@ -308,6 +313,9 @@ export class MutesPlugin extends ZeppelinPlugin { } else { noteDetails.push(`Unmuted immediately`); } + if (!existingMute) { + noteDetails.push(`Removed external mute`); + } const casesPlugin = this.getPlugin("cases"); const createdCase = await casesPlugin.createCase({ @@ -338,6 +346,13 @@ export class MutesPlugin extends ZeppelinPlugin { }; } + public hasMutedRole(member: Member) { + if (member.roles.includes(this.getConfig().mute_role)) { + return true; + } + return false; + } + @d.command("mutes", [], { options: [ {