From e3d734801dc511e2fb638e3572ca52d7a5a9ba4b Mon Sep 17 00:00:00 2001 From: Dragory <2606411+Dragory@users.noreply.github.com> Date: Sun, 13 Oct 2019 00:21:35 +0300 Subject: [PATCH] Cache invites when resolving them --- src/plugins/Automod.ts | 17 +++-------------- src/plugins/Censor.ts | 2 +- src/plugins/ZeppelinPlugin.ts | 17 ++++++++++++++++- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/plugins/Automod.ts b/src/plugins/Automod.ts index a683a98a..ff86c249 100644 --- a/src/plugins/Automod.ts +++ b/src/plugins/Automod.ts @@ -16,13 +16,11 @@ import { UnknownUser, verboseChannelMention, } from "../utils"; -import { decorators as d } from "knub"; import { mergeConfig } from "knub/dist/configUtils"; -import { Invite, Member, Message, TextChannel } from "eris"; +import { Invite, Member, TextChannel } from "eris"; import escapeStringRegexp from "escape-string-regexp"; import { SimpleCache } from "../SimpleCache"; import { Queue } from "../Queue"; -import Timeout = NodeJS.Timeout; import { ModActionsPlugin } from "./ModActions"; import { MutesPlugin } from "./Mutes"; import { LogsPlugin } from "./Logs"; @@ -34,6 +32,7 @@ import { GuildLogs } from "../data/GuildLogs"; import { SavedMessage } from "../data/entities/SavedMessage"; import moment from "moment-timezone"; import { renderTemplate } from "../templateFormatter"; +import Timeout = NodeJS.Timeout; type MessageInfo = { channelId: string; messageId: string }; @@ -585,17 +584,7 @@ export class AutomodPlugin extends ZeppelinPlugin { } } - const invites: Array = await Promise.all( - uniqueInviteCodes.map(async code => { - if (inviteCache.has(code)) { - return inviteCache.get(code); - } else { - const invite = await this.bot.getInvite(code).catch(noop); - inviteCache.set(code, invite); - return invite; - } - }), - ); + const invites: Array = await Promise.all(uniqueInviteCodes.map(code => this.resolveInvite(code))); for (const invite of invites) { if (!invite) return true; diff --git a/src/plugins/Censor.ts b/src/plugins/Censor.ts index 4647bb77..9ffa8e0d 100644 --- a/src/plugins/Censor.ts +++ b/src/plugins/Censor.ts @@ -167,7 +167,7 @@ export class CensorPlugin extends ZeppelinPlugin { const inviteCodes = getInviteCodesInString(messageContent); - let invites: Invite[] = await Promise.all(inviteCodes.map(code => this.bot.getInvite(code).catch(() => null))); + let invites: Invite[] = await Promise.all(inviteCodes.map(code => this.resolveInvite(code))); invites = invites.filter(v => !!v); diff --git a/src/plugins/ZeppelinPlugin.ts b/src/plugins/ZeppelinPlugin.ts index 8055b20e..595232e8 100644 --- a/src/plugins/ZeppelinPlugin.ts +++ b/src/plugins/ZeppelinPlugin.ts @@ -8,6 +8,7 @@ import { deepKeyIntersect, isSnowflake, isUnicodeEmoji, + MINUTES, resolveMember, resolveUser, resolveUserId, @@ -15,11 +16,12 @@ import { trimIndents, UnknownUser, } from "../utils"; -import { Member, User } from "eris"; +import { Invite, Member, User } from "eris"; import DiscordRESTError from "eris/lib/errors/DiscordRESTError"; // tslint:disable-line import { performance } from "perf_hooks"; import { decodeAndValidateStrict, StrictValidationError } from "../validatorUtils"; import { mergeConfig } from "knub/dist/configUtils"; +import { SimpleCache } from "../SimpleCache"; const SLOW_RESOLVE_THRESHOLD = 1500; @@ -53,6 +55,8 @@ export function trimPluginDescription(str) { return trimIndents(emptyLinesTrimmed, lastLineIndentation); } +const inviteCache = new SimpleCache>(10 * MINUTES, 200); + export class ZeppelinPlugin extends Plugin { public static pluginInfo: PluginInfo; public static showInDocs: boolean = true; @@ -255,4 +259,15 @@ export class ZeppelinPlugin extends Plug return member; } + + async resolveInvite(code: string): Promise { + if (inviteCache.has(code)) { + return inviteCache.get(code); + } + + const promise = this.bot.getInvite(code).catch(() => null); + inviteCache.set(code, promise); + + return promise; + } }