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" }, () => { |         build.onLoad({ filter: /^plugins$/, namespace: "import-plugins" }, () => { | ||||||
|             const files = readdirSync("./src/plugins"); |             const files = readdirSync("./src/plugins"); | ||||||
|             let code = ""; |             let code = ""; | ||||||
|             let arr = "["; |             let obj = ""; | ||||||
|             for (let i = 0; i < files.length; i++) { |             for (let i = 0; i < files.length; i++) { | ||||||
|                 if (files[i] === "index.ts") { |                 if (files[i] === "index.ts") { | ||||||
|                     continue; |                     continue; | ||||||
|                 } |                 } | ||||||
|                 const mod = `__pluginMod${i}`; |                 const mod = `__pluginMod${i}`; | ||||||
|                 code += `import ${mod} from "./${files[i].replace(".ts", "")}";\n`; |                 code += `import ${mod} from "./${files[i].replace(".ts", "")}";\n`; | ||||||
|                 arr += `${mod},`; |                 obj += `[${mod}.name]: ${mod},`; | ||||||
|             } |             } | ||||||
|             code += `export default ${arr}]`; |             code += `export default {${obj}}`; | ||||||
|             return { |             return { | ||||||
|                 contents: code, |                 contents: code, | ||||||
|                 resolveDir: "./src/plugins" |                 resolveDir: "./src/plugins" | ||||||
|  |  | ||||||
|  | @ -13,7 +13,7 @@ export interface Emoji { | ||||||
|     id: string, |     id: string, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| interface MessageObject { | export interface MessageObject { | ||||||
|     content: string, |     content: string, | ||||||
|     validNonShortcutEmojis: Emoji[]; |     validNonShortcutEmojis: Emoji[]; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -18,9 +18,9 @@ const DefaultSettings: Settings = { | ||||||
|     plugins: {} |     plugins: {} | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| for (const plugin of plugins) { | for (const plugin in plugins) { | ||||||
|     DefaultSettings.plugins[plugin.name] = { |     DefaultSettings.plugins[plugin] = { | ||||||
|         enabled: plugin.required ?? false |         enabled: plugins[plugin].required ?? false | ||||||
|     }; |     }; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -51,7 +51,7 @@ function makeProxy(settings: Settings, root = settings): Settings { | ||||||
|             for (const subscription of subscriptions) { |             for (const subscription of subscriptions) { | ||||||
|                 subscription(); |                 subscription(); | ||||||
|             } |             } | ||||||
|             VencordNative.ipc.invoke(IpcEvents.SET_SETTINGS, JSON.stringify(root)); |             VencordNative.ipc.invoke(IpcEvents.SET_SETTINGS, JSON.stringify(root, null, 4)); | ||||||
|             return true; |             return true; | ||||||
|         } |         } | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|  | @ -45,7 +45,7 @@ export default ErrorBoundary.wrap(function Settings(props) { | ||||||
|             </Switch> |             </Switch> | ||||||
|             <Forms.FormDivider /> |             <Forms.FormDivider /> | ||||||
|             <Forms.FormTitle tag="h5">Plugins</Forms.FormTitle> |             <Forms.FormTitle tag="h5">Plugins</Forms.FormTitle> | ||||||
|             {Plugins.map(p => ( |             {Object.values(Plugins).map(p => ( | ||||||
|                 <Switch |                 <Switch | ||||||
|                     disabled={p.required === true} |                     disabled={p.required === true} | ||||||
|                     key={p.name} |                     key={p.name} | ||||||
|  | @ -54,8 +54,11 @@ export default ErrorBoundary.wrap(function Settings(props) { | ||||||
|                         settings.plugins[p.name].enabled = v; |                         settings.plugins[p.name].enabled = v; | ||||||
|                         if (v) { |                         if (v) { | ||||||
|                             p.dependencies?.forEach(d => { |                             p.dependencies?.forEach(d => { | ||||||
|                                 // TODO: start every dependency
 |  | ||||||
|                                 settings.plugins[d].enabled = true; |                                 settings.plugins[d].enabled = true; | ||||||
|  |                                 if (!Plugins[d].started && !stopPlugin) { | ||||||
|  |                                     // TODO show notification
 | ||||||
|  |                                     settings.plugins[p.name].enabled = false; | ||||||
|  |                                 } | ||||||
|                             }); |                             }); | ||||||
|                             if (!p.started && !startPlugin(p)) { |                             if (!p.started && !startPlugin(p)) { | ||||||
|                                 // TODO show notification
 |                                 // TODO show notification
 | ||||||
|  |  | ||||||
|  | @ -8,7 +8,7 @@ const logger = new Logger("PluginManager", "#a6d189"); | ||||||
| export const plugins = Plugins; | export const plugins = Plugins; | ||||||
| export const patches = [] as Patch[]; | 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) { |     for (const patch of plugin.patches) { | ||||||
|         patch.plugin = plugin.name; |         patch.plugin = plugin.name; | ||||||
|         if (!Array.isArray(patch.replacement)) patch.replacement = [patch.replacement]; |         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() { | export function startAll() { | ||||||
|     for (const plugin of plugins) if (Settings.plugins[plugin.name].enabled) { |     for (const plugin in Plugins) if (Settings.plugins[plugin].enabled) { | ||||||
|         startPlugin(plugin); |         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" { | declare module "plugins" { | ||||||
|     const plugins: import("./utils/types").Plugin[]; |     const plugins: Record<string, import("./utils/types").Plugin>; | ||||||
|     export default plugins; |     export default plugins; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -85,6 +85,7 @@ function patchPush() { | ||||||
|                                 const newCode = code.replace(replacement.match, replacement.replace); |                                 const newCode = code.replace(replacement.match, replacement.replace); | ||||||
|                                 if (newCode === code) { |                                 if (newCode === code) { | ||||||
|                                     logger.warn(`Patch by ${patch.plugin} had no effect: ${replacement.match}`); |                                     logger.warn(`Patch by ${patch.plugin} had no effect: ${replacement.match}`); | ||||||
|  |                                     logger.debug("Function Source:\n", code); | ||||||
|                                 } else { |                                 } else { | ||||||
|                                     const newMod = (0, eval)(`// Webpack Module ${id} - Patched by ${[...patchedBy].join(", ")}\n${newCode}\n//# sourceURL=WebpackModule${id}`); |                                     const newMod = (0, eval)(`// Webpack Module ${id} - Patched by ${[...patchedBy].join(", ")}\n${newCode}\n//# sourceURL=WebpackModule${id}`); | ||||||
|                                     code = newCode; |                                     code = newCode; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue