From c63e7a17d4259c8bf9b0b7f0ac88d69807b1ca3e Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Sat, 15 Nov 2025 17:37:10 -0500 Subject: [PATCH] =?UTF-8?q?ARRPC-Bun:=20=F0=9F=91=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/equicordplugins/arRPCBun.web/index.tsx | 233 --------------------- 1 file changed, 233 deletions(-) delete mode 100644 src/equicordplugins/arRPCBun.web/index.tsx diff --git a/src/equicordplugins/arRPCBun.web/index.tsx b/src/equicordplugins/arRPCBun.web/index.tsx deleted file mode 100644 index 8ae8275f3..000000000 --- a/src/equicordplugins/arRPCBun.web/index.tsx +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Vencord, a Discord client mod - * Copyright (c) 2025 Vendicated and contributors - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -import { popNotice, showNotice } from "@api/Notices"; -import { definePluginSettings } from "@api/Settings"; -import { EquicordDevs } from "@utils/constants"; -import { Logger } from "@utils/Logger"; -import { isAnyPluginDev, isEquicordGuild } from "@utils/misc"; -import definePlugin, { OptionType, ReporterTestable } from "@utils/types"; -import { ApplicationAssetUtils, fetchApplicationsRPC, FluxDispatcher, UserStore } from "@webpack/common"; - -const logger = new Logger("arRPCBun"); - -async function lookupAsset(applicationId: string, key: string): Promise { - return (await ApplicationAssetUtils.fetchAssetIds(applicationId, [key]))[0]; -} - -const apps: any = {}; -async function lookupApp(applicationId: string): Promise { - const socket: any = {}; - await fetchApplicationsRPC(socket, applicationId); - return socket.application; -} - -let ws: WebSocket; -let reconnectTimer: NodeJS.Timeout | null = null; -const RECONNECT_INTERVAL = 5000; - -export const settings = definePluginSettings({ - oldVerNotice: { - type: OptionType.BOOLEAN, - description: "old version notice for why arrpc bun doesnt work", - default: false, - hidden: true - }, - oneTimeNotice: { - type: OptionType.BOOLEAN, - description: "One time notice for showing arrpc disabled", - default: false, - hidden: true - }, -}); - - -export default definePlugin({ - name: "arRPCBun", - description: "arRPCBun integration", - authors: [EquicordDevs.creations], - reporterTestable: ReporterTestable.None, - enabledByDefault: IS_EQUIBOP, - settings, - - commands: [ - { - name: "arrpc-debug", - description: "Show arRPCBun debug information", - predicate: ctx => { - const result = isAnyPluginDev(UserStore.getCurrentUser()?.id) || isEquicordGuild(ctx?.guild?.id, true); - return result; - }, - execute: () => { - const arrpcStatus = IS_EQUIBOP ? VesktopNative.arrpc?.getStatus?.() : null; - - let content = ""; - - if (IS_EQUIBOP) { - const version = VesktopNative.app.getVersion(); - const gitHash = VesktopNative.app.getGitHash?.(); - const shortHash = gitHash?.slice(0, 7); - - content += `Equibop: v${version}`; - if (shortHash) { - content += ` • [${shortHash}]()`; - } - content += "\n"; - } - - if (arrpcStatus) { - content += `Running: ${arrpcStatus.running ? "Yes" : "No"}\n`; - content += `Enabled: ${arrpcStatus.enabled ? "Yes" : "No"}\n`; - - if (arrpcStatus.running) { - content += `Port: ${arrpcStatus.port}\n`; - content += `PID: ${arrpcStatus.pid}\n`; - - if (arrpcStatus.uptime) { - const seconds = Math.floor(arrpcStatus.uptime / 1000); - const minutes = Math.floor(seconds / 60); - const hours = Math.floor(minutes / 60); - - if (hours > 0) { - content += `Uptime: ${hours}h ${minutes % 60}m ${seconds % 60}s\n`; - } else if (minutes > 0) { - content += `Uptime: ${minutes}m ${seconds % 60}s\n`; - } else { - content += `Uptime: ${seconds}s\n`; - } - } - } - - const info = [ - arrpcStatus.restartCount > 0 && ["Restarts", arrpcStatus.restartCount], - arrpcStatus.bunPath && ["Bun", arrpcStatus.bunPath], - arrpcStatus.warnings?.length && ["Warnings", arrpcStatus.warnings.join(", ")], - arrpcStatus.lastError && ["Last Error", arrpcStatus.lastError], - arrpcStatus.lastExitCode && arrpcStatus.lastExitCode !== 0 && ["Exit Code", arrpcStatus.lastExitCode] - ].filter(Boolean); - - content += info.map(([type, value]) => `${type}: ${value}`).join("\n"); - } else { - if (ws) { - content += ws.readyState === WebSocket.OPEN - ? "WebSocket: Connected to external arRPCBun server\n" - : `WebSocket: ${["Connecting", "Open", "Closing", "Closed"][ws.readyState]}\n`; - } else { - content += "WebSocket: Not connected\n"; - } - } - - return { content }; - }, - }, - ], - - async handleEvent(e: MessageEvent) { - const data = JSON.parse(e.data); - - const { activity } = data; - const assets = activity?.assets; - - if (assets?.large_image) assets.large_image = await lookupAsset(activity.application_id, assets.large_image); - if (assets?.small_image) assets.small_image = await lookupAsset(activity.application_id, assets.small_image); - - if (activity) { - const appId = activity.application_id; - apps[appId] ||= await lookupApp(appId); - - const app = apps[appId]; - activity.name ||= app.name; - } - - FluxDispatcher.dispatch({ type: "LOCAL_ACTIVITY_UPDATE", ...data }); - }, - - connect() { - const arrpcStatus = IS_EQUIBOP ? VesktopNative.arrpc?.getStatus?.() : null; - const host = arrpcStatus?.host || "127.0.0.1"; - const port = arrpcStatus?.port || 1337; - - const wsUrl = `ws://${host}:${port}`; - logger.info(`Connecting to arRPCBun at ${wsUrl}${arrpcStatus?.host ? "" : " (using defaults)"}`); - - if (ws) ws.close(); - ws = new WebSocket(wsUrl); - - ws.onmessage = this.handleEvent; - - ws.onerror = error => { - logger.error("WebSocket error:", error); - }; - - ws.onclose = () => { - logger.info("WebSocket closed, will attempt reconnect in 5s"); - FluxDispatcher.dispatch({ type: "LOCAL_ACTIVITY_UPDATE", activity: null }); - - if (reconnectTimer) clearTimeout(reconnectTimer); - reconnectTimer = setTimeout(() => { - logger.info("Attempting to reconnect..."); - this.connect(); - }, RECONNECT_INTERVAL); - }; - - ws.onopen = () => { - logger.info("Successfully connected to arRPCBun"); - if (reconnectTimer) { - clearTimeout(reconnectTimer); - reconnectTimer = null; - } - }; - }, - - async start() { - // only works on 3.0.8+ - if (IS_EQUIBOP) { - const version = VesktopNative.app.getVersion(); - const [major, minor, patch] = version.split(".").map(Number); - - if (major < 3 || (major === 3 && minor === 0 && patch < 8) && !settings.store.oldVerNotice) { - logger.error(`Equibop ${version} is too old. Requires 3.0.8+ for arRPCBun fix.`); - showNotice(`arRPCBun requires Equibop 3.0.8+. You have ${version}. Update Equibop to use this plugin.`, "OK", () => { - settings.store.oldVerNotice = true; - popNotice(); - }); - return; - } - } - - // disable WebRichPresence to avoid conflicts - const webRPC = Vencord.Plugins.plugins.WebRichPresence; - if (webRPC && Vencord.Plugins.isPluginEnabled("WebRichPresence")) { - logger.info("Disabling WebRichPresence to avoid conflicts"); - Vencord.Plugins.stopPlugin(webRPC); - } - - // get arRPC status from Equibop if available, otherwise use defaults - const arrpcStatus = IS_EQUIBOP ? VesktopNative.arrpc?.getStatus?.() : null; - - // if on Equibop and arRPC is disabled AND not running, warn user - if (IS_EQUIBOP && !arrpcStatus?.enabled && !arrpcStatus?.running && !settings.store.oneTimeNotice) { - logger.warn("Equibop's built-in arRPC is disabled and not running"); - showNotice("arRPC is not running. Enable it in Equibop settings, or run your own arRPCBun server.", "OK", () => { - settings.store.oneTimeNotice = true; - popNotice(); - }); - return; - } - - this.connect(); - }, - - stop() { - if (reconnectTimer) { - clearTimeout(reconnectTimer); - reconnectTimer = null; - } - FluxDispatcher.dispatch({ type: "LOCAL_ACTIVITY_UPDATE", activity: null }); - ws?.close(); - logger.info("Stopped arRPCBun connection"); - } -});