From 00bc3ca275a8bd3ce9dc0a490736c3e10c784b33 Mon Sep 17 00:00:00 2001 From: metal Date: Tue, 21 Sep 2021 10:45:49 +0000 Subject: [PATCH] cleanup --- .../src/plugins/ModActions/commands/BanCmd.ts | 12 +++-- .../plugins/ModActions/commands/UnbanCmd.ts | 2 +- .../plugins/ModActions/functions/banUserId.ts | 21 ++++---- .../functions/outdatedTempbansLoop.ts | 47 ++-------------- .../Mutes/functions/clearExpiredMutes.ts | 37 ++----------- .../src/plugins/Mutes/functions/muteUser.ts | 12 +++-- .../src/plugins/Mutes/functions/unmuteUser.ts | 14 +++-- backend/src/utils/timers.ts | 53 +++++++++++++++++++ 8 files changed, 99 insertions(+), 99 deletions(-) diff --git a/backend/src/plugins/ModActions/commands/BanCmd.ts b/backend/src/plugins/ModActions/commands/BanCmd.ts index 5ab55c28..5a092ae2 100644 --- a/backend/src/plugins/ModActions/commands/BanCmd.ts +++ b/backend/src/plugins/ModActions/commands/BanCmd.ts @@ -16,7 +16,8 @@ import { readContactMethodsFromArgs } from "../functions/readContactMethodsFromA import { modActionsCmd } from "../types"; import { LogsPlugin } from "../../Logs/LogsPlugin"; import moment from "moment"; -import { addTimer, removeTimer, removeTimerByUserId } from "../functions/outdatedTempbansLoop"; +import { clearTempBan } from "../functions/outdatedTempbansLoop"; +import { addTimer, removeTimer, removeTimerByUserId } from "src/utils/timers"; const opts = { mod: ct.member({ option: true }), @@ -96,13 +97,18 @@ export const BanCmd = modActionsCmd({ if (existingTempban) { pluginData.state.tempbans.updateExpiryTime(user.id, time, mod.id); removeTimer(pluginData, existingTempban); - addTimer(pluginData, { + const newBanObj = { ...existingTempban, expires_at: moment().utc().add(time, "ms").format("YYYY-MM-DD HH:mm:ss"), + }; + addTimer(pluginData, newBanObj, async () => { + await clearTempBan(pluginData, newBanObj); }); } else { const tempban = await pluginData.state.tempbans.addTempban(user.id, time, mod.id); - addTimer(pluginData, tempban); + addTimer(pluginData, tempban, async () => { + await clearTempBan(pluginData, tempban); + }); } } else if (existingTempban) { pluginData.state.tempbans.clear(user.id); diff --git a/backend/src/plugins/ModActions/commands/UnbanCmd.ts b/backend/src/plugins/ModActions/commands/UnbanCmd.ts index f2a2c79d..e8b7c9a7 100644 --- a/backend/src/plugins/ModActions/commands/UnbanCmd.ts +++ b/backend/src/plugins/ModActions/commands/UnbanCmd.ts @@ -10,7 +10,7 @@ import { formatReasonWithAttachments } from "../functions/formatReasonWithAttach import { ignoreEvent } from "../functions/ignoreEvent"; import { IgnoredEventType, modActionsCmd } from "../types"; import { LogsPlugin } from "../../Logs/LogsPlugin"; -import { removeTimerByUserId } from "../functions/outdatedTempbansLoop"; +import { removeTimerByUserId } from "src/utils/timers"; const opts = { mod: ct.member({ option: true }), diff --git a/backend/src/plugins/ModActions/functions/banUserId.ts b/backend/src/plugins/ModActions/functions/banUserId.ts index 28c87b88..38dd360c 100644 --- a/backend/src/plugins/ModActions/functions/banUserId.ts +++ b/backend/src/plugins/ModActions/functions/banUserId.ts @@ -6,21 +6,15 @@ import { CaseTypes } from "../../../data/CaseTypes"; import { LogType } from "../../../data/LogType"; import { logger } from "../../../logger"; import { renderTemplate, TemplateSafeValueContainer } from "../../../templateFormatter"; -import { - createUserNotificationError, - notifyUser, - resolveUser, - stripObjectToScalars, - ucfirst, - UserNotificationResult, -} from "../../../utils"; +import { createUserNotificationError, notifyUser, resolveUser, ucfirst, UserNotificationResult } from "../../../utils"; import { CasesPlugin } from "../../Cases/CasesPlugin"; import { BanOptions, BanResult, IgnoredEventType, ModActionsPluginType } from "../types"; import { getDefaultContactMethods } from "./getDefaultContactMethods"; import { ignoreEvent } from "./ignoreEvent"; import { LogsPlugin } from "../../Logs/LogsPlugin"; -import { addTimer, removeTimer } from "./outdatedTempbansLoop"; +import { clearTempBan } from "./outdatedTempbansLoop"; import moment from "moment"; +import { addTimer, removeTimer } from "src/utils/timers"; /** * Ban the specified user id, whether or not they're actually on the server at the time. Generates a case. @@ -112,13 +106,18 @@ export async function banUserId( if (existingTempban) { pluginData.state.tempbans.updateExpiryTime(user.id, banTime, banOptions.modId ?? selfId); removeTimer(pluginData, existingTempban); - addTimer(pluginData, { + const newBanObj = { ...existingTempban, expires_at: moment().utc().add(banTime, "ms").format("YYYY-MM-DD HH:mm:ss"), + }; + addTimer(pluginData, newBanObj, async () => { + await clearTempBan(pluginData, newBanObj); }); } else { const tempban = await pluginData.state.tempbans.addTempban(user.id, banTime, banOptions.modId ?? selfId); - addTimer(pluginData, tempban); + addTimer(pluginData, tempban, async () => { + await clearTempBan(pluginData, tempban); + }); } } diff --git a/backend/src/plugins/ModActions/functions/outdatedTempbansLoop.ts b/backend/src/plugins/ModActions/functions/outdatedTempbansLoop.ts index 4926ea4e..9a992b92 100644 --- a/backend/src/plugins/ModActions/functions/outdatedTempbansLoop.ts +++ b/backend/src/plugins/ModActions/functions/outdatedTempbansLoop.ts @@ -13,51 +13,10 @@ import { ignoreEvent } from "./ignoreEvent"; import { isBanned } from "./isBanned"; import { LogsPlugin } from "../../Logs/LogsPlugin"; import { Tempban } from "src/data/entities/Tempban"; -import { ExpiringTimer } from "src/utils/timers"; +import { addTimer } from "src/utils/timers"; const LOAD_LESS_THAN_MIN_COUNT = 60 * MINUTES; -export function addTimer(pluginData: GuildPluginData, tempban: Tempban) { - const existingMute = pluginData.state.timers.find( - (tm) => tm.options.key === tempban.user_id && tm.options.guildId === tempban.guild_id && !tm.done, - ); // for future-proof when you do global events - if (!existingMute && tempban.expires_at) { - const exp = moment(tempban.expires_at!).toDate().getTime() - moment.utc().toDate().getTime(); - const newTimer = new ExpiringTimer({ - key: tempban.user_id, - guildId: tempban.guild_id, - plugin: "tempban", - expiry: exp, - callback: async () => { - await clearTempBan(pluginData, tempban); - }, - }); - pluginData.state.timers.push(newTimer); - } -} - -export function removeTimer(pluginData: GuildPluginData, tempban: Tempban) { - const existingMute = pluginData.state.timers.findIndex( - (tm) => tm.options.key === tempban.user_id && tm.options.guildId === tempban.guild_id && !tm.done, - ); - if (existingMute) { - const tm = pluginData.state.timers[existingMute]; - tm.clear(); - tm.done = true; - pluginData.state.timers.splice(existingMute, 1); - } -} - -export function removeTimerByUserId(pluginData: GuildPluginData, user_id: Snowflake) { - const existingMute = pluginData.state.timers.findIndex((tm) => tm.options.key === user_id && !tm.done); - if (existingMute) { - const tm = pluginData.state.timers[existingMute]; - tm.clear(); - tm.done = true; - pluginData.state.timers.splice(existingMute, 1); - } -} - export async function loadExpiringTimers(pluginData: GuildPluginData) { const now = moment.utc().toDate().getTime(); pluginData.state.timers = pluginData.state.timers.filter((tm) => !tm.done || !tm.timeout); @@ -72,7 +31,9 @@ export async function loadExpiringTimers(pluginData: GuildPluginData now + LOAD_LESS_THAN_MIN_COUNT) continue; // exclude timers that are expiring in over 180 mins - addTimer(pluginData, tempban); + addTimer(pluginData, tempban, async () => { + await clearTempBan(pluginData, tempban); + }); } for (const tempban of expiredBans) { diff --git a/backend/src/plugins/Mutes/functions/clearExpiredMutes.ts b/backend/src/plugins/Mutes/functions/clearExpiredMutes.ts index 56c48ac9..f0116603 100644 --- a/backend/src/plugins/Mutes/functions/clearExpiredMutes.ts +++ b/backend/src/plugins/Mutes/functions/clearExpiredMutes.ts @@ -3,43 +3,12 @@ import { MINUTES, resolveMember, UnknownUser, verboseUserMention } from "../../. import { memberRolesLock } from "../../../utils/lockNameHelpers"; import { MutesPluginType } from "../types"; import { LogsPlugin } from "../../Logs/LogsPlugin"; -import { ExpiringTimer } from "src/utils/timers"; import { Mute } from "src/data/entities/Mute"; import moment from "moment"; +import { addTimer } from "src/utils/timers"; const LOAD_LESS_THAN_MIN_COUNT = 60 * MINUTES; -export function addTimer(pluginData: GuildPluginData, mute: Mute) { - const existingMute = pluginData.state.timers.find( - (tm) => tm.options.key === mute.user_id && tm.options.guildId === mute.guild_id && !tm.done, - ); // for future-proof when you do global events - if (!existingMute && mute.expires_at) { - const exp = moment(mute.expires_at!).toDate().getTime() - moment.utc().toDate().getTime(); - const newTimer = new ExpiringTimer({ - key: mute.user_id, - guildId: mute.guild_id, - plugin: "mutes", - expiry: exp, - callback: async () => { - await clearExpiredMute(pluginData, mute); - }, - }); - pluginData.state.timers.push(newTimer); - } -} - -export function removeTimer(pluginData: GuildPluginData, mute: Mute) { - const existingMute = pluginData.state.timers.findIndex( - (tm) => tm.options.key === mute.user_id && tm.options.guildId === mute.guild_id && !tm.done, - ); - if (existingMute) { - const tm = pluginData.state.timers[existingMute]; - tm.clear(); - tm.done = true; - pluginData.state.timers.splice(existingMute, 1); - } -} - export async function loadExpiringTimers(pluginData: GuildPluginData) { const now = moment.utc().toDate().getTime(); pluginData.state.timers = pluginData.state.timers.filter((tm) => !tm.done || !tm.timeout); @@ -54,7 +23,9 @@ export async function loadExpiringTimers(pluginData: GuildPluginData now + LOAD_LESS_THAN_MIN_COUNT) continue; // exclude timers that are expiring in over 180 mins - addTimer(pluginData, mute); + addTimer(pluginData, mute, async () => { + await clearExpiredMute(pluginData, mute); + }); } for (const mute of expiredMutes) { diff --git a/backend/src/plugins/Mutes/functions/muteUser.ts b/backend/src/plugins/Mutes/functions/muteUser.ts index a9407653..3dc7bc4f 100644 --- a/backend/src/plugins/Mutes/functions/muteUser.ts +++ b/backend/src/plugins/Mutes/functions/muteUser.ts @@ -19,8 +19,9 @@ import { import { muteLock } from "../../../utils/lockNameHelpers"; import { CasesPlugin } from "../../Cases/CasesPlugin"; import { MuteOptions, MutesPluginType } from "../types"; -import { addTimer, removeTimer } from "./clearExpiredMutes"; +import { clearExpiredMute } from "./clearExpiredMutes"; import moment from "moment"; +import { addTimer, removeTimer } from "src/utils/timers"; export async function muteUser( pluginData: GuildPluginData, @@ -142,13 +143,18 @@ export async function muteUser( } await pluginData.state.mutes.updateExpiryTime(user.id, muteTime, rolesToRestore); removeTimer(pluginData, existingMute); - addTimer(pluginData, { + const newMuteObj = { ...existingMute, expires_at: moment().utc().add(muteTime, "ms").format("YYYY-MM-DD HH:mm:ss"), + }; + addTimer(pluginData, newMuteObj, async () => { + await clearExpiredMute(pluginData, newMuteObj); }); } else { const mute = await pluginData.state.mutes.addMute(user.id, muteTime, rolesToRestore); - addTimer(pluginData, mute); + addTimer(pluginData, mute, async () => { + await clearExpiredMute(pluginData, mute); + }); } const template = existingMute diff --git a/backend/src/plugins/Mutes/functions/unmuteUser.ts b/backend/src/plugins/Mutes/functions/unmuteUser.ts index b431d1f7..7ac4f3ee 100644 --- a/backend/src/plugins/Mutes/functions/unmuteUser.ts +++ b/backend/src/plugins/Mutes/functions/unmuteUser.ts @@ -1,9 +1,7 @@ import { Snowflake } from "discord.js"; import humanizeDuration from "humanize-duration"; import { GuildPluginData } from "knub"; -import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects"; import { CaseTypes } from "../../../data/CaseTypes"; -import { LogType } from "../../../data/LogType"; import { resolveMember, resolveUser } from "../../../utils"; import { memberRolesLock } from "../../../utils/lockNameHelpers"; import { CasesPlugin } from "../../Cases/CasesPlugin"; @@ -11,8 +9,9 @@ import { CaseArgs } from "../../Cases/types"; import { MutesPluginType, UnmuteResult } from "../types"; import { memberHasMutedRole } from "./memberHasMutedRole"; import { LogsPlugin } from "../../Logs/LogsPlugin"; -import { addTimer, removeTimer } from "./clearExpiredMutes"; +import { clearExpiredMute } from "./clearExpiredMutes"; import moment from "moment"; +import { addTimer, removeTimer } from "src/utils/timers"; export async function unmuteUser( pluginData: GuildPluginData, @@ -31,13 +30,18 @@ export async function unmuteUser( // Schedule timed unmute (= just set the mute's duration) if (!existingMute) { const mute = await pluginData.state.mutes.addMute(userId, unmuteTime); - addTimer(pluginData, mute); + addTimer(pluginData, mute, async () => { + await clearExpiredMute(pluginData, mute); + }); } else { await pluginData.state.mutes.updateExpiryTime(userId, unmuteTime); removeTimer(pluginData, existingMute); - addTimer(pluginData, { + const newMuteObj = { ...existingMute, expires_at: moment().utc().add(unmuteTime, "ms").format("YYYY-MM-DD HH:mm:ss"), + }; + addTimer(pluginData, newMuteObj, async () => { + await clearExpiredMute(pluginData, newMuteObj); }); } } else { diff --git a/backend/src/utils/timers.ts b/backend/src/utils/timers.ts index abce0643..b4dc14b3 100644 --- a/backend/src/utils/timers.ts +++ b/backend/src/utils/timers.ts @@ -1,4 +1,11 @@ import { Snowflake } from "discord-api-types"; +import { GuildPluginData } from "knub"; +import moment from "moment"; +import { Mute } from "src/data/entities/Mute"; +import { Tempban } from "src/data/entities/Tempban"; +import { ModActionsPluginType } from "src/plugins/ModActions/types"; +import { MutesPluginType } from "src/plugins/Mutes/types"; +import { RemindersPluginType } from "src/plugins/Reminders/types"; type TimerCallback = (key: string, expiry: number) => void; @@ -38,3 +45,49 @@ export class ExpiringTimer { this.init(); } } + +export function addTimer( + pluginData: GuildPluginData, + obj: Mute | Tempban, + callback: () => void, +) { + const existing = pluginData.state.timers.find( + (tm) => tm.options.key === obj.user_id && tm.options.guildId === obj.guild_id && !tm.done, + ); // for future-proof when you do global events + if (!existing && obj.expires_at) { + const exp = moment(obj.expires_at!).toDate().getTime() - moment.utc().toDate().getTime(); + const newTimer = new ExpiringTimer({ + key: obj.user_id, + guildId: obj.guild_id, + plugin: "mutes", + expiry: exp, + callback, + }); + pluginData.state.timers.push(newTimer); + } +} + +export function removeTimer(pluginData: GuildPluginData, obj: Mute | Tempban) { + const existing = pluginData.state.timers.findIndex( + (tm) => tm.options.key === obj.user_id && tm.options.guildId === obj.guild_id && !tm.done, + ); + if (existing) { + const tm = pluginData.state.timers[existing]; + tm.clear(); + tm.done = true; + pluginData.state.timers.splice(existing, 1); + } +} + +export function removeTimerByUserId( + pluginData: GuildPluginData, + user_id: Snowflake, +) { + const existing = pluginData.state.timers.findIndex((tm) => tm.options.key === user_id && !tm.done); + if (existing) { + const tm = pluginData.state.timers[existing]; + tm.clear(); + tm.done = true; + pluginData.state.timers.splice(existing, 1); + } +}