From 9d93a11405314d6bde588ae738f2a96bd0451780 Mon Sep 17 00:00:00 2001 From: metal Date: Wed, 8 Sep 2021 12:07:01 +0000 Subject: [PATCH 01/19] initial --- .../src/plugins/Automod/actions/addRoles.ts | 2 +- .../Automod/actions/availableActions.ts | 3 + .../plugins/Automod/actions/changeRoles.ts | 110 ++++++++++++++++++ .../plugins/Automod/actions/removeRoles.ts | 4 +- 4 files changed, 116 insertions(+), 3 deletions(-) create mode 100644 backend/src/plugins/Automod/actions/changeRoles.ts diff --git a/backend/src/plugins/Automod/actions/addRoles.ts b/backend/src/plugins/Automod/actions/addRoles.ts index c39cc5e7..c2571620 100644 --- a/backend/src/plugins/Automod/actions/addRoles.ts +++ b/backend/src/plugins/Automod/actions/addRoles.ts @@ -1,6 +1,5 @@ import { Permissions, Snowflake } from "discord.js"; import * as t from "io-ts"; -import { LogType } from "../../../data/LogType"; import { nonNullish, unique } from "../../../utils"; import { canAssignRole } from "../../../utils/canAssignRole"; import { getMissingPermissions } from "../../../utils/getMissingPermissions"; @@ -49,6 +48,7 @@ export const AddRolesAction = automodAction({ "**, **", )}**`, }); + return; } await Promise.all( diff --git a/backend/src/plugins/Automod/actions/availableActions.ts b/backend/src/plugins/Automod/actions/availableActions.ts index 76b2a60e..834b091e 100644 --- a/backend/src/plugins/Automod/actions/availableActions.ts +++ b/backend/src/plugins/Automod/actions/availableActions.ts @@ -6,6 +6,7 @@ import { AlertAction } from "./alert"; import { ArchiveThreadAction } from "./archiveThread"; import { BanAction } from "./ban"; import { ChangeNicknameAction } from "./changeNickname"; +import { ChangeRolesAction } from "./changeRoles"; import { CleanAction } from "./clean"; import { KickAction } from "./kick"; import { LogAction } from "./log"; @@ -34,6 +35,7 @@ export const availableActions: Record> = { set_counter: SetCounterAction, set_slowmode: SetSlowmodeAction, archive_thread: ArchiveThreadAction, + change_roles: ChangeRolesAction, }; export const AvailableActions = t.type({ @@ -53,4 +55,5 @@ export const AvailableActions = t.type({ set_counter: SetCounterAction.configType, set_slowmode: SetSlowmodeAction.configType, archive_thread: ArchiveThreadAction.configType, + change_roles: ChangeRolesAction.configType, }); diff --git a/backend/src/plugins/Automod/actions/changeRoles.ts b/backend/src/plugins/Automod/actions/changeRoles.ts new file mode 100644 index 00000000..3f966585 --- /dev/null +++ b/backend/src/plugins/Automod/actions/changeRoles.ts @@ -0,0 +1,110 @@ +import { Permissions, Snowflake } from "discord.js"; +import * as t from "io-ts"; +import isEqual from "lodash.isequal"; +import { nonNullish, unique } from "../../../utils"; +import { canAssignRole } from "../../../utils/canAssignRole"; +import { getMissingPermissions } from "../../../utils/getMissingPermissions"; +import { memberRolesLock } from "../../../utils/lockNameHelpers"; +import { missingPermissionError } from "../../../utils/missingPermissionError"; +import { LogsPlugin } from "../../Logs/LogsPlugin"; +import { ignoreRoleChange } from "../functions/ignoredRoleChanges"; +import { automodAction } from "../helpers"; + +const p = Permissions.FLAGS; + +export const ChangeRolesAction = automodAction({ + configType: t.type({ + add: t.array(t.string), + remove: t.array(t.string), + }), + defaultConfig: { + add: [], + remove: [], + }, + + async apply({ pluginData, contexts, actionConfig, ruleName }) { + const members = unique(contexts.map(c => c.member).filter(nonNullish)); + const me = pluginData.guild.members.cache.get(pluginData.client.user!.id)!; + + const missingPermissions = getMissingPermissions(me.permissions, p.MANAGE_ROLES); + if (missingPermissions) { + const logs = pluginData.getPlugin(LogsPlugin); + logs.logBotAlert({ + body: `Cannot edit roles in Automod rule **${ruleName}**. ${missingPermissionError(missingPermissions)}`, + }); + return; + } + + const rolesToAssign: string[] = []; + const rolesWeCannotAssign: string[] = []; + const rolesToRemove: string[] = []; + const rolesWeCannotRemove: string[] = []; + for (const roleId of actionConfig.add) { + if (canAssignRole(pluginData.guild, me, roleId)) { + rolesToAssign.push(roleId); + } else { + rolesWeCannotAssign.push(roleId); + } + } + for (const roleId of actionConfig.remove) { + if (canAssignRole(pluginData.guild, me, roleId)) { + rolesToRemove.push(roleId); + } else { + rolesWeCannotRemove.push(roleId); + } + } + + if (rolesWeCannotAssign.length) { + const roleNamesWeCannotAssign = rolesWeCannotAssign.map( + roleId => pluginData.guild.roles.cache.get(roleId as Snowflake)?.name || roleId, + ); + const logs = pluginData.getPlugin(LogsPlugin); + logs.logBotAlert({ + body: `Unable to assign the following roles in Automod rule **${ruleName}**: **${roleNamesWeCannotAssign.join( + "**, **", + )}**`, + }); + } + + if (rolesWeCannotRemove.length) { + const roleNamesWeCannotRemove = rolesWeCannotRemove.map( + roleId => pluginData.guild.roles.cache.get(roleId as Snowflake)?.name || roleId, + ); + const logs = pluginData.getPlugin(LogsPlugin); + logs.logBotAlert({ + body: `Unable to remove the following roles in Automod rule **${ruleName}**: **${roleNamesWeCannotRemove.join( + "**, **", + )}**`, + }); + return; + } + + await Promise.all( + members.map(async member => { + const memberRoles = new Set(member.roles.cache.keys()); + for (const roleId of rolesToAssign) { + memberRoles.add(roleId as Snowflake); + ignoreRoleChange(pluginData, member.id, roleId); + } + for (const roleId of rolesToRemove) { + memberRoles.delete(roleId as Snowflake); + ignoreRoleChange(pluginData, member.id, roleId); + } + + if (isEqual(memberRoles, member.roles.cache.keys())) { + // No role changes + return; + } + + const memberRoleLock = await pluginData.locks.acquire(memberRolesLock(member)); + + const rolesArr = Array.from(memberRoles.values()); + await member.edit({ + roles: rolesArr, + }); + + memberRoleLock.unlock(); + }), + ); + }, +}); diff --git a/backend/src/plugins/Automod/actions/removeRoles.ts b/backend/src/plugins/Automod/actions/removeRoles.ts index 690af257..561756d0 100644 --- a/backend/src/plugins/Automod/actions/removeRoles.ts +++ b/backend/src/plugins/Automod/actions/removeRoles.ts @@ -1,6 +1,5 @@ import { Permissions, Snowflake } from "discord.js"; import * as t from "io-ts"; -import { LogType } from "../../../data/LogType"; import { nonNullish, unique } from "../../../utils"; import { canAssignRole } from "../../../utils/canAssignRole"; import { getMissingPermissions } from "../../../utils/getMissingPermissions"; @@ -25,7 +24,7 @@ export const RemoveRolesAction = automodAction({ if (missingPermissions) { const logs = pluginData.getPlugin(LogsPlugin); logs.logBotAlert({ - body: `Cannot add roles in Automod rule **${ruleName}**. ${missingPermissionError(missingPermissions)}`, + body: `Cannot remove roles in Automod rule **${ruleName}**. ${missingPermissionError(missingPermissions)}`, }); return; } @@ -50,6 +49,7 @@ export const RemoveRolesAction = automodAction({ "**, **", )}**`, }); + return; } await Promise.all( From 1767dbced6fe2c4da594c2a7a3cff23f4c806d4d Mon Sep 17 00:00:00 2001 From: metal Date: Wed, 8 Sep 2021 12:15:38 +0000 Subject: [PATCH 02/19] add config validations --- backend/src/plugins/Automod/AutomodPlugin.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/backend/src/plugins/Automod/AutomodPlugin.ts b/backend/src/plugins/Automod/AutomodPlugin.ts index 60f55296..d49ee7b8 100644 --- a/backend/src/plugins/Automod/AutomodPlugin.ts +++ b/backend/src/plugins/Automod/AutomodPlugin.ts @@ -134,6 +134,16 @@ const configPreprocessor: ConfigPreprocessorFn = options => { } if (rule["actions"]) { + if (rule["actions"].change_roles && (rule["actions"].add_roles || rule["actions"].remove_roles)) { + throw new StrictValidationError([ + `Can't use both 'change_roles' and 'add_roles'/'remove_roles' at rule '${rule.name}'`, + ]); + } + if (rule["actions"].add_roles && rule["actions"].remove_roles) { + throw new StrictValidationError([ + `Can't use both 'add_roles' and 'remove_roles' at rule '${rule.name}', use 'change_roles' instead`, + ]); + } for (const actionName in rule["actions"]) { if (!availableActions[actionName]) { throw new StrictValidationError([`Unknown action '${actionName}' in rule '${rule.name}'`]); From 0a8fffd63ce69aac659f8c4864c66cddfec07cb8 Mon Sep 17 00:00:00 2001 From: metal Date: Wed, 8 Sep 2021 12:16:36 +0000 Subject: [PATCH 03/19] lines --- backend/src/plugins/Automod/AutomodPlugin.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/src/plugins/Automod/AutomodPlugin.ts b/backend/src/plugins/Automod/AutomodPlugin.ts index d49ee7b8..2a22c72b 100644 --- a/backend/src/plugins/Automod/AutomodPlugin.ts +++ b/backend/src/plugins/Automod/AutomodPlugin.ts @@ -139,11 +139,13 @@ const configPreprocessor: ConfigPreprocessorFn = options => { `Can't use both 'change_roles' and 'add_roles'/'remove_roles' at rule '${rule.name}'`, ]); } + if (rule["actions"].add_roles && rule["actions"].remove_roles) { throw new StrictValidationError([ `Can't use both 'add_roles' and 'remove_roles' at rule '${rule.name}', use 'change_roles' instead`, ]); } + for (const actionName in rule["actions"]) { if (!availableActions[actionName]) { throw new StrictValidationError([`Unknown action '${actionName}' in rule '${rule.name}'`]); From f7eb08c0672ee230526b70eac6c33b67c227ca0c Mon Sep 17 00:00:00 2001 From: metal Date: Wed, 8 Sep 2021 14:14:26 +0100 Subject: [PATCH 04/19] Update backend/src/plugins/Automod/actions/addRoles.ts Co-authored-by: Almeida --- backend/src/plugins/Automod/actions/addRoles.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/src/plugins/Automod/actions/addRoles.ts b/backend/src/plugins/Automod/actions/addRoles.ts index c2571620..2c388ce1 100644 --- a/backend/src/plugins/Automod/actions/addRoles.ts +++ b/backend/src/plugins/Automod/actions/addRoles.ts @@ -48,7 +48,6 @@ export const AddRolesAction = automodAction({ "**, **", )}**`, }); - return; } await Promise.all( From a086a24eedd7fa38ddd59bbe522845bc61ba4177 Mon Sep 17 00:00:00 2001 From: Almeida Date: Wed, 8 Sep 2021 14:21:03 +0100 Subject: [PATCH 05/19] Dot syntax --- backend/src/plugins/Automod/AutomodPlugin.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/src/plugins/Automod/AutomodPlugin.ts b/backend/src/plugins/Automod/AutomodPlugin.ts index 2a22c72b..326e8655 100644 --- a/backend/src/plugins/Automod/AutomodPlugin.ts +++ b/backend/src/plugins/Automod/AutomodPlugin.ts @@ -133,20 +133,20 @@ const configPreprocessor: ConfigPreprocessorFn = options => { } } - if (rule["actions"]) { - if (rule["actions"].change_roles && (rule["actions"].add_roles || rule["actions"].remove_roles)) { + if (rule.actions) { + if (rule.actions.change_roles && (rule.actions.add_roles || rule.actions.remove_roles)) { throw new StrictValidationError([ `Can't use both 'change_roles' and 'add_roles'/'remove_roles' at rule '${rule.name}'`, ]); } - if (rule["actions"].add_roles && rule["actions"].remove_roles) { + if (rule.actions.add_roles && rule.actions.remove_roles) { throw new StrictValidationError([ `Can't use both 'add_roles' and 'remove_roles' at rule '${rule.name}', use 'change_roles' instead`, ]); } - for (const actionName in rule["actions"]) { + for (const actionName in rule.actions) { if (!availableActions[actionName]) { throw new StrictValidationError([`Unknown action '${actionName}' in rule '${rule.name}'`]); } From d4db1a7ff5ef945912964357e24eb629d9b9c4f7 Mon Sep 17 00:00:00 2001 From: metal Date: Wed, 8 Sep 2021 14:21:20 +0100 Subject: [PATCH 06/19] Update backend/src/plugins/Automod/actions/changeRoles.ts Co-authored-by: Almeida --- backend/src/plugins/Automod/actions/changeRoles.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/backend/src/plugins/Automod/actions/changeRoles.ts b/backend/src/plugins/Automod/actions/changeRoles.ts index 3f966585..83d36de6 100644 --- a/backend/src/plugins/Automod/actions/changeRoles.ts +++ b/backend/src/plugins/Automod/actions/changeRoles.ts @@ -10,8 +10,6 @@ import { LogsPlugin } from "../../Logs/LogsPlugin"; import { ignoreRoleChange } from "../functions/ignoredRoleChanges"; import { automodAction } from "../helpers"; -const p = Permissions.FLAGS; - export const ChangeRolesAction = automodAction({ configType: t.type({ add: t.array(t.string), From b0182f7ca5a5c49b6620c6f6d1bff4da05a7a431 Mon Sep 17 00:00:00 2001 From: metal Date: Wed, 8 Sep 2021 14:21:25 +0100 Subject: [PATCH 07/19] Update backend/src/plugins/Automod/actions/changeRoles.ts Co-authored-by: Almeida --- backend/src/plugins/Automod/actions/changeRoles.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/plugins/Automod/actions/changeRoles.ts b/backend/src/plugins/Automod/actions/changeRoles.ts index 83d36de6..5f2c6a8a 100644 --- a/backend/src/plugins/Automod/actions/changeRoles.ts +++ b/backend/src/plugins/Automod/actions/changeRoles.ts @@ -24,7 +24,7 @@ export const ChangeRolesAction = automodAction({ const members = unique(contexts.map(c => c.member).filter(nonNullish)); const me = pluginData.guild.members.cache.get(pluginData.client.user!.id)!; - const missingPermissions = getMissingPermissions(me.permissions, p.MANAGE_ROLES); + const missingPermissions = getMissingPermissions(me.permissions, Permissions.FLAGS.MANAGE_ROLES); if (missingPermissions) { const logs = pluginData.getPlugin(LogsPlugin); logs.logBotAlert({ From 8e01cfb766dbbe8474afa30d592e4fd007107a00 Mon Sep 17 00:00:00 2001 From: metal Date: Wed, 8 Sep 2021 14:21:39 +0100 Subject: [PATCH 08/19] Update backend/src/plugins/Automod/actions/changeRoles.ts Co-authored-by: Almeida --- backend/src/plugins/Automod/actions/changeRoles.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/plugins/Automod/actions/changeRoles.ts b/backend/src/plugins/Automod/actions/changeRoles.ts index 5f2c6a8a..23639ce7 100644 --- a/backend/src/plugins/Automod/actions/changeRoles.ts +++ b/backend/src/plugins/Automod/actions/changeRoles.ts @@ -22,7 +22,7 @@ export const ChangeRolesAction = automodAction({ async apply({ pluginData, contexts, actionConfig, ruleName }) { const members = unique(contexts.map(c => c.member).filter(nonNullish)); - const me = pluginData.guild.members.cache.get(pluginData.client.user!.id)!; + const me = pluginData.guild.me ?? await pluginData.guild.members.fetch(pluginData.client.user!.id); const missingPermissions = getMissingPermissions(me.permissions, Permissions.FLAGS.MANAGE_ROLES); if (missingPermissions) { From ffb17755f21649fd8f1b0cf9e65f87ab27cb3c2f Mon Sep 17 00:00:00 2001 From: metal Date: Wed, 8 Sep 2021 14:21:48 +0100 Subject: [PATCH 09/19] Update backend/src/plugins/Automod/actions/changeRoles.ts Co-authored-by: Almeida --- backend/src/plugins/Automod/actions/changeRoles.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/src/plugins/Automod/actions/changeRoles.ts b/backend/src/plugins/Automod/actions/changeRoles.ts index 23639ce7..de44c870 100644 --- a/backend/src/plugins/Automod/actions/changeRoles.ts +++ b/backend/src/plugins/Automod/actions/changeRoles.ts @@ -33,10 +33,10 @@ export const ChangeRolesAction = automodAction({ return; } - const rolesToAssign: string[] = []; - const rolesWeCannotAssign: string[] = []; - const rolesToRemove: string[] = []; - const rolesWeCannotRemove: string[] = []; + const rolesToAssign: Snowflake[] = []; + const rolesWeCannotAssign: Snowflake[] = []; + const rolesToRemove: Snowflake[] = []; + const rolesWeCannotRemove: Snowflake[] = []; for (const roleId of actionConfig.add) { if (canAssignRole(pluginData.guild, me, roleId)) { rolesToAssign.push(roleId); From 07193d2ebc0d1ca21b5be4af1ea4b82c00a0931d Mon Sep 17 00:00:00 2001 From: metal Date: Wed, 8 Sep 2021 14:22:13 +0100 Subject: [PATCH 10/19] Update backend/src/plugins/Automod/actions/changeRoles.ts Co-authored-by: Almeida --- backend/src/plugins/Automod/actions/changeRoles.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/plugins/Automod/actions/changeRoles.ts b/backend/src/plugins/Automod/actions/changeRoles.ts index de44c870..19420eb8 100644 --- a/backend/src/plugins/Automod/actions/changeRoles.ts +++ b/backend/src/plugins/Automod/actions/changeRoles.ts @@ -54,7 +54,7 @@ export const ChangeRolesAction = automodAction({ if (rolesWeCannotAssign.length) { const roleNamesWeCannotAssign = rolesWeCannotAssign.map( - roleId => pluginData.guild.roles.cache.get(roleId as Snowflake)?.name || roleId, + roleId => pluginData.guild.roles.cache.get(roleId)?.name || roleId, ); const logs = pluginData.getPlugin(LogsPlugin); logs.logBotAlert({ From d660adb52834e17d0c9d4be2d301e13fdf9a8112 Mon Sep 17 00:00:00 2001 From: metal Date: Wed, 8 Sep 2021 14:22:21 +0100 Subject: [PATCH 11/19] Update backend/src/plugins/Automod/actions/removeRoles.ts Co-authored-by: Almeida --- backend/src/plugins/Automod/actions/removeRoles.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/src/plugins/Automod/actions/removeRoles.ts b/backend/src/plugins/Automod/actions/removeRoles.ts index 561756d0..cbdc68d0 100644 --- a/backend/src/plugins/Automod/actions/removeRoles.ts +++ b/backend/src/plugins/Automod/actions/removeRoles.ts @@ -49,7 +49,6 @@ export const RemoveRolesAction = automodAction({ "**, **", )}**`, }); - return; } await Promise.all( From f7bf7b3c4e4c5713ef77c009534ce479b83b31a9 Mon Sep 17 00:00:00 2001 From: metal Date: Wed, 8 Sep 2021 14:22:33 +0100 Subject: [PATCH 12/19] Update backend/src/plugins/Automod/actions/changeRoles.ts Co-authored-by: Almeida --- backend/src/plugins/Automod/actions/changeRoles.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/plugins/Automod/actions/changeRoles.ts b/backend/src/plugins/Automod/actions/changeRoles.ts index 19420eb8..70c5c057 100644 --- a/backend/src/plugins/Automod/actions/changeRoles.ts +++ b/backend/src/plugins/Automod/actions/changeRoles.ts @@ -66,7 +66,7 @@ export const ChangeRolesAction = automodAction({ if (rolesWeCannotRemove.length) { const roleNamesWeCannotRemove = rolesWeCannotRemove.map( - roleId => pluginData.guild.roles.cache.get(roleId as Snowflake)?.name || roleId, + roleId => pluginData.guild.roles.cache.get(roleId)?.name || roleId, ); const logs = pluginData.getPlugin(LogsPlugin); logs.logBotAlert({ From 4d21a6c5b32580e6e996fb4d04f45fe8261f4783 Mon Sep 17 00:00:00 2001 From: metal Date: Wed, 8 Sep 2021 14:22:40 +0100 Subject: [PATCH 13/19] Update backend/src/plugins/Automod/actions/changeRoles.ts Co-authored-by: Almeida --- backend/src/plugins/Automod/actions/changeRoles.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/src/plugins/Automod/actions/changeRoles.ts b/backend/src/plugins/Automod/actions/changeRoles.ts index 70c5c057..8954823a 100644 --- a/backend/src/plugins/Automod/actions/changeRoles.ts +++ b/backend/src/plugins/Automod/actions/changeRoles.ts @@ -74,7 +74,6 @@ export const ChangeRolesAction = automodAction({ "**, **", )}**`, }); - return; } await Promise.all( From 1fdc24a92f7ce312530dbdeb906fa0546326ed58 Mon Sep 17 00:00:00 2001 From: metal Date: Wed, 8 Sep 2021 14:22:49 +0100 Subject: [PATCH 14/19] Update backend/src/plugins/Automod/actions/changeRoles.ts Co-authored-by: Almeida --- backend/src/plugins/Automod/actions/changeRoles.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/plugins/Automod/actions/changeRoles.ts b/backend/src/plugins/Automod/actions/changeRoles.ts index 8954823a..fe6fb510 100644 --- a/backend/src/plugins/Automod/actions/changeRoles.ts +++ b/backend/src/plugins/Automod/actions/changeRoles.ts @@ -80,7 +80,7 @@ export const ChangeRolesAction = automodAction({ members.map(async member => { const memberRoles = new Set(member.roles.cache.keys()); for (const roleId of rolesToAssign) { - memberRoles.add(roleId as Snowflake); + memberRoles.add(roleId); ignoreRoleChange(pluginData, member.id, roleId); } for (const roleId of rolesToRemove) { From 61c71898512332612b31fa5253fd4b2f7fec93f0 Mon Sep 17 00:00:00 2001 From: metal Date: Wed, 8 Sep 2021 14:22:58 +0100 Subject: [PATCH 15/19] Update backend/src/plugins/Automod/actions/changeRoles.ts Co-authored-by: Almeida --- backend/src/plugins/Automod/actions/changeRoles.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/plugins/Automod/actions/changeRoles.ts b/backend/src/plugins/Automod/actions/changeRoles.ts index fe6fb510..73b66bc2 100644 --- a/backend/src/plugins/Automod/actions/changeRoles.ts +++ b/backend/src/plugins/Automod/actions/changeRoles.ts @@ -84,7 +84,7 @@ export const ChangeRolesAction = automodAction({ ignoreRoleChange(pluginData, member.id, roleId); } for (const roleId of rolesToRemove) { - memberRoles.delete(roleId as Snowflake); + memberRoles.delete(roleId); ignoreRoleChange(pluginData, member.id, roleId); } From 45dffbd532740ee54d163e103f39af12599e6ba0 Mon Sep 17 00:00:00 2001 From: metal Date: Wed, 8 Sep 2021 14:23:41 +0100 Subject: [PATCH 16/19] Update backend/src/plugins/Automod/actions/changeRoles.ts Co-authored-by: Almeida --- backend/src/plugins/Automod/actions/changeRoles.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/backend/src/plugins/Automod/actions/changeRoles.ts b/backend/src/plugins/Automod/actions/changeRoles.ts index 73b66bc2..266f0a54 100644 --- a/backend/src/plugins/Automod/actions/changeRoles.ts +++ b/backend/src/plugins/Automod/actions/changeRoles.ts @@ -96,9 +96,7 @@ export const ChangeRolesAction = automodAction({ const memberRoleLock = await pluginData.locks.acquire(memberRolesLock(member)); const rolesArr = Array.from(memberRoles.values()); - await member.edit({ - roles: rolesArr, - }); + await member.roles.set(rolesArr); memberRoleLock.unlock(); }), From 09f502dc990dae1b33dd9f7821ccb2e165eae7cc Mon Sep 17 00:00:00 2001 From: metal Date: Wed, 8 Sep 2021 13:25:58 +0000 Subject: [PATCH 17/19] compare arrays --- backend/src/plugins/Automod/actions/changeRoles.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/plugins/Automod/actions/changeRoles.ts b/backend/src/plugins/Automod/actions/changeRoles.ts index 266f0a54..8c176f88 100644 --- a/backend/src/plugins/Automod/actions/changeRoles.ts +++ b/backend/src/plugins/Automod/actions/changeRoles.ts @@ -22,7 +22,7 @@ export const ChangeRolesAction = automodAction({ async apply({ pluginData, contexts, actionConfig, ruleName }) { const members = unique(contexts.map(c => c.member).filter(nonNullish)); - const me = pluginData.guild.me ?? await pluginData.guild.members.fetch(pluginData.client.user!.id); + const me = pluginData.guild.me ?? (await pluginData.guild.members.fetch(pluginData.client.user!.id)); const missingPermissions = getMissingPermissions(me.permissions, Permissions.FLAGS.MANAGE_ROLES); if (missingPermissions) { @@ -88,7 +88,7 @@ export const ChangeRolesAction = automodAction({ ignoreRoleChange(pluginData, member.id, roleId); } - if (isEqual(memberRoles, member.roles.cache.keys())) { + if (isEqual(Array.from(memberRoles), Array.from(member.roles.cache.keys()))) { // No role changes return; } From c975c672bc03026d0230674c857f672906bf7df5 Mon Sep 17 00:00:00 2001 From: almeidx Date: Wed, 8 Sep 2021 14:31:04 +0100 Subject: [PATCH 18/19] dot syntax --- backend/src/plugins/Automod/AutomodPlugin.ts | 30 ++++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/backend/src/plugins/Automod/AutomodPlugin.ts b/backend/src/plugins/Automod/AutomodPlugin.ts index 326e8655..3d6bec68 100644 --- a/backend/src/plugins/Automod/AutomodPlugin.ts +++ b/backend/src/plugins/Automod/AutomodPlugin.ts @@ -66,24 +66,24 @@ const configPreprocessor: ConfigPreprocessorFn = options => { continue; } - rule["name"] = name; + rule.name = name; // If the rule doesn't have an explicitly set "enabled" property, set it to true - if (rule["enabled"] == null) { - rule["enabled"] = true; + if (rule.enabled == null) { + rule.enabled = true; } - if (rule["allow_further_rules"] == null) { - rule["allow_further_rules"] = false; + if (rule.allow_further_rules == null) { + rule.allow_further_rules = false; } - if (rule["affects_bots"] == null) { - rule["affects_bots"] = false; + if (rule.affects_bots == null) { + rule.affects_bots = false; } // Loop through the rule's triggers - if (rule["triggers"]) { - for (const triggerObj of rule["triggers"]) { + if (rule.triggers) { + for (const triggerObj of rule.triggers) { for (const triggerName in triggerObj) { if (!availableTriggers[triggerName]) { throw new StrictValidationError([`Unknown trigger '${triggerName}' in rule '${rule.name}'`]); @@ -152,26 +152,26 @@ const configPreprocessor: ConfigPreprocessorFn = options => { } const actionBlueprint = availableActions[actionName]; - const actionConfig = rule["actions"][actionName]; + const actionConfig = rule.actions[actionName]; if (typeof actionConfig !== "object" || Array.isArray(actionConfig) || actionConfig == null) { - rule["actions"][actionName] = actionConfig; + rule.actions[actionName] = actionConfig; } else { - rule["actions"][actionName] = configUtils.mergeConfig(actionBlueprint.defaultConfig, actionConfig); + rule.actions[actionName] = configUtils.mergeConfig(actionBlueprint.defaultConfig, actionConfig); } } } // Enable logging of automod actions by default - if (rule["actions"]) { + if (rule.actions) { for (const actionName in rule.actions) { if (!availableActions[actionName]) { throw new StrictValidationError([`Unknown action '${actionName}' in rule '${rule.name}'`]); } } - if (rule["actions"]["log"] == null) { - rule["actions"]["log"] = true; + if (rule.actions.log == null) { + rule.actions.log = true; } } } From b845e4e34dda3a674c3ace37011c784a337b3822 Mon Sep 17 00:00:00 2001 From: Almeida Date: Wed, 8 Sep 2021 15:09:35 +0100 Subject: [PATCH 19/19] simplified bot alert logging --- .../plugins/Automod/actions/changeRoles.ts | 29 +++++-------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/backend/src/plugins/Automod/actions/changeRoles.ts b/backend/src/plugins/Automod/actions/changeRoles.ts index 8c176f88..cdd00bef 100644 --- a/backend/src/plugins/Automod/actions/changeRoles.ts +++ b/backend/src/plugins/Automod/actions/changeRoles.ts @@ -52,28 +52,15 @@ export const ChangeRolesAction = automodAction({ } } - if (rolesWeCannotAssign.length) { - const roleNamesWeCannotAssign = rolesWeCannotAssign.map( - roleId => pluginData.guild.roles.cache.get(roleId)?.name || roleId, - ); + if (rolesWeCannotAssign.length || rolesWeCannotRemove.length) { + const mapFn = (roleId: Snowflake) => pluginData.guild.roles.cache.get(roleId)?.name || roleId; + const roleNamesWeCannotAssign = rolesWeCannotAssign.map(mapFn); + const roleNamesWeCannotRemove = rolesWeCannotRemove.map(mapFn); const logs = pluginData.getPlugin(LogsPlugin); - logs.logBotAlert({ - body: `Unable to assign the following roles in Automod rule **${ruleName}**: **${roleNamesWeCannotAssign.join( - "**, **", - )}**`, - }); - } - - if (rolesWeCannotRemove.length) { - const roleNamesWeCannotRemove = rolesWeCannotRemove.map( - roleId => pluginData.guild.roles.cache.get(roleId)?.name || roleId, - ); - const logs = pluginData.getPlugin(LogsPlugin); - logs.logBotAlert({ - body: `Unable to remove the following roles in Automod rule **${ruleName}**: **${roleNamesWeCannotRemove.join( - "**, **", - )}**`, - }); + let body = `Unable to change roles in Automod rule **${ruleName}**:`; + if (roleNamesWeCannotAssign.length) body += `\n**Add:** ${roleNamesWeCannotAssign.join("**, **")}}`; + if (roleNamesWeCannotRemove.length) body += `\n**Remove:** ${roleNamesWeCannotRemove.join("**, **")}}`; + logs.logBotAlert({ body }); } await Promise.all(