diff --git a/backend/src/plugins/Automod/actions/addRoles.ts b/backend/src/plugins/Automod/actions/addRoles.ts index 4da915e7..976300a5 100644 --- a/backend/src/plugins/Automod/actions/addRoles.ts +++ b/backend/src/plugins/Automod/actions/addRoles.ts @@ -9,6 +9,7 @@ import { getMissingPermissions } from "../../../utils/getMissingPermissions"; import { canAssignRole } from "../../../utils/canAssignRole"; import { missingPermissionError } from "../../../utils/missingPermissionError"; import { ignoreRoleChange } from "../functions/ignoredRoleChanges"; +import { memberRolesLock } from "../../../utils/lockNameHelpers"; const p = Constants.Permissions; @@ -64,7 +65,7 @@ export const AddRolesAction = automodAction({ return; } - const memberRolesLock = await pluginData.locks.acquire(`member-roles-${member.id}`); + const memberRoleLock = await pluginData.locks.acquire(memberRolesLock(member)); const rolesArr = Array.from(memberRoles.values()); await member.edit({ @@ -72,7 +73,7 @@ export const AddRolesAction = automodAction({ }); member.roles = rolesArr; // Make sure we know of the new roles internally as well - memberRolesLock.unlock(); + memberRoleLock.unlock(); }), ); }, diff --git a/backend/src/plugins/Automod/actions/removeRoles.ts b/backend/src/plugins/Automod/actions/removeRoles.ts index 6049cbf2..c6c74e49 100644 --- a/backend/src/plugins/Automod/actions/removeRoles.ts +++ b/backend/src/plugins/Automod/actions/removeRoles.ts @@ -10,6 +10,7 @@ import { missingPermissionError } from "../../../utils/missingPermissionError"; import { canAssignRole } from "../../../utils/canAssignRole"; import { Constants } from "eris"; import { ignoreRoleChange } from "../functions/ignoredRoleChanges"; +import { memberRolesLock } from "../../../utils/lockNameHelpers"; const p = Constants.Permissions; @@ -66,7 +67,7 @@ export const RemoveRolesAction = automodAction({ return; } - const memberRolesLock = await pluginData.locks.acquire(`member-roles-${member.id}`); + const memberRoleLock = await pluginData.locks.acquire(memberRolesLock(member)); const rolesArr = Array.from(memberRoles.values()); await member.edit({ @@ -74,7 +75,7 @@ export const RemoveRolesAction = automodAction({ }); member.roles = rolesArr; // Make sure we know of the new roles internally as well - memberRolesLock.unlock(); + memberRoleLock.unlock(); }), ); }, diff --git a/backend/src/plugins/Censor/util/onMessageCreate.ts b/backend/src/plugins/Censor/util/onMessageCreate.ts index 2042126d..fb9cfaeb 100644 --- a/backend/src/plugins/Censor/util/onMessageCreate.ts +++ b/backend/src/plugins/Censor/util/onMessageCreate.ts @@ -2,10 +2,11 @@ import { GuildPluginData } from "knub"; import { CensorPluginType } from "../types"; import { SavedMessage } from "../../../data/entities/SavedMessage"; import { applyFiltersToMsg } from "./applyFiltersToMsg"; +import { messageLock } from "../../../utils/lockNameHelpers"; export async function onMessageCreate(pluginData: GuildPluginData, savedMessage: SavedMessage) { if (savedMessage.is_bot) return; - const lock = await pluginData.locks.acquire(`message-${savedMessage.id}`); + const lock = await pluginData.locks.acquire(messageLock(savedMessage)); const wasDeleted = await applyFiltersToMsg(pluginData, savedMessage); diff --git a/backend/src/plugins/Censor/util/onMessageUpdate.ts b/backend/src/plugins/Censor/util/onMessageUpdate.ts index 4c279caa..7afd4c17 100644 --- a/backend/src/plugins/Censor/util/onMessageUpdate.ts +++ b/backend/src/plugins/Censor/util/onMessageUpdate.ts @@ -2,10 +2,11 @@ import { GuildPluginData } from "knub"; import { CensorPluginType } from "../types"; import { SavedMessage } from "../../../data/entities/SavedMessage"; import { applyFiltersToMsg } from "./applyFiltersToMsg"; +import { messageLock } from "../../../utils/lockNameHelpers"; export async function onMessageUpdate(pluginData: GuildPluginData, savedMessage: SavedMessage) { if (savedMessage.is_bot) return; - const lock = await pluginData.locks.acquire(`message-${savedMessage.id}`); + const lock = await pluginData.locks.acquire(messageLock(savedMessage)); const wasDeleted = await applyFiltersToMsg(pluginData, savedMessage); diff --git a/backend/src/plugins/Counters/functions/changeCounterValue.ts b/backend/src/plugins/Counters/functions/changeCounterValue.ts index be214eb7..d5da6825 100644 --- a/backend/src/plugins/Counters/functions/changeCounterValue.ts +++ b/backend/src/plugins/Counters/functions/changeCounterValue.ts @@ -1,4 +1,5 @@ import { GuildPluginData } from "knub"; +import { counterIdLock } from "../../../utils/lockNameHelpers"; import { CountersPluginType } from "../types"; import { checkCounterTrigger } from "./checkCounterTrigger"; import { checkReverseCounterTrigger } from "./checkReverseCounterTrigger"; @@ -28,7 +29,7 @@ export async function changeCounterValue( userId = counter.per_user ? userId : null; const counterId = pluginData.state.counterIds[counterName]; - const lock = await pluginData.locks.acquire(counterId.toString()); + const lock = await pluginData.locks.acquire(counterIdLock(counterId)); await pluginData.state.counters.changeCounterValue(counterId, channelId, userId, change); diff --git a/backend/src/plugins/Counters/functions/decayCounter.ts b/backend/src/plugins/Counters/functions/decayCounter.ts index 175cb158..7db4cef3 100644 --- a/backend/src/plugins/Counters/functions/decayCounter.ts +++ b/backend/src/plugins/Counters/functions/decayCounter.ts @@ -2,6 +2,7 @@ import { GuildPluginData } from "knub"; import { CountersPluginType } from "../types"; import { checkAllValuesForTrigger } from "./checkAllValuesForTrigger"; import { checkAllValuesForReverseTrigger } from "./checkAllValuesForReverseTrigger"; +import { counterIdLock } from "../../../utils/lockNameHelpers"; export async function decayCounter( pluginData: GuildPluginData, @@ -16,7 +17,7 @@ export async function decayCounter( } const counterId = pluginData.state.counterIds[counterName]; - const lock = await pluginData.locks.acquire(counterId.toString()); + const lock = await pluginData.locks.acquire(counterIdLock(counterId)); await pluginData.state.counters.decay(counterId, decayPeriodMS, decayAmount); diff --git a/backend/src/plugins/Counters/functions/setCounterValue.ts b/backend/src/plugins/Counters/functions/setCounterValue.ts index 2eefed8f..697c8503 100644 --- a/backend/src/plugins/Counters/functions/setCounterValue.ts +++ b/backend/src/plugins/Counters/functions/setCounterValue.ts @@ -1,4 +1,5 @@ import { GuildPluginData } from "knub"; +import { counterIdLock } from "../../../utils/lockNameHelpers"; import { CountersPluginType } from "../types"; import { checkCounterTrigger } from "./checkCounterTrigger"; import { checkReverseCounterTrigger } from "./checkReverseCounterTrigger"; @@ -25,7 +26,7 @@ export async function setCounterValue( } const counterId = pluginData.state.counterIds[counterName]; - const lock = await pluginData.locks.acquire(counterId.toString()); + const lock = await pluginData.locks.acquire(counterIdLock(counterId)); await pluginData.state.counters.setCounterValue(counterId, channelId, userId, value); diff --git a/backend/src/plugins/ModActions/commands/BanCmd.ts b/backend/src/plugins/ModActions/commands/BanCmd.ts index 4fe9561e..1f943087 100644 --- a/backend/src/plugins/ModActions/commands/BanCmd.ts +++ b/backend/src/plugins/ModActions/commands/BanCmd.ts @@ -8,9 +8,10 @@ import { formatReasonWithAttachments } from "../functions/formatReasonWithAttach import { banUserId } from "../functions/banUserId"; import { getMemberLevel, waitForReaction } from "knub/dist/helpers"; import humanizeDuration from "humanize-duration"; -import { CasesPlugin } from "src/plugins/Cases/CasesPlugin"; -import { CaseTypes } from "src/data/CaseTypes"; -import { LogType } from "src/data/LogType"; +import { CasesPlugin } from "../../../plugins/Cases/CasesPlugin"; +import { CaseTypes } from "../../../data/CaseTypes"; +import { LogType } from "../../../data/LogType"; +import { banLock } from "../../../utils/lockNameHelpers"; const opts = { mod: ct.member({ option: true }), @@ -62,7 +63,7 @@ export const BanCmd = modActionsCmd({ } // acquire a lock because of the needed user-inputs below (if banned/not on server) - const lock = await pluginData.locks.acquire(`ban-${user.id}`); + const lock = await pluginData.locks.acquire(banLock(user)); let forceban = false; const existingTempban = await pluginData.state.tempbans.findExistingTempbanForUserId(user.id); const banned = await isBanned(pluginData, user.id); diff --git a/backend/src/plugins/Mutes/events/ReapplyActiveMuteOnJoinEvt.ts b/backend/src/plugins/Mutes/events/ReapplyActiveMuteOnJoinEvt.ts index 890636a6..2e57e8da 100644 --- a/backend/src/plugins/Mutes/events/ReapplyActiveMuteOnJoinEvt.ts +++ b/backend/src/plugins/Mutes/events/ReapplyActiveMuteOnJoinEvt.ts @@ -1,6 +1,7 @@ import { mutesEvt } from "../types"; import { LogType } from "../../../data/LogType"; import { stripObjectToScalars } from "../../../utils"; +import { memberRolesLock } from "../../../utils/lockNameHelpers"; /** * Reapply active mutes on join @@ -11,9 +12,9 @@ export const ReapplyActiveMuteOnJoinEvt = mutesEvt("guildMemberAdd", async ({ pl const muteRole = pluginData.config.get().mute_role; if (muteRole) { - const memberRolesLock = await pluginData.locks.acquire(`member-roles-${member.id}`); + const memberRoleLock = await pluginData.locks.acquire(memberRolesLock(member)); await member.addRole(muteRole); - memberRolesLock.unlock(); + memberRoleLock.unlock(); } pluginData.state.serverLogs.log(LogType.MEMBER_MUTE_REJOIN, { diff --git a/backend/src/plugins/Mutes/functions/muteUser.ts b/backend/src/plugins/Mutes/functions/muteUser.ts index 393a00e1..29ba54ab 100644 --- a/backend/src/plugins/Mutes/functions/muteUser.ts +++ b/backend/src/plugins/Mutes/functions/muteUser.ts @@ -17,8 +17,8 @@ import { CasesPlugin } from "../../Cases/CasesPlugin"; import { CaseTypes } from "../../../data/CaseTypes"; import { LogType } from "../../../data/LogType"; import { Case } from "../../../data/entities/Case"; -import { sendErrorMessage } from "src/pluginUtils"; -import { LogsPlugin } from "src/plugins/Logs/LogsPlugin"; +import { LogsPlugin } from "../../../plugins/Logs/LogsPlugin"; +import { muteLock } from "../../../utils/lockNameHelpers"; export async function muteUser( pluginData: GuildPluginData, @@ -29,7 +29,7 @@ export async function muteUser( removeRolesOnMuteOverride: boolean | string[] | null = null, restoreRolesOnMuteOverride: boolean | string[] | null = null, ) { - const lock = await pluginData.locks.acquire(`mute-${userId}`); + const lock = await pluginData.locks.acquire(muteLock({ id: userId })); const muteRole = pluginData.config.get().mute_role; if (!muteRole) { diff --git a/backend/src/plugins/Persist/events/LoadDataEvt.ts b/backend/src/plugins/Persist/events/LoadDataEvt.ts index e88cb333..bd356acb 100644 --- a/backend/src/plugins/Persist/events/LoadDataEvt.ts +++ b/backend/src/plugins/Persist/events/LoadDataEvt.ts @@ -7,6 +7,7 @@ import { getMissingPermissions } from "../../../utils/getMissingPermissions"; import { LogsPlugin } from "../../Logs/LogsPlugin"; import { missingPermissionError } from "../../../utils/missingPermissionError"; import { canAssignRole } from "../../../utils/canAssignRole"; +import { memberRolesLock } from "../../../utils/lockNameHelpers"; const p = Constants.Permissions; @@ -17,11 +18,11 @@ export const LoadDataEvt = persistEvt({ const member = meta.args.member; const pluginData = meta.pluginData; - const memberRolesLock = await pluginData.locks.acquire(`member-roles-${member.id}`); + const memberRoleLock = await pluginData.locks.acquire(memberRolesLock(member)); const persistedData = await pluginData.state.persistedData.find(member.id); if (!persistedData) { - memberRolesLock.unlock(); + memberRoleLock.unlock(); return; } @@ -79,6 +80,6 @@ export const LoadDataEvt = persistEvt({ }); } - memberRolesLock.unlock(); + memberRoleLock.unlock(); }, }); diff --git a/backend/src/plugins/ReactionRoles/util/addMemberPendingRoleChange.ts b/backend/src/plugins/ReactionRoles/util/addMemberPendingRoleChange.ts index 2b2dfd0d..00ae6108 100644 --- a/backend/src/plugins/ReactionRoles/util/addMemberPendingRoleChange.ts +++ b/backend/src/plugins/ReactionRoles/util/addMemberPendingRoleChange.ts @@ -2,6 +2,7 @@ import { GuildPluginData } from "knub"; import { ReactionRolesPluginType, RoleChangeMode, PendingMemberRoleChanges } from "../types"; import { resolveMember } from "../../../utils"; import { logger } from "../../../logger"; +import { memberRolesLock } from "../../../utils/lockNameHelpers"; const ROLE_CHANGE_BATCH_DEBOUNCE_TIME = 1500; @@ -18,7 +19,7 @@ export async function addMemberPendingRoleChange( applyFn: async () => { pluginData.state.pendingRoleChanges.delete(memberId); - const lock = await pluginData.locks.acquire(`member-roles-${memberId}`); + const lock = await pluginData.locks.acquire(memberRolesLock({ id: memberId })); const member = await resolveMember(pluginData.client, pluginData.guild, memberId); if (member) { diff --git a/backend/src/plugins/SelfGrantableRoles/commands/RoleAddCmd.ts b/backend/src/plugins/SelfGrantableRoles/commands/RoleAddCmd.ts index 2c9a1d0f..8fe86f04 100644 --- a/backend/src/plugins/SelfGrantableRoles/commands/RoleAddCmd.ts +++ b/backend/src/plugins/SelfGrantableRoles/commands/RoleAddCmd.ts @@ -6,6 +6,7 @@ import { splitRoleNames } from "../util/splitRoleNames"; import { normalizeRoleNames } from "../util/normalizeRoleNames"; import { findMatchingRoles } from "../util/findMatchingRoles"; import { Role } from "eris"; +import { memberRolesLock } from "../../../utils/lockNameHelpers"; export const RoleAddCmd = selfGrantableRolesCmd({ trigger: ["role", "role add"], @@ -16,7 +17,7 @@ export const RoleAddCmd = selfGrantableRolesCmd({ }, async run({ message: msg, args, pluginData }) { - const lock = await pluginData.locks.acquire(`grantableRoles:${msg.author.id}`); + const lock = await pluginData.locks.acquire(memberRolesLock(msg.author)); const applyingEntries = getApplyingEntries(pluginData, msg); if (applyingEntries.length === 0) { diff --git a/backend/src/plugins/SelfGrantableRoles/commands/RoleRemoveCmd.ts b/backend/src/plugins/SelfGrantableRoles/commands/RoleRemoveCmd.ts index 7cabb3c4..c2011e05 100644 --- a/backend/src/plugins/SelfGrantableRoles/commands/RoleRemoveCmd.ts +++ b/backend/src/plugins/SelfGrantableRoles/commands/RoleRemoveCmd.ts @@ -5,6 +5,7 @@ import { sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; import { splitRoleNames } from "../util/splitRoleNames"; import { normalizeRoleNames } from "../util/normalizeRoleNames"; import { findMatchingRoles } from "../util/findMatchingRoles"; +import { memberRolesLock } from "../../../utils/lockNameHelpers"; export const RoleRemoveCmd = selfGrantableRolesCmd({ trigger: "role remove", @@ -15,7 +16,7 @@ export const RoleRemoveCmd = selfGrantableRolesCmd({ }, async run({ message: msg, args, pluginData }) { - const lock = await pluginData.locks.acquire(`grantableRoles:${msg.author.id}`); + const lock = await pluginData.locks.acquire(memberRolesLock(msg.author)); const applyingEntries = getApplyingEntries(pluginData, msg); if (applyingEntries.length === 0) { diff --git a/backend/src/plugins/Slowmode/util/onMessageCreate.ts b/backend/src/plugins/Slowmode/util/onMessageCreate.ts index 8e1b8564..4f0c3989 100644 --- a/backend/src/plugins/Slowmode/util/onMessageCreate.ts +++ b/backend/src/plugins/Slowmode/util/onMessageCreate.ts @@ -10,6 +10,7 @@ import { BOT_SLOWMODE_PERMISSIONS } from "../requiredPermissions"; import { LogsPlugin } from "../../Logs/LogsPlugin"; import { LogType } from "../../../data/LogType"; import { missingPermissionError } from "../../../utils/missingPermissionError"; +import { messageLock } from "../../../utils/lockNameHelpers"; export async function onMessageCreate(pluginData: GuildPluginData, msg: SavedMessage) { if (msg.is_bot) return; @@ -18,7 +19,7 @@ export async function onMessageCreate(pluginData: GuildPluginData board.enabled) diff --git a/backend/src/plugins/Starboard/events/StarboardReactionRemoveEvts.ts b/backend/src/plugins/Starboard/events/StarboardReactionRemoveEvts.ts index 07f85670..90160a4a 100644 --- a/backend/src/plugins/Starboard/events/StarboardReactionRemoveEvts.ts +++ b/backend/src/plugins/Starboard/events/StarboardReactionRemoveEvts.ts @@ -1,10 +1,11 @@ +import { allStarboardsLock } from "../../../utils/lockNameHelpers"; import { starboardEvt } from "../types"; export const StarboardReactionRemoveEvt = starboardEvt({ event: "messageReactionRemove", async listener(meta) { - const boardLock = await meta.pluginData.locks.acquire(`starboards`); + const boardLock = await meta.pluginData.locks.acquire(allStarboardsLock()); await meta.pluginData.state.starboardReactions.deleteStarboardReaction(meta.args.message.id, meta.args.member.id); boardLock.unlock(); }, @@ -14,7 +15,7 @@ export const StarboardReactionRemoveAllEvt = starboardEvt({ event: "messageReactionRemoveAll", async listener(meta) { - const boardLock = await meta.pluginData.locks.acquire(`starboards`); + const boardLock = await meta.pluginData.locks.acquire(allStarboardsLock()); await meta.pluginData.state.starboardReactions.deleteAllStarboardReactionsForMessageId(meta.args.message.id); boardLock.unlock(); }, diff --git a/backend/src/utils/lockNameHelpers.ts b/backend/src/utils/lockNameHelpers.ts new file mode 100644 index 00000000..4a16bd33 --- /dev/null +++ b/backend/src/utils/lockNameHelpers.ts @@ -0,0 +1,26 @@ +import { Member, Message, User } from "eris"; +import { SavedMessage } from "../data/entities/SavedMessage"; + +export function allStarboardsLock() { + return `starboards`; +} + +export function banLock(user: Member | User | { id: string }) { + return `ban-${user.id}`; +} + +export function counterIdLock(counterId: number | string) { + return `counter-${counterId}`; +} + +export function memberRolesLock(member: Member | User | { id: string }) { + return `member-roles-${member.id}`; +} + +export function messageLock(message: Message | SavedMessage | { id: string }) { + return `message-${message.id}`; +} + +export function muteLock(user: Member | User | { id: string }) { + return `mute-${user.id}`; +}