mirror of
				https://github.com/smartfrigde/armcord.git
				synced 2024-08-14 23:56:58 +00:00 
			
		
		
		
	Re-do plugin/theme loading. Move plugins/themes to userdata
This commit is contained in:
		
							parent
							
								
									1d84e24825
								
							
						
					
					
						commit
						0aa6e1399c
					
				
					 19 changed files with 820 additions and 436 deletions
				
			
		
							
								
								
									
										2
									
								
								main.js
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								main.js
									
										
									
									
									
								
							|  | @ -101,7 +101,7 @@ function createWindow() { | ||||||
| // Some APIs can only be used after this event occurs.
 | // Some APIs can only be used after this event occurs.
 | ||||||
| app.whenReady().then(() => { | app.whenReady().then(() => { | ||||||
|   createWindow(); |   createWindow(); | ||||||
|   require("./utils/csp.js"); |   //require("./utils/csp.js");
 | ||||||
|   require("./utils/plugin.js"); |   require("./utils/plugin.js"); | ||||||
|   session |   session | ||||||
|     .fromPartition("some-partition") |     .fromPartition("some-partition") | ||||||
|  |  | ||||||
							
								
								
									
										953
									
								
								package-lock.json
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										953
									
								
								package-lock.json
									
										
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -18,6 +18,7 @@ | ||||||
|     "electron-context-menu": "^3.0.0", |     "electron-context-menu": "^3.0.0", | ||||||
|     "electron-localshortcut": "^3.2.1", |     "electron-localshortcut": "^3.2.1", | ||||||
|     "electron-store": "^8.0.0", |     "electron-store": "^8.0.0", | ||||||
|  |     "unzipper": "^0.10.1", | ||||||
|     "v8-compile-cache": "^2.3.0" |     "v8-compile-cache": "^2.3.0" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|  |  | ||||||
|  | @ -1,17 +1,57 @@ | ||||||
| const fs = require("fs"); | const fs = require("fs"); | ||||||
| const { app, session } = require("electron"); | const { app, session } = require("electron"); | ||||||
| const pluginFolder = __dirname + "/plugins/"; | const electron = require("electron"); | ||||||
|  | const userDataPath = (electron.app || electron.remote.app).getPath("userData"); | ||||||
|  | const pluginFolder = userDataPath + "/plugins/"; | ||||||
|  | if (!fs.existsSync(pluginFolder)) { | ||||||
|  |   fs.mkdirSync(pluginFolder); | ||||||
|  |   console.log("Created plugin folder") | ||||||
|  |   try { | ||||||
|  |   console.log("Attempting to download GooseMod Extension") | ||||||
|  |   const https = require("https"); | ||||||
|  | 
 | ||||||
|  |   function download(url, dest, cb) { | ||||||
|  |     const file = fs.createWriteStream(dest); | ||||||
|  |     const request = https | ||||||
|  |       .get(url, function (response) { | ||||||
|  |         response.pipe(file); | ||||||
|  |         file.on("finish", function () { | ||||||
|  |           file.close(cb); // close() is async, call cb after close completes.
 | ||||||
|  |         }); | ||||||
|  |       }) | ||||||
|  |       .on("error", function (err) { | ||||||
|  |         // Handle errors
 | ||||||
|  |         fs.unlink(dest); // Delete the file async. (But we don't check the result)
 | ||||||
|  |         if (cb) cb(err.message); | ||||||
|  |       }); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // Download latest archive from GitHub to temp folder
 | ||||||
|  |   const dest = userDataPath + "/Cache/GooseMod.zip"; | ||||||
|  |   const url = | ||||||
|  |     "https://codeload.github.com/GooseMod/Extension/zip/refs/heads/main"; | ||||||
|  |   download(url, dest, function () { | ||||||
|  |     console.log("Downloaded, attempting to install."); | ||||||
|  |     const unzip = require("unzipper") | ||||||
|  |     fs.createReadStream(dest).pipe(unzip.Extract({ path: pluginFolder })); | ||||||
|  |     console.log("Success! GooseMod will start on next session!") | ||||||
|  |   }); | ||||||
|  |   } | ||||||
|  |   catch (e){ | ||||||
|  |     console.error(`GooseMod failed to download. Error: ${e}`) | ||||||
|  |   } | ||||||
|  | } | ||||||
| app.whenReady().then(() => { | app.whenReady().then(() => { | ||||||
| fs.readdirSync(pluginFolder).forEach((file) => { | fs.readdirSync(pluginFolder).forEach((file) => { | ||||||
|   console.log(file); |   console.log(file); | ||||||
|   try { |   try { | ||||||
|     const manifest = fs.readFileSync( |     const manifest = fs.readFileSync( | ||||||
|       `${__dirname}/plugins/${file}/manifest.json`, |       `${userDataPath}/plugins/${file}/manifest.json`, | ||||||
|       "utf8" |       "utf8" | ||||||
|     ); |     ); | ||||||
|     var pluginFile = JSON.parse(manifest); |     var pluginFile = JSON.parse(manifest); | ||||||
|     console.log(pluginFile); |     console.log(pluginFile); | ||||||
|     session.defaultSession.loadExtension(`${__dirname}\\plugins\\${file}`); |     session.defaultSession.loadExtension(`${userDataPath}/plugins/${file}`); | ||||||
|     console.log( |     console.log( | ||||||
|       `%cLoaded ${pluginFile.name} made by ${pluginFile.author}`, |       `%cLoaded ${pluginFile.name} made by ${pluginFile.author}`, | ||||||
|       "color:red" |       "color:red" | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								utils/plugins/duckmod/.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								utils/plugins/duckmod/.gitignore
									
										
									
									
										vendored
									
									
								
							|  | @ -1 +0,0 @@ | ||||||
| web-ext-artifacts |  | ||||||
|  | @ -1,21 +0,0 @@ | ||||||
| The MIT License (MIT) |  | ||||||
| 
 |  | ||||||
| Copyright (c) 2021 GooseMod |  | ||||||
| 
 |  | ||||||
| Permission is hereby granted, free of charge, to any person obtaining a copy |  | ||||||
| of this software and associated documentation files (the "Software"), to deal |  | ||||||
| in the Software without restriction, including without limitation the rights |  | ||||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |  | ||||||
| copies of the Software, and to permit persons to whom the Software is |  | ||||||
| furnished to do so, subject to the following conditions: |  | ||||||
| 
 |  | ||||||
| The above copyright notice and this permission notice shall be included in all |  | ||||||
| copies or substantial portions of the Software. |  | ||||||
| 
 |  | ||||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |  | ||||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |  | ||||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |  | ||||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |  | ||||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |  | ||||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |  | ||||||
| SOFTWARE. |  | ||||||
|  | @ -1,17 +0,0 @@ | ||||||
| <h1 align="center"> |  | ||||||
| <sub> |  | ||||||
| <img src="https://raw.githubusercontent.com/GooseMod/Extension/main/icons/48.png" height="38" width="38"> |  | ||||||
| </sub> |  | ||||||
| GooseMod for Web |  | ||||||
| </h1> |  | ||||||
| 
 |  | ||||||
| <p align="center"> |  | ||||||
| <a href="https://addons.mozilla.org/addon/goosemod-for-web/"><img src="https://user-images.githubusercontent.com/585534/107280546-7b9b2a00-6a26-11eb-8f9f-f95932f4bfec.png" alt="Get GooseMod for Web for Firefox"></a>  |  | ||||||
| <a href="https://chrome.google.com/webstore/detail/goosemod-for-web/clgkdcccmbjmjdbdgcigpocfkkjeaeld"><img src="https://user-images.githubusercontent.com/585534/107280622-91a8ea80-6a26-11eb-8d07-77c548b28665.png" alt="Get GooseMod for Web for Chromium"></a> |  | ||||||
| </p> |  | ||||||
| 
 |  | ||||||
| *** |  | ||||||
| 
 |  | ||||||
| <p align="center"> |  | ||||||
| <strong>A light, secure, and easy to use Discord mod; now in your browser.</strong> |  | ||||||
| </p> |  | ||||||
|  | @ -1,32 +0,0 @@ | ||||||
| const cspAllowAll = [ |  | ||||||
|   'connect-src', |  | ||||||
|   'style-src', |  | ||||||
|   'img-src', |  | ||||||
|   'font-src' |  | ||||||
| ]; |  | ||||||
| 
 |  | ||||||
| chrome.webRequest.onHeadersReceived.addListener(({ responseHeaders, url }) => { |  | ||||||
|   let csp = responseHeaders.find((x) => x.name === 'content-security-policy'); |  | ||||||
| 
 |  | ||||||
|   if (csp) { |  | ||||||
|     for (let p of cspAllowAll) { |  | ||||||
|       csp.value = csp.value.replace(`${p}`, `${p} * blob: data:`); // * does not include data: URIs
 |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     // Fix Discord's broken CSP which disallows unsafe-inline due to having a nonce (which they don't even use?)
 |  | ||||||
|     csp.value = csp.value.replace(/'nonce-.*?' /, ''); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
| 	return { |  | ||||||
|     responseHeaders |  | ||||||
|   }; |  | ||||||
| }, |  | ||||||
| 
 |  | ||||||
|   { |  | ||||||
|     urls: [ |  | ||||||
|       '*://*.discord.com/*' |  | ||||||
|     ] |  | ||||||
|   }, |  | ||||||
| 
 |  | ||||||
|   ['blocking', 'responseHeaders'] |  | ||||||
| ); |  | ||||||
|  | @ -1,49 +0,0 @@ | ||||||
| const inject = async () => { |  | ||||||
|   console.log('[GooseMod for Web] Injecting...'); |  | ||||||
| 
 |  | ||||||
|   // Re-define localStorage as Discord removes it
 |  | ||||||
|   function getLocalStoragePropertyDescriptor() { |  | ||||||
|     const frame = document.createElement('frame'); |  | ||||||
|     frame.src = 'about:blank'; |  | ||||||
|    |  | ||||||
|     document.body.appendChild(frame); |  | ||||||
|    |  | ||||||
|     let r = Object.getOwnPropertyDescriptor(frame.contentWindow, 'localStorage'); |  | ||||||
|    |  | ||||||
|     frame.remove(); |  | ||||||
|    |  | ||||||
|     return r; |  | ||||||
|   } |  | ||||||
|    |  | ||||||
|   Object.defineProperty(window, 'localStorage', getLocalStoragePropertyDescriptor()); |  | ||||||
|    |  | ||||||
|   console.log('[GooseMod for Web] Redefined localStorage'); |  | ||||||
| 
 |  | ||||||
|   const branchURLs = { |  | ||||||
|     'release': 'https://api.goosemod.com/inject.js', |  | ||||||
|     'dev': 'https://updates.goosemod.com/guapi/goosemod/dev' |  | ||||||
|   }; |  | ||||||
|    |  | ||||||
|   const branch = localStorage.getItem('goosemodUntetheredBranch') || 'release'; |  | ||||||
| 
 |  | ||||||
|   console.log('[GooseMod for ArmCord] Branch =', branch); |  | ||||||
|   console.log('[GooseMod for ArmCord] JS Url =', branchURLs[branch]); |  | ||||||
|    |  | ||||||
|   const js = await (await fetch(branchURLs[branch])).text(); // JSON.parse(localStorage.getItem('goosemodCoreJSCache'));
 |  | ||||||
| 
 |  | ||||||
|   const el = document.createElement('script'); |  | ||||||
|    |  | ||||||
|   el.appendChild(document.createTextNode(js)); |  | ||||||
|    |  | ||||||
|   document.body.appendChild(el); |  | ||||||
| 
 |  | ||||||
|   console.log('[GooseMod for ArmCord] Injected fetched JS'); |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| // Delay actual injection to fix FF issues
 |  | ||||||
| 
 |  | ||||||
| let el = document.createElement('script'); |  | ||||||
| 
 |  | ||||||
| el.appendChild(document.createTextNode(`(${inject.toString()})()`)); |  | ||||||
| 
 |  | ||||||
| document.body.appendChild(el); |  | ||||||
|  | @ -1,37 +0,0 @@ | ||||||
| { |  | ||||||
|     "name": "GooseMod for ArmCord", |  | ||||||
|     "description": "A light, secure, and easy to use Discord mod; now in your browser.", |  | ||||||
| 
 |  | ||||||
|     "version": "1.1.0", |  | ||||||
| 
 |  | ||||||
|     "author": "GooseMod Team", |  | ||||||
|     "homepage_url": "https://goosemod.com", |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     "background": { |  | ||||||
|         "scripts": [ |  | ||||||
|             "background.js" |  | ||||||
|         ] |  | ||||||
|     }, |  | ||||||
| 
 |  | ||||||
|     "content_scripts": [ |  | ||||||
|         { |  | ||||||
|             "matches": ["*://*.discord.com/*"], |  | ||||||
|             "js": ["content.js"] |  | ||||||
|         } |  | ||||||
|     ], |  | ||||||
| 
 |  | ||||||
|     "permissions": [ |  | ||||||
|         "webRequest", |  | ||||||
|         "webRequestBlocking", |  | ||||||
|         "*://*.discord.com/*" |  | ||||||
|     ], |  | ||||||
| 
 |  | ||||||
|     "manifest_version": 2, |  | ||||||
| 
 |  | ||||||
|     "browser_specific_settings": { |  | ||||||
|         "gecko": { |  | ||||||
|             "id": "invalid@goosemod.com" |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -1,18 +1,23 @@ | ||||||
| const fs = require("fs"); | const fs = require("fs"); | ||||||
| const {shell} = require('electron'); | const {shell} = require('electron'); | ||||||
|  | const electron = require("electron"); | ||||||
| const ArmCord = require("./ArmCord.js"); | const ArmCord = require("./ArmCord.js"); | ||||||
| const themeFolder = __dirname + "/themes/"; | const userDataPath = (electron.app || electron.remote.app).getPath("userData"); | ||||||
| 
 | const themeFolder = userDataPath + "/themes/"; | ||||||
|  | if (!fs.existsSync(themeFolder)) { | ||||||
|  |   fs.mkdirSync(themeFolder); | ||||||
|  |   console.log("Created theme folder"); | ||||||
|  | } | ||||||
| window.addEventListener("DOMContentLoaded", () => { | window.addEventListener("DOMContentLoaded", () => { | ||||||
|   console.log("Theme Module Loaded"); |   console.log("Theme Module Loaded"); | ||||||
|   fs.readdirSync(themeFolder).forEach((file) => { |   fs.readdirSync(themeFolder).forEach((file) => { | ||||||
|     console.log(file); |     console.log(file); | ||||||
|     try { |     try { | ||||||
|       const manifest = fs.readFileSync(`${__dirname}/themes/${file}/manifest.json`, "utf8"); |       const manifest = fs.readFileSync(`${userDataPath}/themes/${file}/manifest.json`, "utf8"); | ||||||
|       var themeFile = JSON.parse(manifest); |       var themeFile = JSON.parse(manifest); | ||||||
|       console.log(themeFile.theme); |       console.log(themeFile.theme); | ||||||
|       console.log(themeFile) |       console.log(themeFile) | ||||||
|       const theme = fs.readFileSync(`${__dirname}/themes/${file}/${themeFile.theme}`, "utf8"); |       const theme = fs.readFileSync(`${userDataPath}/themes/${file}/${themeFile.theme}`, "utf8"); | ||||||
|       if (themeFile.theme.endsWith(".scss")) { |       if (themeFile.theme.endsWith(".scss")) { | ||||||
|         console.log( |         console.log( | ||||||
|           `%cCouldn't load ${themeFile.name} made by ${themeFile.author}. ArmCord doesn't support SCSS files! If you want to have this theme ported, feel free to reach out https://discord.gg/F25bc4RYDt `, |           `%cCouldn't load ${themeFile.name} made by ${themeFile.author}. ArmCord doesn't support SCSS files! If you want to have this theme ported, feel free to reach out https://discord.gg/F25bc4RYDt `, | ||||||
|  | @ -27,7 +32,7 @@ window.addEventListener("DOMContentLoaded", () => { | ||||||
|       console.error(err); |       console.error(err); | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
|   document.getElementById("open-themes-btn").onclick = function () {shell.openPath(`${__dirname}/themes`);}; |   document.getElementById("open-themes-btn").onclick = function () {shell.openPath(`${userDataPath}/themes`);}; | ||||||
|   document.getElementsByClassName("back-btn")[0].onclick = function () { |   document.getElementsByClassName("back-btn")[0].onclick = function () { | ||||||
|     if (document.getElementById("ac-channel").innerHTML == "stable") { |     if (document.getElementById("ac-channel").innerHTML == "stable") { | ||||||
|       window.location.href = "https://discord.com/app"; |       window.location.href = "https://discord.com/app"; | ||||||
|  |  | ||||||
|  | @ -1,21 +0,0 @@ | ||||||
| The MIT License (MIT) |  | ||||||
| 
 |  | ||||||
| Copyright (c) 2021 GooseNest |  | ||||||
| 
 |  | ||||||
| Permission is hereby granted, free of charge, to any person obtaining a copy |  | ||||||
| of this software and associated documentation files (the "Software"), to deal |  | ||||||
| in the Software without restriction, including without limitation the rights |  | ||||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |  | ||||||
| copies of the Software, and to permit persons to whom the Software is |  | ||||||
| furnished to do so, subject to the following conditions: |  | ||||||
| 
 |  | ||||||
| The above copyright notice and this permission notice shall be included in all |  | ||||||
| copies or substantial portions of the Software. |  | ||||||
| 
 |  | ||||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |  | ||||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |  | ||||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |  | ||||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |  | ||||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |  | ||||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |  | ||||||
| SOFTWARE. |  | ||||||
|  | @ -1,3 +0,0 @@ | ||||||
| # GT-RevertRebrand ArmCord |  | ||||||
| 
 |  | ||||||
| Reverts Discord's 2021 rebrand (font, colors, reactions, mentions, loading screen, home icon, reply ping color, and more) |  | ||||||
|  | @ -1,9 +0,0 @@ | ||||||
| /** |  | ||||||
|   * @name Revert Rebrand |  | ||||||
|   * @author GooseNest |  | ||||||
|   * @description Reverts Discord's 2021 rebrand (font, colors, reactions, mentions, loading screen, home icon, reply ping color, and more) |  | ||||||
|   * @invite neMncS2 |  | ||||||
|   * @version 3.0 |  | ||||||
| */ |  | ||||||
| 
 |  | ||||||
| @import url('https://Goose-Nest.github.io/GT-RevertRebrand/src/main.css'); |  | ||||||
|  | @ -1,8 +0,0 @@ | ||||||
| { |  | ||||||
|   "name": "Revert Rebrand", |  | ||||||
|   "description": "Reverts Discord's 2021 rebrand (font, colors, reactions, mentions, loading screen, home icon, reply ping color, and more)", |  | ||||||
|   "version": "3.0", |  | ||||||
|   "author": "GooseNest", |  | ||||||
|   "license": "MIT", |  | ||||||
|   "theme": "RevertRebrand.theme.css" |  | ||||||
| } |  | ||||||
|  | @ -1,21 +0,0 @@ | ||||||
| The MIT License (MIT) |  | ||||||
| 
 |  | ||||||
| Copyright (c) 2021 GooseNest |  | ||||||
| 
 |  | ||||||
| Permission is hereby granted, free of charge, to any person obtaining a copy |  | ||||||
| of this software and associated documentation files (the "Software"), to deal |  | ||||||
| in the Software without restriction, including without limitation the rights |  | ||||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |  | ||||||
| copies of the Software, and to permit persons to whom the Software is |  | ||||||
| furnished to do so, subject to the following conditions: |  | ||||||
| 
 |  | ||||||
| The above copyright notice and this permission notice shall be included in all |  | ||||||
| copies or substantial portions of the Software. |  | ||||||
| 
 |  | ||||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |  | ||||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |  | ||||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |  | ||||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |  | ||||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |  | ||||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |  | ||||||
| SOFTWARE. |  | ||||||
|  | @ -1,3 +0,0 @@ | ||||||
| # GT-RevertRebrand ArmCord |  | ||||||
| 
 |  | ||||||
| Reverts Discord's 2021 rebrand (font, colors, reactions, mentions, loading screen, home icon, reply ping color, and more) |  | ||||||
|  | @ -1,9 +0,0 @@ | ||||||
| /** |  | ||||||
|   * @name Revert Rebrand |  | ||||||
|   * @author GooseNest |  | ||||||
|   * @description Reverts Discord's 2021 rebrand (font, colors, reactions, mentions, loading screen, home icon, reply ping color, and more) |  | ||||||
|   * @invite neMncS2 |  | ||||||
|   * @version 3.0 |  | ||||||
| */ |  | ||||||
| 
 |  | ||||||
| @import url('https://Goose-Nest.github.io/GT-RevertRebrand/src/main.css'); |  | ||||||
|  | @ -1,8 +0,0 @@ | ||||||
| { |  | ||||||
|   "name": "Test Theme", |  | ||||||
|   "description": "A test description (For theme seperation)", |  | ||||||
|   "version": "3.0", |  | ||||||
|   "author": "KayoticCarnige", |  | ||||||
|   "license": "MIT", |  | ||||||
|   "theme": "RevertRebrand.theme.css" |  | ||||||
| } |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue