mirror of
https://github.com/ZeppelinBot/Zeppelin.git
synced 2025-03-15 05:41:51 +00:00
Enforce unified lock names by using functions to generate lock keys (#165)
This commit is contained in:
parent
fcbb25b7ff
commit
c5d68650a3
18 changed files with 70 additions and 28 deletions
|
@ -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();
|
||||
}),
|
||||
);
|
||||
},
|
||||
|
|
|
@ -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();
|
||||
}),
|
||||
);
|
||||
},
|
||||
|
|
|
@ -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<CensorPluginType>, 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);
|
||||
|
||||
|
|
|
@ -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<CensorPluginType>, 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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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<CountersPluginType>,
|
||||
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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, {
|
||||
|
|
|
@ -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<MutesPluginType>,
|
||||
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
},
|
||||
});
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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<SlowmodePluginType>, msg: SavedMessage) {
|
||||
if (msg.is_bot) return;
|
||||
|
@ -18,7 +19,7 @@ export async function onMessageCreate(pluginData: GuildPluginData<SlowmodePlugin
|
|||
if (!channel) return;
|
||||
|
||||
// Don't apply slowmode if the lock was interrupted earlier (e.g. the message was caught by word filters)
|
||||
const thisMsgLock = await pluginData.locks.acquire(`message-${msg.id}`);
|
||||
const thisMsgLock = await pluginData.locks.acquire(messageLock(msg));
|
||||
if (thisMsgLock.interrupted) return;
|
||||
|
||||
// Check if this channel even *has* a bot-maintained slowmode
|
||||
|
|
|
@ -3,6 +3,7 @@ import { Message, TextChannel } from "eris";
|
|||
import { UnknownUser, resolveMember, noop, resolveUser } from "../../../utils";
|
||||
import { saveMessageToStarboard } from "../util/saveMessageToStarboard";
|
||||
import { updateStarboardMessageStarCount } from "../util/updateStarboardMessageStarCount";
|
||||
import { allStarboardsLock } from "../../../utils/lockNameHelpers";
|
||||
|
||||
export const StarboardReactionAddEvt = starboardEvt({
|
||||
event: "messageReactionAdd",
|
||||
|
@ -36,7 +37,7 @@ export const StarboardReactionAddEvt = starboardEvt({
|
|||
categoryId: (msg.channel as TextChannel).parentID,
|
||||
});
|
||||
|
||||
const boardLock = await pluginData.locks.acquire(`starboards`);
|
||||
const boardLock = await pluginData.locks.acquire(allStarboardsLock());
|
||||
|
||||
const applicableStarboards = Object.values(config.boards)
|
||||
.filter(board => board.enabled)
|
||||
|
|
|
@ -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();
|
||||
},
|
||||
|
|
26
backend/src/utils/lockNameHelpers.ts
Normal file
26
backend/src/utils/lockNameHelpers.ts
Normal file
|
@ -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}`;
|
||||
}
|
Loading…
Add table
Reference in a new issue