mirror of
				https://github.com/smartfrigde/armcord.git
				synced 2024-08-14 23:56:58 +00:00 
			
		
		
		
	Update arRPC and add MS Store assets
This commit is contained in:
		
							parent
							
								
									23c70301be
								
							
						
					
					
						commit
						74598f2ed8
					
				
					 19 changed files with 85 additions and 208 deletions
				
			
		
							
								
								
									
										12
									
								
								README.md
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								README.md
									
										
									
									
									
								
							|  | @ -39,11 +39,19 @@ | ||||||
| 
 | 
 | ||||||
| ## Packaging status | ## Packaging status | ||||||
| [](https://repology.org/project/armcord/versions) | [](https://repology.org/project/armcord/versions) | ||||||
|  | 
 | ||||||
|  | ### Windows | ||||||
|  | <a href="ms-windows-store://pdp/?ProductId=9PFHLJFD7KJT&mode=mini"> | ||||||
|  |    <img src="https://get.microsoft.com/images/en-us%20dark.svg" alt="Download ArmCord" /> | ||||||
|  | </a> | ||||||
|  | 
 | ||||||
|  | If you're using older version of Windows, you need to use [pre-built installers](https://www.armcord.xyz/download). | ||||||
|  | 
 | ||||||
| ### Debian, Ubuntu, Raspbian repository | ### Debian, Ubuntu, Raspbian repository | ||||||
| ArmCord is available on our official repositories for `apt` package manager. By using this method you'll receive automatic updates and get all the dependencies. Run the following commands to install ArmCord from them: | ArmCord is available on our official repositories for `apt` package manager. By using this method you'll receive automatic updates and get all the dependencies. Run the following commands to install ArmCord from them: | ||||||
| ```sh | ```sh | ||||||
| sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F1710089DA28B361 | curl -fsSL https://eu.armcord.xyz/pgp-key.public | sudo gpg --dearmor -o /usr/share/keyrings/armcord.gpg | ||||||
| echo "deb [arch=$(dpkg --print-architecture)] https://eu.armcord.xyz/apt-repo stable main" | sudo tee /etc/apt/sources.list.d/armcord.list | echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/armcord.gpg] https://eu.armcord.xyz/apt-repo stable main" | sudo tee /etc/apt/sources.list.d/armcord.list | ||||||
| sudo apt update | sudo apt update | ||||||
| sudo apt install armcord | sudo apt install armcord | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
							
								
								
									
										
											BIN
										
									
								
								assets/Square150x150Logo.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/Square150x150Logo.png
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 7.2 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/Square44x44Logo.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/Square44x44Logo.png
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/StoreLogo.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/StoreLogo.png
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 40 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/Wide310x150Logo.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/Wide310x150Logo.png
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 4.2 KiB | 
|  | @ -1,9 +0,0 @@ | ||||||
| # arRPC Examples |  | ||||||
| 
 |  | ||||||
| ## [Bridge Mod](bridge_mod.js) |  | ||||||
| 
 |  | ||||||
| Simple mod for using the arRPC Bridge WebSocket server for setting RPC status (to be used with just Web). |  | ||||||
| 
 |  | ||||||
| ## [Electron](electron) |  | ||||||
| 
 |  | ||||||
