From f20dde89137d9b046f583fcbfe0d285c0b68309f Mon Sep 17 00:00:00 2001 From: Rory& Date: Sun, 26 Jul 2026 22:18:56 +0200 Subject: [PATCH] Add util script to send IPC messages, "fix" ID stuff --- src/gateway/listener/listener.ts | 2 +- src/send-ipc-message.ts | 66 ++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 src/send-ipc-message.ts diff --git a/src/gateway/listener/listener.ts b/src/gateway/listener/listener.ts index 226859a87..b2b7fbf63 100644 --- a/src/gateway/listener/listener.ts +++ b/src/gateway/listener/listener.ts @@ -184,7 +184,7 @@ export async function setupListener(this: WebSocket) { // TODO: only subscribe for events that are in the connection intents async function consume(this: WebSocket, opts: EventOpts) { const { data, event } = opts; - const id = data.id as string; + const id = (opts.guild_id || opts.channel_id || opts.user_id || opts.session_id) as string; const permission = this.permissions[id] || new Permissions("ADMINISTRATOR"); // default permission for dm const consumer = consume.bind(this); diff --git a/src/send-ipc-message.ts b/src/send-ipc-message.ts new file mode 100644 index 000000000..adc9ba4aa --- /dev/null +++ b/src/send-ipc-message.ts @@ -0,0 +1,66 @@ +/* + Spacebar: A FOSS re-implementation and extension of the Discord.com backend. + Copyright (C) 2026 Spacebar and Spacebar Contributors + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +import { emitEvent } from "@spacebar/util"; + +process.on("uncaughtException", console.error); +process.on("unhandledRejection", console.error); + +import moduleAlias from "module-alias"; +moduleAlias(__dirname + "../../package.json"); +import { config } from "dotenv"; +config({ quiet: true }); + +process.env.DB_LOGGING = "true"; + +import fs from "node:fs/promises"; +import { UnixSocketWriter } from "@spacebar/util/util/ipc/writer/UnixSocketWriter"; +import { Event } from "@spacebar/util/interfaces/Event"; +import { sleep } from "@spacebar/extensions"; + +function getArgvOrFail(idx: number, message: string) { + if (process.argv.length <= idx) throw message + "\n"; + return process.argv[idx]; +} + +async function main() { + const sockDir = getArgvOrFail(2, "Usage: node dist/send-ipc-message.js "); + if (!(await fs.readdir(sockDir))) throw `Socket directory "${sockDir}" is not a valid directory`; + + const unixWriter = new UnixSocketWriter(sockDir); + await unixWriter.init(); + + const payloadJson = await fs.readFile("/dev/stdin", "utf-8"); + const payload = JSON.parse(payloadJson) as Event; + + payload.origin ??= "send-ipc-message"; + payload.created_at ??= new Date(); + payload.transaction_id ??= process.pid.toString(); + + const id = (payload.guild_id || payload.channel_id || payload.user_id || payload.session_id) as string; + if (!id) return console.error("event doesn't contain any id", payload); + // (payload as unknown).id = id; + + await unixWriter.emit(payload); + console.log("Emitted..."); + await sleep(1000); + await unixWriter.close(); + console.log("Closed..."); +} + +main().then(() => console.log("meow"));