GoonCord/src/lib/api/debug.ts

167 lines
5.2 KiB
TypeScript
Raw Normal View History

2024-10-13 14:03:20 +08:00
import { getThemeFromLoader, selectTheme, themes } from "@lib/addons/themes";
2024-07-09 15:53:34 +08:00
import { findAssetId } from "@lib/api/assets";
2024-04-30 17:07:23 +08:00
import { getLoaderName, getLoaderVersion, isThemeSupported } from "@lib/api/native/loader";
import { BundleUpdaterManager, NativeClientInfoModule, NativeDeviceModule } from "@lib/api/native/modules";
import { after } from "@lib/api/patcher";
2024-07-30 00:18:01 +08:00
import { settings } from "@lib/api/settings";
2024-03-07 12:35:07 +08:00
import { logger } from "@lib/utils/logger";
2024-03-06 01:57:59 +08:00
import { showToast } from "@ui/toasts";
2024-05-24 19:25:54 +08:00
import { version } from "bunny-build-info";
import { Platform, type PlatformConstants } from "react-native";
2024-02-23 15:11:35 +08:00
export interface RNConstants extends PlatformConstants {
// Android
Version: number;
Release: string;
Serial: string;
Fingerprint: string;
Model: string;
Brand: string;
Manufacturer: string;
ServerHost?: string;
// iOS
2025-05-03 20:32:55 +01:00
// forceTouchAvailable: boolean;
// interfaceIdiom: string;
// osVersion: string;
// systemName: string;
2024-02-23 15:11:35 +08:00
}
2024-03-11 15:04:11 +08:00
/**
* @internal
*/
export async function toggleSafeMode() {
2024-03-06 01:57:59 +08:00
settings.safeMode = { ...settings.safeMode, enabled: !settings.safeMode?.enabled };
2024-02-23 00:33:40 +08:00
if (isThemeSupported()) {
2024-03-11 15:04:11 +08:00
if (getThemeFromLoader()?.id) settings.safeMode!.currentThemeId = getThemeFromLoader()!.id;
if (settings.safeMode?.enabled) {
2024-03-11 16:02:11 +08:00
await selectTheme(null);
} else if (settings.safeMode?.currentThemeId) {
2024-03-11 16:02:11 +08:00
await selectTheme(themes[settings.safeMode?.currentThemeId]);
}
}
setTimeout(BundleUpdaterManager.reload, 400);
}
let socket: WebSocket;
export function connectToDebugger(url: string) {
2023-02-26 22:56:36 +00:00
if (socket !== undefined && socket.readyState !== WebSocket.CLOSED) socket.close();
2023-02-26 22:56:36 +00:00
if (!url) {
2024-07-09 15:53:34 +08:00
showToast("Invalid debugger URL!", findAssetId("Small"));
2022-10-23 00:51:18 +01:00
return;
}
socket = new WebSocket(`ws://${url}`);
2024-07-09 15:53:34 +08:00
socket.addEventListener("open", () => showToast("Connected to debugger.", findAssetId("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}`);
2024-07-09 15:53:34 +08:00
showToast("An error occurred with the debugger connection!", findAssetId("Small"));
2022-10-23 00:51:18 +01:00
});
}
2024-03-11 15:04:11 +08:00
/**
* @internal
*/
export function patchLogHook() {
2024-03-06 01:57:59 +08:00
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();
2024-03-06 01:57:59 +08:00
};
}
2023-01-10 23:30:46 +00:00
2024-03-11 15:04:11 +08:00
/** @internal */
export const versionHash = version;
2023-01-10 23:30:46 +00:00
2023-01-14 02:39:10 +00:00
export function getDebugInfo() {
2023-01-30 22:56:48 +00:00
// 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 = Platform.constants as RNConstants;
const rnVer = PlatformConstants.reactNativeVersion;
2023-01-10 23:30:46 +00:00
return {
2024-07-30 00:18:01 +08:00
/**
* @deprecated use `bunny` field
* */
2023-01-10 23:30:46 +00:00
vendetta: {
2024-07-30 00:18:01 +08:00
version: versionHash.split("-")[0],
2024-02-23 11:51:03 +08:00
loader: getLoaderName(),
2023-01-10 23:30:46 +00:00
},
2024-03-01 14:25:43 +08:00
bunny: {
2024-03-11 15:04:11 +08:00
version: versionHash,
2024-04-30 17:07:23 +08:00
loader: {
name: getLoaderName(),
version: getLoaderVersion()
}
2024-03-01 14:25:43 +08:00
},
2023-01-10 23:30:46 +00:00
discord: {
version: NativeClientInfoModule.getConstants().Version,
build: NativeClientInfoModule.getConstants().Build,
2023-01-10 23:30:46 +00:00
},
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,
2024-03-06 01:57:59 +08:00
buildType: hermesProps.Build,
2023-01-10 23:30:46 +00:00
bytecodeVersion: hermesProps["Bytecode Version"],
},
...Platform.select(
{
android: {
os: {
name: "Android",
version: PlatformConstants.Release,
sdk: PlatformConstants.Version
},
},
ios: {
os: {
name: PlatformConstants.systemName,
version: PlatformConstants.osVersion
},
}
}
)!,
...Platform.select(
{
android: {
device: {
manufacturer: PlatformConstants.Manufacturer,
brand: PlatformConstants.Brand,
model: PlatformConstants.Model,
codename: NativeDeviceModule.device
}
},
2025-05-03 20:32:55 +01:00
// ios: {
// device: {
// manufacturer: NativeDeviceModule.deviceManufacturer,
// brand: NativeDeviceModule.deviceBrand,
// model: NativeDeviceModule.deviceModel,
// codename: NativeDeviceModule.device
// }
// }
}
)!
2024-03-06 01:57:59 +08:00
};
2023-03-31 16:46:55 +02:00
}