Fix nested tag limiter

This commit is contained in:
Dragory 2021-08-21 01:05:34 +03:00
parent 05df81ddca
commit 204a8619ae
No known key found for this signature in database
GPG key ID: 5F387BA66DF8AAC1

View file

@ -5,16 +5,17 @@ import { renderRecursively, StrictMessageContent } from "../../../utils";
import { TagsPluginType, TTag } from "../types"; import { TagsPluginType, TTag } from "../types";
import { findTagByName } from "./findTagByName"; import { findTagByName } from "./findTagByName";
const MAX_TAG_FN_CALLS = 25;
export async function renderTagBody( export async function renderTagBody(
pluginData: GuildPluginData<TagsPluginType>, pluginData: GuildPluginData<TagsPluginType>,
body: TTag, body: TTag,
args: TemplateSafeValue[] = [], args: TemplateSafeValue[] = [],
extraData = {}, extraData = {},
subTagPermissionMatchParams?: ExtendedMatchParams, subTagPermissionMatchParams?: ExtendedMatchParams,
tagFnCallsObj = { calls: 0 },
): Promise<StrictMessageContent> { ): Promise<StrictMessageContent> {
const dynamicVars = {}; const dynamicVars = {};
const maxTagFnCalls = 25;
let tagFnCalls = 0;
const data = new TemplateSafeValueContainer({ const data = new TemplateSafeValueContainer({
args, args,
@ -33,7 +34,7 @@ export async function renderTagBody(
return dynamicVars[name] == null ? "" : dynamicVars[name]; return dynamicVars[name] == null ? "" : dynamicVars[name];
}, },
tag: async (name, ...subTagArgs) => { tag: async (name, ...subTagArgs) => {
if (tagFnCalls++ > maxTagFnCalls) return "\\_recursion\\_"; if (++tagFnCallsObj.calls > MAX_TAG_FN_CALLS) return "";
if (typeof name !== "string") return ""; if (typeof name !== "string") return "";
if (name === "") return ""; if (name === "") return "";
@ -47,7 +48,14 @@ export async function renderTagBody(
return "<embed>"; return "<embed>";
} }
const rendered = await renderTagBody(pluginData, subTagBody, subTagArgs, extraData, subTagPermissionMatchParams); const rendered = await renderTagBody(
pluginData,
subTagBody,
subTagArgs,
extraData,
subTagPermissionMatchParams,
tagFnCallsObj,
);
return rendered.content!; return rendered.content!;
}, },
}); });