GoonCord/src/lib/debug.ts

121 lines
3.8 KiB
TypeScript
Raw Normal View History

import { RNConstants } from "@types";
2023-01-10 23:30:46 +00:00
import { ReactNative as RN } from "@metro/common";
2022-10-22 22:44:42 +01:00
import { after } from "@lib/patcher";
2022-10-23 00:51:18 +01:00
import { getAssetIDByName } from "@ui/assets";
import { showToast } from "@ui/toasts";
import logger from "@lib/logger";
export let socket: WebSocket;
export function connectToDebugger(url: string) {
if (socket !== undefined && socket.readyState !== WebSocket.CLOSED) {
socket.close();
}
2022-10-23 00:51:18 +01:00
if (url === "") {
showToast("Invalid debugger URL!", getAssetIDByName("Small"));
return;
}
socket = new WebSocket(`ws://${url}`);
2022-10-23 00:51:18 +01:00
socket.addEventListener("open", () => showToast("Connected to debugger.", getAssetIDByName("Check")));
socket.addEventListener("message", (message: any) => {
try {
(0, eval)(message.data);
} catch (e) {
console.error(e);
}
});
2022-10-23 00:51:18 +01:00
socket.addEventListener("error", (err: any) => {
console.log(`Debugger error: ${err.message}`);
showToast("An error occurred with the debugger connection!", getAssetIDByName("Small"));
});
}
export function patchLogHook() {
const unpatch = after("nativeLoggingHook", globalThis, (args) => {
if (socket?.readyState === WebSocket.OPEN) socket.send(JSON.stringify({ message: args[0], level: args[1] }));
logger.log(args[0]);
});
return () => {
socket && socket.close();
unpatch();
}
}
2023-01-10 23:30:46 +00:00
export const versionHash = "__vendettaVersion";
2023-01-14 02:39:10 +00:00
export function getDebugInfo() {
2023-01-30 22:56:48 +00:00
// Discord
2023-01-10 23:30:46 +00:00
const InfoDictionaryManager = RN.NativeModules.InfoDictionaryManager;
2023-01-30 22:56:48 +00:00
const DCDDeviceManager = RN.NativeModules.DCDDeviceManager;
// Hermes
2023-01-10 23:30:46 +00:00
const hermesProps = window.HermesInternal.getRuntimeProperties();
2023-01-30 22:56:48 +00:00
const hermesVer = hermesProps["OSS Release Version"];
const padding = "for RN ";
// RN
const PlatformConstants = RN.Platform.constants as RNConstants;
const rnVer = PlatformConstants.reactNativeVersion;
2023-01-10 23:30:46 +00:00
return {
vendetta: {
version: versionHash,
loader: window.__vendetta_loader?.name ?? "Unknown",
2023-01-10 23:30:46 +00:00
},
discord: {
version: InfoDictionaryManager.Version,
build: InfoDictionaryManager.Build,
},
react: {
version: React.version,
2023-01-30 22:56:48 +00:00
nativeVersion: hermesVer.startsWith(padding) ? hermesVer.substring(padding.length) : `${rnVer.major}.${rnVer.minor}.${rnVer.patch}`,
2023-01-10 23:30:46 +00:00
},
hermes: {
2023-01-30 22:56:48 +00:00
version: hermesVer,
2023-01-10 23:30:46 +00:00
buildType: hermesProps["Build"],
bytecodeVersion: hermesProps["Bytecode Version"],
},
...RN.Platform.select(
{
android: {
os: {
name: "Android",
version: PlatformConstants.Release,
sdk: PlatformConstants.Version
},
},
ios: {
os: {
name: PlatformConstants.systemName,
version: PlatformConstants.osVersion
},
}
}
)!,
...RN.Platform.select(
{
android: {
device: {
manufacturer: PlatformConstants.Manufacturer,
brand: PlatformConstants.Brand,
model: PlatformConstants.Model,
codename: DCDDeviceManager.device
}
},
ios: {
device: {
manufacturer: DCDDeviceManager.deviceManufacturer,
brand: DCDDeviceManager.deviceBrand,
model: DCDDeviceManager.deviceModel,
codename: DCDDeviceManager.device
}
}
}
)!
2023-01-10 23:30:46 +00:00
}
}