From 99438441cbdaa846eafe02404ec100a6e774e8d2 Mon Sep 17 00:00:00 2001 From: Dragory <2606411+Dragory@users.noreply.github.com> Date: Tue, 15 Sep 2020 01:54:34 +0300 Subject: [PATCH] tags: support hardcoded tags with tag() tag function --- .../src/plugins/Tags/commands/TagEvalCmd.ts | 2 +- .../src/plugins/Tags/util/findTagByName.ts | 27 +++++++++++++++++++ .../src/plugins/Tags/util/renderTagBody.ts | 19 ++++++++++--- .../plugins/Tags/util/renderTagFromString.ts | 2 +- 4 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 backend/src/plugins/Tags/util/findTagByName.ts diff --git a/backend/src/plugins/Tags/commands/TagEvalCmd.ts b/backend/src/plugins/Tags/commands/TagEvalCmd.ts index 0e585f4e..783bfff2 100644 --- a/backend/src/plugins/Tags/commands/TagEvalCmd.ts +++ b/backend/src/plugins/Tags/commands/TagEvalCmd.ts @@ -15,7 +15,7 @@ export const TagEvalCmd = tagsCmd({ async run({ message: msg, args, pluginData }) { try { - const rendered = await renderTagBody(pluginData, args.body); + const rendered = await renderTagBody(pluginData, args.body, [], {}, { member: msg.member }); msg.channel.createMessage(rendered); } catch (e) { if (e instanceof TemplateParseError) { diff --git a/backend/src/plugins/Tags/util/findTagByName.ts b/backend/src/plugins/Tags/util/findTagByName.ts new file mode 100644 index 00000000..dd48dcca --- /dev/null +++ b/backend/src/plugins/Tags/util/findTagByName.ts @@ -0,0 +1,27 @@ +import { PluginData } from "knub"; +import { Tag, TagsPluginType } from "../types"; +import { ExtendedMatchParams } from "knub/dist/config/PluginConfigManager"; +import * as t from "io-ts"; + +export async function findTagByName( + pluginData: PluginData, + name: string, + matchParams: ExtendedMatchParams = {}, +): Promise | null> { + const config = pluginData.config.getMatchingConfig(matchParams); + + // Tag from a hardcoded category + // Format: "category.tag" + const categorySeparatorIndex = name.indexOf("."); + if (categorySeparatorIndex > 0) { + const categoryName = name.slice(0, categorySeparatorIndex); + const tagName = name.slice(categorySeparatorIndex + 1); + + return config.categories[categoryName]?.tags[tagName] ?? null; + } + + // Dynamic tag + // Format: "tag" + const dynamicTag = await pluginData.state.tags.find(name); + return dynamicTag?.body ?? null; +} diff --git a/backend/src/plugins/Tags/util/renderTagBody.ts b/backend/src/plugins/Tags/util/renderTagBody.ts index cddc86c6..e82488a4 100644 --- a/backend/src/plugins/Tags/util/renderTagBody.ts +++ b/backend/src/plugins/Tags/util/renderTagBody.ts @@ -3,12 +3,15 @@ import { PluginData, plugin } from "knub"; import { Tag, TagsPluginType } from "../types"; import { renderRecursively, StrictMessageContent } from "../../../utils"; import * as t from "io-ts"; +import { findTagByName } from "./findTagByName"; +import { ExtendedMatchParams } from "knub/dist/config/PluginConfigManager"; export async function renderTagBody( pluginData: PluginData, body: t.TypeOf, args = [], extraData = {}, + subTagPermissionMatchParams?: ExtendedMatchParams, ): Promise { const dynamicVars = {}; const maxTagFnCalls = 25; @@ -30,10 +33,18 @@ export async function renderTagBody( if (typeof name !== "string") return ""; if (name === "") return ""; - // TODO: Incorporate tag categories here - const subTag = await pluginData.state.tags.find(name); - if (!subTag) return ""; - return renderTemplate(subTag.body, { ...data, args: subTagArgs }); + const subTagBody = await findTagByName(pluginData, name, subTagPermissionMatchParams); + + if (!subTagBody) { + return ""; + } + + if (typeof subTagBody !== "string") { + return ""; + } + + const rendered = await renderTagBody(pluginData, subTagBody, subTagArgs, subTagPermissionMatchParams); + return rendered.content!; }, }; diff --git a/backend/src/plugins/Tags/util/renderTagFromString.ts b/backend/src/plugins/Tags/util/renderTagFromString.ts index fd63c82d..8bf00505 100644 --- a/backend/src/plugins/Tags/util/renderTagFromString.ts +++ b/backend/src/plugins/Tags/util/renderTagFromString.ts @@ -23,7 +23,7 @@ export async function renderTagFromString( // Format the string try { - return renderTagBody(pluginData, tagBody, tagArgs); + return renderTagBody(pluginData, tagBody, tagArgs, {}, { member }); } catch (e) { if (e instanceof TemplateParseError) { const logs = pluginData.getPlugin(LogsPlugin);