From fd8a4598aabb13726581fd1d285c9a15be123e2f Mon Sep 17 00:00:00 2001 From: Dragory <2606411+Dragory@users.noreply.github.com> Date: Sat, 30 Nov 2019 16:18:29 +0200 Subject: [PATCH] automod: add add_roles and remove_roles actions --- backend/src/plugins/Automod.ts | 48 ++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/backend/src/plugins/Automod.ts b/backend/src/plugins/Automod.ts index 413c7460..1fdc0022 100644 --- a/backend/src/plugins/Automod.ts +++ b/backend/src/plugins/Automod.ts @@ -254,6 +254,14 @@ const ChangeNicknameAction = t.type({ const LogAction = t.boolean; +const AddRolesAction = t.type({ + roles: t.array(t.string), +}); + +const RemoveRolesAction = t.type({ + roles: t.array(t.string), +}); + /** * FULL CONFIG SCHEMA */ @@ -288,6 +296,8 @@ const Rule = t.type({ alert: tNullable(AlertAction), change_nickname: tNullable(ChangeNicknameAction), log: tNullable(LogAction), + add_roles: tNullable(AddRolesAction), + remove_roles: tNullable(RemoveRolesAction), }), cooldown: tNullable(t.string), }); @@ -1255,6 +1265,44 @@ export class AutomodPlugin extends ZeppelinPlugin { actionsTaken.push("nickname"); } + if (rule.actions.add_roles) { + const userIdsToChange = matchResult.type === "raidspam" ? matchResult.userIds : [matchResult.userId]; + for (const userId of userIdsToChange) { + const member = await this.getMember(userId); + if (!member) continue; + + const memberRoles = new Set(member.roles); + for (const roleId of rule.actions.add_roles.roles) { + memberRoles.add(roleId); + } + + const rolesArr = Array.from(memberRoles.values()); + await member.edit({ + roles: rolesArr, + }); + member.roles = rolesArr; // Make sure we know of the new roles internally as well + } + } + + if (rule.actions.remove_roles) { + const userIdsToChange = matchResult.type === "raidspam" ? matchResult.userIds : [matchResult.userId]; + for (const userId of userIdsToChange) { + const member = await this.getMember(userId); + if (!member) continue; + + const memberRoles = new Set(member.roles); + for (const roleId of rule.actions.remove_roles.roles) { + memberRoles.delete(roleId); + } + + const rolesArr = Array.from(memberRoles.values()); + await member.edit({ + roles: rolesArr, + }); + member.roles = rolesArr; // Make sure we know of the new roles internally as well + } + } + // Don't wait for the rest before continuing to other automod items in the queue (async () => { const user = matchResult.type !== "raidspam" ? this.getUser(matchResult.userId) : new UnknownUser();