| Example usage for within an Electron client. |  | ||||||
|  | @ -1,78 +0,0 @@ | ||||||
| (() => { |  | ||||||
|     let Dispatcher, |  | ||||||
|         lookupAsset, |  | ||||||
|         lookupApp, |  | ||||||
|         apps = {}; |  | ||||||
| 
 |  | ||||||
|     const ws = new WebSocket("ws://127.0.0.1:1337"); // connect to arRPC bridge websocket
 |  | ||||||
|     ws.onmessage = async (x) => { |  | ||||||
|         msg = JSON.parse(x.data); |  | ||||||
|         console.log(msg); |  | ||||||
| 
 |  | ||||||
|         if (!Dispatcher) { |  | ||||||
|             const wpRequire = window.webpackChunkdiscord_app.push([[Symbol()], {}, (x) => x]); |  | ||||||
|             const cache = wpRequire.c; |  | ||||||
|             window.webpackChunkdiscord_app.pop(); |  | ||||||
| 
 |  | ||||||
|             for (const id in cache) { |  | ||||||
|                 let mod = cache[id].exports; |  | ||||||
|                 mod = mod && (mod.Z ?? mod.ZP); |  | ||||||
| 
 |  | ||||||
|                 if (mod && mod.register && mod.wait) { |  | ||||||
|                     Dispatcher = mod; |  | ||||||
|                     break; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             const factories = wpRequire.m; |  | ||||||
|             for (const id in factories) { |  | ||||||
|                 if (factories[id].toString().includes("getAssetImage: size must === [number, number] for Twitch")) { |  | ||||||
|                     const mod = wpRequire(id); |  | ||||||
| 
 |  | ||||||
|                     const _lookupAsset = Object.values(mod).find( |  | ||||||
|                         (e) => typeof e === "function" && e.toString().includes("apply(") |  | ||||||
|                     ); |  | ||||||
|                     lookupAsset = async (appId, name) => (await _lookupAsset(appId, [name, undefined]))[0]; |  | ||||||
| 
 |  | ||||||
|                     break; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             for (const id in factories) { |  | ||||||
|                 if (factories[id].toString().includes(`e.application={`)) { |  | ||||||
|                     const mod = wpRequire(id); |  | ||||||
| 
 |  | ||||||
|                     const _lookupApp = Object.values(mod).find( |  | ||||||
|                         (e) => typeof e === "function" && e.toString().includes(`e.application={`) |  | ||||||
|                     ); |  | ||||||
|                     lookupApp = async (appId) => { |  | ||||||
|                         let socket = {}; |  | ||||||
|                         await _lookupApp(socket, appId); |  | ||||||
|                         return socket.application; |  | ||||||
|                     }; |  | ||||||
| 
 |  | ||||||
|                     break; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         if (msg.activity?.assets?.large_image) |  | ||||||
|             msg.activity.assets.large_image = await lookupAsset( |  | ||||||
|                 msg.activity.application_id, |  | ||||||
|                 msg.activity.assets.large_image |  | ||||||
|             ); |  | ||||||
|         if (msg.activity?.assets?.small_image) |  | ||||||
|             msg.activity.assets.small_image = await lookupAsset( |  | ||||||
|                 msg.activity.application_id, |  | ||||||
|                 msg.activity.assets.small_image |  | ||||||
|             ); |  | ||||||
| 
 |  | ||||||
|         const appId = msg.activity.application_id; |  | ||||||
|         if (!apps[appId]) apps[appId] = await lookupApp(appId); |  | ||||||
| 
 |  | ||||||
|         const app = apps[appId]; |  | ||||||
|         if (!msg.activity.name) msg.activity.name = app.name; |  | ||||||
| 
 |  | ||||||
|         Dispatcher.dispatch({type: "LOCAL_ACTIVITY_UPDATE", ...msg}); // set RPC status
 |  | ||||||
|     }; |  | ||||||
| })(); |  | ||||||
|  | @ -1,9 +0,0 @@ | ||||||
| // myWindow = your discord.com BrowserWindow
 |  | ||||||
| 
 |  | ||||||
| import Server from "./path/to/arrpc/server.js"; |  | ||||||
| 
 |  | ||||||
| const arrpc = await new Server(); |  | ||||||
| arrpc.on("activity", (data) => myWindow.webContents.send("rpc", data)); |  | ||||||
| arrpc.on("invite", (code) => { |  | ||||||
|     // your invite code handling here
 |  | ||||||
| }); |  | ||||||
|  | @ -1,73 +0,0 @@ | ||||||
| import {ipcRenderer} from "electron"; |  | ||||||
| 
 |  | ||||||
| let Dispatcher, |  | ||||||
|     lookupAsset, |  | ||||||
|     lookupApp, |  | ||||||
|     apps = {}; |  | ||||||
| ipcRenderer.on("rpc", async (event, data) => { |  | ||||||
|     if (!Dispatcher) { |  | ||||||
|         const wpRequire = window.webpackChunkdiscord_app.push([[Symbol()], {}, (x) => x]); |  | ||||||
|         const cache = wpRequire.c; |  | ||||||
|         window.webpackChunkdiscord_app.pop(); |  | ||||||
| 
 |  | ||||||
|         for (const id in cache) { |  | ||||||
|             let mod = cache[id].exports; |  | ||||||
|             mod = mod && (mod.Z ?? mod.ZP); |  | ||||||
| 
 |  | ||||||
|             if (mod && mod.register && mod.wait) { |  | ||||||
|                 Dispatcher = mod; |  | ||||||
|                 break; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         const factories = wpRequire.m; |  | ||||||
|         for (const id in factories) { |  | ||||||
|             if (factories[id].toString().includes("getAssetImage: size must === [number, number] for Twitch")) { |  | ||||||
|                 const mod = wpRequire(id); |  | ||||||
| 
 |  | ||||||
|                 const _lookupAsset = Object.values(mod).find( |  | ||||||
|                     (e) => typeof e === "function" && e.toString().includes("apply(") |  | ||||||
|                 ); |  | ||||||
|                 lookupAsset = async (appId, name) => (await _lookupAsset(appId, [name, undefined]))[0]; |  | ||||||
| 
 |  | ||||||
|                 break; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         for (const id in factories) { |  | ||||||
|             if (factories[id].toString().includes(`e.application={`)) { |  | ||||||
|                 const mod = wpRequire(id); |  | ||||||
| 
 |  | ||||||
|                 const _lookupApp = Object.values(mod).find( |  | ||||||
|                     (e) => typeof e === "function" && e.toString().includes(`e.application={`) |  | ||||||
|                 ); |  | ||||||
|                 lookupApp = async (appId) => { |  | ||||||
|                     let socket = {}; |  | ||||||
|                     await _lookupApp(socket, appId); |  | ||||||
|                     return socket.application; |  | ||||||
|                 }; |  | ||||||
| 
 |  | ||||||
|                 break; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (data.activity?.assets?.large_image) |  | ||||||
|         data.activity.assets.large_image = await lookupAsset( |  | ||||||
|             data.activity.application_id, |  | ||||||
|             data.activity.assets.large_image |  | ||||||
|         ); |  | ||||||
|     if (data.activity?.assets?.small_image) |  | ||||||
|         data.activity.assets.small_image = await lookupAsset( |  | ||||||
|             data.activity.application_id, |  | ||||||
|             data.activity.assets.small_image |  | ||||||
|         ); |  | ||||||
| 
 |  | ||||||
|     const appId = data.activity.application_id; |  | ||||||
|     if (!apps[appId]) apps[appId] = await lookupApp(appId); |  | ||||||
| 
 |  | ||||||
|     const app = apps[appId]; |  | ||||||
|     if (!data.activity.name) data.activity.name = app.name; |  | ||||||
| 
 |  | ||||||
|     Dispatcher.dispatch({type: "LOCAL_ACTIVITY_UPDATE", ...data}); // set RPC status
 |  | ||||||
| }); |  | ||||||
|  | @ -1,8 +1,7 @@ | ||||||
| const rgb = (r, g, b, msg) => `\x1b[38;2;${r};${g};${b}m${msg}\x1b[0m`; | const rgb = (r, g, b, msg) => `\x1b[38;2;${r};${g};${b}m${msg}\x1b[0m`; | ||||||
| const log = (...args) => console.log(`[${rgb(88, 101, 242, "arRPC")}]`, ...args); | const log = (...args) => console.log(`[${rgb(88, 101, 242, "arRPC")}]`, ...args); | ||||||
| 
 | 
 | ||||||
| log("arRPC v3.0.0 [ArmCord]"); | log("arRPC v3.1.0 ArmCord"); | ||||||
| 
 |  | ||||||
| const {RPCServer} = require("./server.js"); | const {RPCServer} = require("./server.js"); | ||||||
| const {mainWindow} = require("../../../ts-out/window.js"); | const {mainWindow} = require("../../../ts-out/window.js"); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -11,7 +11,7 @@ const timestamps = {}, | ||||||
|     pids = {}; |     pids = {}; | ||||||
| class ProcessServer { | class ProcessServer { | ||||||
|     constructor(handlers) { |     constructor(handlers) { | ||||||
|         if (!Native) return log("unsupported platform:", process.platform); |         if (!Native) return; // log('unsupported platform:', process.platform);
 | ||||||
| 
 | 
 | ||||||
|         this.handlers = handlers; |         this.handlers = handlers; | ||||||
| 
 | 
 | ||||||
|  | @ -24,9 +24,12 @@ class ProcessServer { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     async scan() { |     async scan() { | ||||||
|  |         const startTime = performance.now(); | ||||||
|         const processes = await Native.getProcesses(); |         const processes = await Native.getProcesses(); | ||||||
|         const ids = []; |         const ids = []; | ||||||
| 
 | 
 | ||||||
|  |         // log(`got processed in ${(performance.now() - startTime).toFixed(2)}ms`);
 | ||||||
|  | 
 | ||||||
|         for (const [pid, _path] of processes) { |         for (const [pid, _path] of processes) { | ||||||
|             const path = _path.toLowerCase().replaceAll("\\", "/"); |             const path = _path.toLowerCase().replaceAll("\\", "/"); | ||||||
|             const toCompare = [path.split("/").pop(), path.split("/").slice(-2).join("/")]; |             const toCompare = [path.split("/").pop(), path.split("/").slice(-2).join("/")]; | ||||||
|  | @ -90,6 +93,9 @@ class ProcessServer { | ||||||
|                 ); |                 ); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         // log(`finished scan in ${(performance.now() - startTime).toFixed(2)}ms`);
 | ||||||
|  |         // process.stdout.write(`\r${' '.repeat(100)}\r[${rgb(88, 101, 242, 'arRPC')} > ${rgb(237, 66, 69, 'process')}] scanned (took ${(performance.now() - startTime).toFixed(2)}ms)`);
 | ||||||
|     } |     } | ||||||
| } | } | ||||||
| module.exports = {ProcessServer}; | module.exports = ProcessServer; | ||||||
|  |  | ||||||
|  | @ -1,2 +1,3 @@ | ||||||
| const win32 = require("./win32.js"); | const win32 = require("./win32"); | ||||||
| module.exports = {win32}; | const linux = require("./linux"); | ||||||
|  | module.exports = {win32, linux}; | ||||||
|  |  | ||||||
							
								
								
									
										31
									
								
								src/arrpc/src/process/native/linux.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								src/arrpc/src/process/native/linux.js
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,31 @@ | ||||||
|  | const {exec} = require("child_process"); | ||||||
|  | const {readlink} = require("fs/promises"); | ||||||
|  | 
 | ||||||
|  | const getProcesses = () => | ||||||
|  |     new Promise((res) => | ||||||
|  |         exec(`ps a -o "%p;%c;%a"`, async (e, out) => { | ||||||
|  |             res( | ||||||
|  |                 ( | ||||||
|  |                     await Promise.all( | ||||||
|  |                         out | ||||||
|  |                             .toString() | ||||||
|  |                             .split("\n") | ||||||
|  |                             .slice(1, -1) | ||||||
|  |                             .map(async (x) => { | ||||||
|  |                                 const split = x.trim().split(";"); | ||||||
|  |                                 // if (split.length === 1) return;
 | ||||||
|  | 
 | ||||||
|  |                                 const pid = parseInt(split[0].trim()); | ||||||
|  |                                 const cmd = split[1].trim(); | ||||||
|  |                                 const argv = split.slice(2).join(";").trim(); | ||||||
|  | 
 | ||||||
|  |                                 const path = await readlink(`/proc/${pid}/exe`).catch((e) => {}); // read path from /proc/{pid}/exe symlink
 | ||||||
|  | 
 | ||||||
|  |                                 return [pid, path]; | ||||||
|  |                             }) | ||||||
|  |                     ) | ||||||
|  |                 ).filter((x) => x && x[1]) | ||||||
|  |             ); | ||||||
|  |         }) | ||||||
|  |     ); | ||||||
|  | module.exports = getProcesses; | ||||||
|  | @ -1,21 +1,20 @@ | ||||||
| const {exec} = require("child_process"); | const {exec} = require("child_process"); | ||||||
| 
 | 
 | ||||||
| module.exports = { | const getProcesses = () => | ||||||
|     getProcesses: () => |     new Promise((res) => | ||||||
|         new Promise((res) => |         exec(`wmic process get ProcessID,ExecutablePath /format:csv`, (e, out) => { | ||||||
|             exec(`wmic process get ProcessID,ExecutablePath /format:csv`, (e, out) => { |             res( | ||||||
|                 res( |                 out | ||||||
|                     out |                     .toString() | ||||||
|                         .toString() |                     .split("\r\n") | ||||||
|                         .split("\r\n") |                     .slice(2) | ||||||
|                         .slice(2) |                     .map((x) => { | ||||||
|                         .map((x) => { |                         const parsed = x.trim().split(",").slice(1).reverse(); | ||||||
|                             const parsed = x.trim().split(",").slice(1).reverse(); |                         parsed[0] = parseInt(parsed[0]) || parsed[0]; // pid to int
 | ||||||
|                             parsed[0] = parseInt(parsed[0]) || parsed[0]; // pid to int
 |                         return parsed; | ||||||
|                             return parsed; |                     }) | ||||||
|                         }) |                     .filter((x) => x[1]) | ||||||
|                         .filter((x) => x[1]) |             ); | ||||||
|                 ); |         }) | ||||||
|             }) |     ); | ||||||
|         ) | module.exports = getProcesses; | ||||||
| }; |  | ||||||
|  |  | ||||||
|  | @ -1,8 +1,10 @@ | ||||||
|  | const rgb = (r, g, b, msg) => `\x1b[38;2;${r};${g};${b}m${msg}\x1b[0m`; | ||||||
|  | const log = (...args) => console.log(`[${rgb(88, 101, 242, "arRPC")} > ${rgb(87, 242, 135, "bridge")}]`, ...args); | ||||||
| const {EventEmitter} = require("events"); | const {EventEmitter} = require("events"); | ||||||
| 
 | 
 | ||||||
| const {IPCServer} = require("./transports/ipc.js"); | const IPCServer = require("./transports/ipc.js"); | ||||||
| const {WSServer} = require("./transports/websocket.js"); | const WSServer = require("./transports/websocket.js"); | ||||||
| const {ProcessServer} = require("./process/index.js"); | const ProcessServer = require("./process/index.js"); | ||||||
| 
 | 
 | ||||||
| let socketId = 0; | let socketId = 0; | ||||||
| class RPCServer extends EventEmitter { | class RPCServer extends EventEmitter { | ||||||
|  | @ -143,4 +145,4 @@ class RPCServer extends EventEmitter { | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| module.exports = {RPCServer}; | module.exports = RPCServer; | ||||||
|  |  | ||||||
|  | @ -268,4 +268,4 @@ class IPCServer { | ||||||
|         this.handlers.message(socket, msg); |         this.handlers.message(socket, msg); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| module.exports = {IPCServer}; | module.exports = IPCServer; | ||||||
|  |  | ||||||
|  | @ -25,7 +25,7 @@ class WSServer { | ||||||
|                     await new Promise((res) => { |                     await new Promise((res) => { | ||||||
|                         http = createServer(); |                         http = createServer(); | ||||||
|                         http.on("error", (e) => { |                         http.on("error", (e) => { | ||||||
|                             // log("http error", e);
 |                             // log('http error', e);
 | ||||||
| 
 | 
 | ||||||
|                             if (e.code === "EADDRINUSE") { |                             if (e.code === "EADDRINUSE") { | ||||||
|                                 log(port, "in use!"); |                                 log(port, "in use!"); | ||||||
|  | @ -35,7 +35,7 @@ class WSServer { | ||||||
| 
 | 
 | ||||||
|                         wss = new WebSocketServer({server: http}); |                         wss = new WebSocketServer({server: http}); | ||||||
|                         wss.on("error", (e) => { |                         wss.on("error", (e) => { | ||||||
|                             // log("wss error", e);
 |                             // log('wss error', e);
 | ||||||
|                         }); |                         }); | ||||||
| 
 | 
 | ||||||
|                         wss.on("connection", this.onConnection); |                         wss.on("connection", this.onConnection); | ||||||
|  | @ -92,8 +92,8 @@ class WSServer { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         /* if (clientId === "") { |         /* if (clientId === '') { | ||||||
|       log("client id required"); |       log('client id required'); | ||||||
| 
 | 
 | ||||||
|       socket.close(); |       socket.close(); | ||||||
|       return; |       return; | ||||||
|  | @ -127,4 +127,4 @@ class WSServer { | ||||||
|         this.handlers.message(socket, JSON.parse(msg)); |         this.handlers.message(socket, JSON.parse(msg)); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| module.exports = {WSServer}; | module.exports = WSServer; | ||||||
|  |  | ||||||
|  | @ -4,7 +4,6 @@ | ||||||
|         <meta charset="UTF-8" /> |         <meta charset="UTF-8" /> | ||||||
|         <style> |         <style> | ||||||
|             @import url("../content/css/settings.css"); |             @import url("../content/css/settings.css"); | ||||||
|             @import url("../content/css/settingsEng.css"); |  | ||||||
|         </style> |         </style> | ||||||
|     </head> |     </head> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -31,6 +31,7 @@ contextMenu({ | ||||||
|     showSaveImageAs: true, |     showSaveImageAs: true, | ||||||
|     showCopyImageAddress: true, |     showCopyImageAddress: true, | ||||||
|     showSearchWithGoogle: false, |     showSearchWithGoogle: false, | ||||||
|  |     showSearchWithDuckDuckGo: false, | ||||||
|     prepend: (defaultActions, parameters, browserWindow) => [ |     prepend: (defaultActions, parameters, browserWindow) => [ | ||||||
|         { |         { | ||||||
|             label: "Search with Google", |             label: "Search with Google", | ||||||
|  | @ -58,7 +59,7 @@ async function doAfterDefiningTheWindow() { | ||||||
|     } |     } | ||||||
|     if (transparency && process.platform === "win32") { |     if (transparency && process.platform === "win32") { | ||||||
|         import("@pyke/vibe").then(async (vibe) => { |         import("@pyke/vibe").then(async (vibe) => { | ||||||
|             vibe.applyEffect(mainWindow, "unified-acrylic"); |             vibe.applyEffect(mainWindow, "acrylic"); | ||||||
|             vibe.forceTheme(mainWindow, "dark"); |             vibe.forceTheme(mainWindow, "dark"); | ||||||
|             if ((await getConfig("startMinimized")) == false) { |             if ((await getConfig("startMinimized")) == false) { | ||||||
|                 mainWindow.show(); |                 mainWindow.show(); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue