Unindent, plugins is now an object instead of []
This commit is contained in:
		
							parent
							
								
									b2f762fda8
								
							
						
					
					
						commit
						7ce37f858c
					
				
					 8 changed files with 65 additions and 14 deletions
				
			
		| 
						 | 
				
			
			@ -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"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,7 @@ export interface Emoji {
 | 
			
		|||
    id: string,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface MessageObject {
 | 
			
		||||
export interface MessageObject {
 | 
			
		||||
    content: string,
 | 
			
		||||
    validNonShortcutEmojis: Emoji[];
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,7 +45,7 @@ export default ErrorBoundary.wrap(function Settings(props) {
 | 
			
		|||
            </Switch>
 | 
			
		||||
            <Forms.FormDivider />
 | 
			
		||||
            <Forms.FormTitle tag="h5">Plugins</Forms.FormTitle>
 | 
			
		||||
            {Plugins.map(p => (
 | 
			
		||||
            {Object.values(Plugins).map(p => (
 | 
			
		||||
                <Switch
 | 
			
		||||
                    disabled={p.required === true}
 | 
			
		||||
                    key={p.name}
 | 
			
		||||
| 
						 | 
				
			
			@ -54,8 +54,11 @@ export default ErrorBoundary.wrap(function Settings(props) {
 | 
			
		|||
                        settings.plugins[p.name].enabled = v;
 | 
			
		||||
                        if (v) {
 | 
			
		||||
                            p.dependencies?.forEach(d => {
 | 
			
		||||
                                // 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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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]);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										47
									
								
								src/plugins/unindent.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								src/plugins/unindent.ts
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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);
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
							
								
								
									
										2
									
								
								src/pluginsModule.d.ts
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								src/pluginsModule.d.ts
									
										
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
declare module "plugins" {
 | 
			
		||||
    const plugins: import("./utils/types").Plugin[];
 | 
			
		||||
    const plugins: Record<string, import("./utils/types").Plugin>;
 | 
			
		||||
    export default plugins;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue