diff --git a/backend/src/data/GuildMutes.ts b/backend/src/data/GuildMutes.ts index f761008f..0e0169ce 100644 --- a/backend/src/data/GuildMutes.ts +++ b/backend/src/data/GuildMutes.ts @@ -51,22 +51,34 @@ export class GuildMutes extends BaseGuildRepository { return this.mutes.findOne({ where: result.identifiers[0] }); } - async updateExpiryTime(userId, newExpiryTime) { + async updateExpiryTime(userId, newExpiryTime, rolesToRestore?: string[]) { const expiresAt = newExpiryTime ? moment() .add(newExpiryTime, "ms") .format("YYYY-MM-DD HH:mm:ss") : null; - - return this.mutes.update( - { - guild_id: this.guildId, - user_id: userId, - }, - { - expires_at: expiresAt, - }, - ); + if (rolesToRestore && rolesToRestore.length) { + return this.mutes.update( + { + guild_id: this.guildId, + user_id: userId, + }, + { + expires_at: expiresAt, + roles_to_restore: rolesToRestore, + }, + ); + } else { + return this.mutes.update( + { + guild_id: this.guildId, + user_id: userId, + }, + { + expires_at: expiresAt, + }, + ); + } } async getActiveMutes(): Promise { diff --git a/backend/src/plugins/Mutes.ts b/backend/src/plugins/Mutes.ts index 33bc1ab1..b24ddad2 100644 --- a/backend/src/plugins/Mutes.ts +++ b/backend/src/plugins/Mutes.ts @@ -187,7 +187,9 @@ export class MutesPlugin extends ZeppelinPlugin { // remove roles if (!Array.isArray(removeRoles)) { if (removeRoles) { - memberOptions.roles = []; + // exclude managed roles from being removed + const managedRoles = this.guild.roles.filter(x => x.managed).map(y => y.id); + memberOptions.roles = managedRoles.filter(x => member.roles.includes(x)); await member.edit(memberOptions); } } else { @@ -223,7 +225,10 @@ export class MutesPlugin extends ZeppelinPlugin { let notifyResult: UserNotificationResult = { method: null, success: true }; if (existingMute) { - await this.mutes.updateExpiryTime(user.id, muteTime); + if (existingMute.roles_to_restore.length || rolesToRestore.length) { + rolesToRestore = Array.from(new Set([...existingMute.roles_to_restore, ...rolesToRestore])); + } + await this.mutes.updateExpiryTime(user.id, muteTime, rolesToRestore); } else { await this.mutes.addMute(user.id, muteTime, rolesToRestore); }