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/badge/vertical-allrepos/armcord.svg)](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
|
||||
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
|
||||
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F1710089DA28B361
|
||||
echo "deb [arch=$(dpkg --print-architecture)] https://eu.armcord.xyz/apt-repo stable main" | sudo tee /etc/apt/sources.list.d/armcord.list
|
||||
curl -fsSL https://eu.armcord.xyz/pgp-key.public | sudo gpg --dearmor -o /usr/share/keyrings/armcord.gpg
|
||||
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 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 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…
Reference in a new issue