diff --git a/src/plugins/settings/definitions/EvaluateJavaScriptSetting.tsx b/src/plugins/settings/definitions/EvaluateJavaScriptSetting.tsx index 52cd181..17d5d92 100644 --- a/src/plugins/settings/definitions/EvaluateJavaScriptSetting.tsx +++ b/src/plugins/settings/definitions/EvaluateJavaScriptSetting.tsx @@ -6,6 +6,7 @@ import { Components } from '@revenge-mod/discord/ui' import { getErrorStack } from '@revenge-mod/utils/errors' +import { pluginApi } from '..' import AssetIcon from '../components/icons/AssetIcon' import type { SettingsItem } from '@revenge-mod/discord/ui/settings' @@ -94,15 +95,30 @@ function EvaluateJavaScriptAlert() { setLoading(true) try { + if (!pluginApi) { + alert('Unable to provide plugin API. Running snippet in a second...') + await new Promise(rs => setTimeout(rs, 1000)) + } else { + // @ts-expect-error + globalThis.revenge = pluginApi.unscoped + // @ts-expect-error + globalThis.api = pluginApi + } + // Do a no-local-scope-access eval // biome-ignore lint/security/noGlobalEval: This is intentional const res = globalThis.eval?.(code.current) + alert( nodeUtils.inspect(awaitResult && res instanceof Promise ? await res : res, { depth: inspectDepth, showHidden, }), ) + + // @ts-expect-error + // biome-ignore lint/performance/noDelete: This is fine. + delete globalThis.revenge, delete globalThis.api } catch (e) { alert(getErrorStack(e)) } diff --git a/src/plugins/settings/index.ts b/src/plugins/settings/index.ts index dea76cc..db7ea26 100644 --- a/src/plugins/settings/index.ts +++ b/src/plugins/settings/index.ts @@ -1,4 +1,4 @@ -import { PluginFlags } from '@revenge-mod/plugins' +import { PluginFlags, type PluginApi } from '@revenge-mod/plugins' import { InternalPluginFlags, registerPlugin } from '@revenge-mod/plugins/_' import { waitForModules } from '@revenge-mod/modules/finders' @@ -26,6 +26,8 @@ import EvaluateJavaScriptSetting from './definitions/EvaluateJavaScriptSetting' import type { FC } from 'react' +export let pluginApi: PluginApi + registerPlugin( { id: 'revenge.settings', @@ -35,7 +37,9 @@ registerPlugin( icon: 'SettingsIcon', }, { - start() { + start(api) { + pluginApi = api + for (const [key, setting] of [ [MobileSetting.REVENGE, RevengeSetting], [MobileSetting.REVENGE_PLUGINS, RevengePluginsSetting],