From 7ce37f858c0a1e09e1f6497fbd32b172cc9b3c6c Mon Sep 17 00:00:00 2001 From: Vendicated Date: Wed, 31 Aug 2022 23:04:18 +0200 Subject: [PATCH] Unindent, plugins is now an object instead of [] --- build.mjs | 6 ++--- src/api/MessageEvents.ts | 2 +- src/api/settings.ts | 8 +++---- src/components/Settings.tsx | 7 ++++-- src/plugins/index.ts | 6 ++--- src/plugins/unindent.ts | 47 +++++++++++++++++++++++++++++++++++++ src/pluginsModule.d.ts | 2 +- src/utils/patchWebpack.ts | 1 + 8 files changed, 65 insertions(+), 14 deletions(-) create mode 100644 src/plugins/unindent.ts diff --git a/build.mjs b/build.mjs index c3bac3ba..8b97e880 100755 --- a/build.mjs +++ b/build.mjs @@ -42,16 +42,16 @@ const globPlugins = { build.onLoad({ filter: /^plugins$/, namespace: "import-plugins" }, () => { const files = readdirSync("./src/plugins"); let code = ""; - let arr = "["; + let obj = ""; for (let i = 0; i < files.length; i++) { if (files[i] === "index.ts") { continue; } const mod = `__pluginMod${i}`; code += `import ${mod} from "./${files[i].replace(".ts", "")}";\n`; - arr += `${mod},`; + obj += `[${mod}.name]: ${mod},`; } - code += `export default ${arr}]`; + code += `export default {${obj}}`; return { contents: code, resolveDir: "./src/plugins" diff --git a/src/api/MessageEvents.ts b/src/api/MessageEvents.ts index 65b4f456..b6230b2c 100644 --- a/src/api/MessageEvents.ts +++ b/src/api/MessageEvents.ts @@ -13,7 +13,7 @@ export interface Emoji { id: string, } -interface MessageObject { +export interface MessageObject { content: string, validNonShortcutEmojis: Emoji[]; } diff --git a/src/api/settings.ts b/src/api/settings.ts index 0b27b30e..a6f24a45 100644 --- a/src/api/settings.ts +++ b/src/api/settings.ts @@ -18,9 +18,9 @@ const DefaultSettings: Settings = { plugins: {} }; -for (const plugin of plugins) { - DefaultSettings.plugins[plugin.name] = { - enabled: plugin.required ?? false +for (const plugin in plugins) { + DefaultSettings.plugins[plugin] = { + enabled: plugins[plugin].required ?? false }; } @@ -51,7 +51,7 @@ function makeProxy(settings: Settings, root = settings): Settings { for (const subscription of subscriptions) { subscription(); } - VencordNative.ipc.invoke(IpcEvents.SET_SETTINGS, JSON.stringify(root)); + VencordNative.ipc.invoke(IpcEvents.SET_SETTINGS, JSON.stringify(root, null, 4)); return true; } }); diff --git a/src/components/Settings.tsx b/src/components/Settings.tsx index ee293bbe..c2743664 100644 --- a/src/components/Settings.tsx +++ b/src/components/Settings.tsx @@ -45,7 +45,7 @@ export default ErrorBoundary.wrap(function Settings(props) { Plugins - {Plugins.map(p => ( + {Object.values(Plugins).map(p => ( { - // TODO: start every dependency settings.plugins[d].enabled = true; + if (!Plugins[d].started && !stopPlugin) { + // TODO show notification + settings.plugins[p.name].enabled = false; + } }); if (!p.started && !startPlugin(p)) { // TODO show notification diff --git a/src/plugins/index.ts b/src/plugins/index.ts index 448d2476..1a6c93d2 100644 --- a/src/plugins/index.ts +++ b/src/plugins/index.ts @@ -8,7 +8,7 @@ const logger = new Logger("PluginManager", "#a6d189"); export const plugins = Plugins; export const patches = [] as Patch[]; -for (const plugin of Plugins) if (plugin.patches && Settings.plugins[plugin.name].enabled) { +for (const plugin of Object.values(Plugins)) if (plugin.patches && Settings.plugins[plugin.name].enabled) { for (const patch of plugin.patches) { patch.plugin = plugin.name; if (!Array.isArray(patch.replacement)) patch.replacement = [patch.replacement]; @@ -17,8 +17,8 @@ for (const plugin of Plugins) if (plugin.patches && Settings.plugins[plugin.name } export function startAll() { - for (const plugin of plugins) if (Settings.plugins[plugin.name].enabled) { - startPlugin(plugin); + for (const plugin in Plugins) if (Settings.plugins[plugin].enabled) { + startPlugin(Plugins[plugin]); } } diff --git a/src/plugins/unindent.ts b/src/plugins/unindent.ts new file mode 100644 index 00000000..1f63f69b --- /dev/null +++ b/src/plugins/unindent.ts @@ -0,0 +1,47 @@ +import definePlugin from "../utils/types"; +import { addPreSendListener, addPreEditListener, MessageObject, removePreSendListener, removePreEditListener } from '../api/MessageEvents'; + +export default definePlugin({ + name: "Unindent", + description: "Trims leading indentation from codeblocks", + author: "Vendicated", + patches: [ + { + find: "inQuote:", + replacement: { + match: /,content:([^,]+),inQuote/, + replace: (_, content) => `,content:Vencord.Plugins.plugins.Unindent.unindent(${content}),inQuote` + } + } + ], + + unindent(str: string) { + // Users cannot send tabs, they get converted to spaces. However, a bot may send tabs, so convert them to 4 spaces first + str = str.replace(/\t/g, " "); + const minIndent = str.match(/^ *(?=\S)/gm) + ?.reduce((prev, curr) => Math.min(prev, curr.length), Infinity) ?? 0; + + if (!minIndent) return str; + return str.replace(new RegExp(`^ {${minIndent}}`, "gm"), ""); + }, + + unindentMsg(msg: MessageObject) { + msg.content = msg.content.replace(/```(.|\n)*?```/g, m => { + const lines = m.split("\n"); + if (lines.length < 2) return m; // Do not affect inline codeblocks + let suffix = ""; + if (lines[lines.length - 1] === "```") suffix = lines.pop()!; + return `${lines[0]}\n${this.unindent(lines.slice(1).join("\n"))}\n${suffix}`; + }); + }, + + start() { + this.preSend = addPreSendListener((_, msg) => this.unindentMsg(msg)); + this.preEdit = addPreEditListener((_cid, _mid, msg) => this.unindentMsg(msg)); + }, + + stop() { + removePreSendListener(this.preSend); + removePreEditListener(this.preEdit); + } +}); \ No newline at end of file diff --git a/src/pluginsModule.d.ts b/src/pluginsModule.d.ts index 8c2ac23a..d91efae8 100644 --- a/src/pluginsModule.d.ts +++ b/src/pluginsModule.d.ts @@ -1,5 +1,5 @@ declare module "plugins" { - const plugins: import("./utils/types").Plugin[]; + const plugins: Record; export default plugins; } diff --git a/src/utils/patchWebpack.ts b/src/utils/patchWebpack.ts index 9f4b4350..dffce867 100644 --- a/src/utils/patchWebpack.ts +++ b/src/utils/patchWebpack.ts @@ -85,6 +85,7 @@ function patchPush() { const newCode = code.replace(replacement.match, replacement.replace); if (newCode === code) { logger.warn(`Patch by ${patch.plugin} had no effect: ${replacement.match}`); + logger.debug("Function Source:\n", code); } else { const newMod = (0, eval)(`// Webpack Module ${id} - Patched by ${[...patchedBy].join(", ")}\n${newCode}\n//# sourceURL=WebpackModule${id}`); code = newCode;