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
				
			
		|  | @ -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 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 {mainWindow} = require("../../../ts-out/window.js"); | ||||
| 
 | ||||
|  |  | |||
|  | @ -11,7 +11,7 @@ const timestamps = {}, | |||
|     pids = {}; | ||||
| class ProcessServer { | ||||
|     constructor(handlers) { | ||||
|         if (!Native) return log("unsupported platform:", process.platform); | ||||
|         if (!Native) return; // log('unsupported platform:', process.platform);
 | ||||
| 
 | ||||
|         this.handlers = handlers; | ||||
| 
 | ||||
|  | @ -24,9 +24,12 @@ class ProcessServer { | |||
|     } | ||||
| 
 | ||||
|     async scan() { | ||||
|         const startTime = performance.now(); | ||||
|         const processes = await Native.getProcesses(); | ||||
|         const ids = []; | ||||
| 
 | ||||
|         // log(`got processed in ${(performance.now() - startTime).toFixed(2)}ms`);
 | ||||
| 
 | ||||
|         for (const [pid, _path] of processes) { | ||||
|             const path = _path.toLowerCase().replaceAll("\\", "/"); | ||||
|             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"); | ||||
| module.exports = {win32}; | ||||
| const win32 = require("./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"); | ||||
| 
 | ||||
| module.exports = { | ||||
|     getProcesses: () => | ||||
|         new Promise((res) => | ||||
|             exec(`wmic process get ProcessID,ExecutablePath /format:csv`, (e, out) => { | ||||
|                 res( | ||||
|                     out | ||||
|                         .toString() | ||||
|                         .split("\r\n") | ||||
|                         .slice(2) | ||||
|                         .map((x) => { | ||||
|                             const parsed = x.trim().split(",").slice(1).reverse(); | ||||
|                             parsed[0] = parseInt(parsed[0]) || parsed[0]; // pid to int
 | ||||
|                             return parsed; | ||||
|                         }) | ||||
|                         .filter((x) => x[1]) | ||||
|                 ); | ||||
|             }) | ||||
|         ) | ||||
| }; | ||||
| const getProcesses = () => | ||||
|     new Promise((res) => | ||||
|         exec(`wmic process get ProcessID,ExecutablePath /format:csv`, (e, out) => { | ||||
|             res( | ||||
|                 out | ||||
|                     .toString() | ||||
|                     .split("\r\n") | ||||
|                     .slice(2) | ||||
|                     .map((x) => { | ||||
|                         const parsed = x.trim().split(",").slice(1).reverse(); | ||||
|                         parsed[0] = parseInt(parsed[0]) || parsed[0]; // pid to int
 | ||||
|                         return parsed; | ||||
|                     }) | ||||
|                     .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 {IPCServer} = require("./transports/ipc.js"); | ||||
| const {WSServer} = require("./transports/websocket.js"); | ||||
| const {ProcessServer} = require("./process/index.js"); | ||||
| const IPCServer = require("./transports/ipc.js"); | ||||
| const WSServer = require("./transports/websocket.js"); | ||||
| const ProcessServer = require("./process/index.js"); | ||||
| 
 | ||||
| let socketId = 0; | ||||
| 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); | ||||
|     } | ||||
| } | ||||
| module.exports = {IPCServer}; | ||||
| module.exports = IPCServer; | ||||
|  |  | |||
|  | @ -25,7 +25,7 @@ class WSServer { | |||
|                     await new Promise((res) => { | ||||
|                         http = createServer(); | ||||
|                         http.on("error", (e) => { | ||||
|                             // log("http error", e);
 | ||||
|                             // log('http error', e);
 | ||||
| 
 | ||||
|                             if (e.code === "EADDRINUSE") { | ||||
|                                 log(port, "in use!"); | ||||
|  | @ -35,7 +35,7 @@ class WSServer { | |||
| 
 | ||||
|                         wss = new WebSocketServer({server: http}); | ||||
|                         wss.on("error", (e) => { | ||||
|                             // log("wss error", e);
 | ||||
|                             // log('wss error', e);
 | ||||
|                         }); | ||||
| 
 | ||||
|                         wss.on("connection", this.onConnection); | ||||
|  | @ -92,8 +92,8 @@ class WSServer { | |||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         /* if (clientId === "") { | ||||
|       log("client id required"); | ||||
|         /* if (clientId === '') { | ||||
|       log('client id required'); | ||||
| 
 | ||||
|       socket.close(); | ||||
|       return; | ||||
|  | @ -127,4 +127,4 @@ class WSServer { | |||
|         this.handlers.message(socket, JSON.parse(msg)); | ||||
|     } | ||||
| } | ||||
| module.exports = {WSServer}; | ||||
| module.exports = WSServer; | ||||
|  |  | |||
|  | @ -4,7 +4,6 @@ | |||
|         <meta charset="UTF-8" /> | ||||
|         <style> | ||||
|             @import url("../content/css/settings.css"); | ||||
|             @import url("../content/css/settingsEng.css"); | ||||
|         </style> | ||||
|     </head> | ||||
| 
 | ||||
|  |  | |||
|  | @ -31,6 +31,7 @@ contextMenu({ | |||
|     showSaveImageAs: true, | ||||
|     showCopyImageAddress: true, | ||||
|     showSearchWithGoogle: false, | ||||
|     showSearchWithDuckDuckGo: false, | ||||
|     prepend: (defaultActions, parameters, browserWindow) => [ | ||||
|         { | ||||
|             label: "Search with Google", | ||||
|  | @ -58,7 +59,7 @@ async function doAfterDefiningTheWindow() { | |||
|     } | ||||
|     if (transparency && process.platform === "win32") { | ||||
|         import("@pyke/vibe").then(async (vibe) => { | ||||
|             vibe.applyEffect(mainWindow, "unified-acrylic"); | ||||
|             vibe.applyEffect(mainWindow, "acrylic"); | ||||
|             vibe.forceTheme(mainWindow, "dark"); | ||||
|             if ((await getConfig("startMinimized")) == false) { | ||||
|                 mainWindow.show(); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue