armcord/src/arrpc/src/server.js

117 lines
3.4 KiB
JavaScript
Raw Normal View History

2022-11-19 22:15:05 +00:00
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);
2022-11-20 12:48:07 +00:00
const {EventEmitter} = require("events");
2022-11-22 14:03:54 +00:00
const {IPCServer} = require("./transports/ipc.js");
2022-11-20 12:48:07 +00:00
const {WSServer} = require("./transports/websocket.js");
2022-11-22 14:03:54 +00:00
let socketId = 0;
2022-11-20 12:48:07 +00:00
class RPCServer extends EventEmitter {
2022-11-19 22:15:05 +00:00
constructor() {
2022-11-20 12:48:07 +00:00
super();
2022-11-19 22:15:05 +00:00
return (async () => {
this.onConnection = this.onConnection.bind(this);
this.onMessage = this.onMessage.bind(this);
2022-11-22 14:03:54 +00:00
this.onClose = this.onClose.bind(this);
2022-11-19 22:15:05 +00:00
2022-11-22 14:03:54 +00:00
const handlers = {
connection: this.onConnection,
message: this.onMessage,
close: this.onClose
};
this.ipc = await new IPCServer(handlers);
this.ws = await new WSServer(handlers);
2022-11-20 12:48:07 +00:00
return this;
2022-11-19 22:15:05 +00:00
})();
}
onConnection(socket) {
socket.send({
cmd: "DISPATCH",
evt: "READY",
2022-11-20 12:48:07 +00:00
data: {
v: 1
}
2022-11-19 22:15:05 +00:00
});
2022-11-20 12:48:07 +00:00
2022-11-22 14:03:54 +00:00
socket.socketId = socketId++;
2022-11-20 12:48:07 +00:00
this.emit("connection", socket);
2022-11-19 22:15:05 +00:00
}
2022-11-22 14:03:54 +00:00
onClose(socket) {
this.emit("activity", {
activity: null,
pid: socket.lastPid,
socketId: socket.socketId.toString()
});
this.emit("close", socket);
}
2022-11-20 12:48:07 +00:00
async onMessage(socket, {cmd, args, nonce}) {
this.emit("message", {socket, cmd, args, nonce});
2022-11-19 22:15:05 +00:00
switch (cmd) {
case "SET_ACTIVITY":
2022-11-20 12:48:07 +00:00
const {activity, pid} = args; // translate given parameters into what discord dispatch expects
2022-11-19 22:15:05 +00:00
const {buttons, timestamps, instance} = activity;
2022-11-22 14:03:54 +00:00
socket.lastPid = pid ?? socket.lastPid;
2022-11-19 22:15:05 +00:00
const metadata = {};
const extra = {};
if (buttons) {
2022-11-20 12:48:07 +00:00
// map buttons into expected metadata
2022-11-19 22:15:05 +00:00
metadata.button_urls = buttons.map((x) => x.url);
extra.buttons = buttons.map((x) => x.label);
}
if (timestamps)
for (const x in timestamps) {
2022-11-20 12:48:07 +00:00
// translate s -> ms timestamps
2022-11-19 22:15:05 +00:00
if (Date.now().toString().length - timestamps[x].toString().length > 2)
2022-11-20 12:48:07 +00:00
timestamps[x] = Math.floor(1000 * timestamps[x]);
2022-11-19 22:15:05 +00:00
}
2022-11-20 12:48:07 +00:00
this.emit("activity", {
2022-11-19 22:15:05 +00:00
activity: {
2022-11-22 14:03:54 +00:00
application_id: socket.clientId,
2022-11-19 22:15:05 +00:00
type: 0,
metadata,
flags: instance ? 1 << 0 : 0,
...activity,
...extra
},
2022-11-22 14:03:54 +00:00
pid,
socketId: socket.socketId.toString()
2022-11-19 22:15:05 +00:00
});
break;
2022-11-20 12:48:07 +00:00
2022-11-22 14:03:54 +00:00
case "GUILD_TEMPLATE_BROWSER":
2022-11-20 12:48:07 +00:00
case "INVITE_BROWSER":
const {code} = args;
socket.send({
cmd,
data: {
code
},
nonce
});
2022-11-22 14:03:54 +00:00
this.emit(cmd === "INVITE_BROWSER" ? "invite" : "guild_template", code);
break;
case "DEEP_LINK":
this.emit("link", args.params);
2022-11-20 12:48:07 +00:00
break;
2022-11-19 22:15:05 +00:00
}
}
}
module.exports = {RPCServer};