2022-10-18 22:04:55 +00:00
|
|
|
import * as _spitroast from "spitroast";
|
2022-10-22 17:59:01 +00:00
|
|
|
import _React from "react";
|
|
|
|
import _RN from "react-native";
|
|
|
|
import _AsyncStorage from "@react-native-async-storage/async-storage";
|
2022-10-18 22:04:55 +00:00
|
|
|
|
|
|
|
type MetroModules = { [id: number]: any };
|
|
|
|
|
|
|
|
// Helper types for API functions
|
|
|
|
type PropIntellisense<P extends string | symbol> = Record<P, any> & Record<PropertyKey, any>;
|
|
|
|
type PropsFinder = <T extends string | symbol>(...props: T[]) => PropIntellisense<T>;
|
|
|
|
type PropsFinderAll = <T extends string | symbol>(...props: T[]) => PropIntellisense<T>[];
|
|
|
|
|
|
|
|
type LoggerFunction = (...messages: any[]) => void;
|
|
|
|
interface Logger {
|
2022-10-22 17:59:01 +00:00
|
|
|
log: LoggerFunction;
|
|
|
|
info: LoggerFunction;
|
|
|
|
warn: LoggerFunction;
|
|
|
|
error: LoggerFunction;
|
|
|
|
time: LoggerFunction;
|
|
|
|
trace: LoggerFunction;
|
|
|
|
verbose: LoggerFunction;
|
2022-10-18 22:04:55 +00:00
|
|
|
}
|
|
|
|
|
2022-10-18 22:21:58 +00:00
|
|
|
type SearchFilter = (tree: any) => boolean;
|
|
|
|
interface FindInTreeOptions {
|
|
|
|
walkable?: string[];
|
|
|
|
ignore?: string[];
|
|
|
|
maxDepth?: number;
|
|
|
|
}
|
|
|
|
|
2022-10-22 22:26:06 +00:00
|
|
|
interface Asset {
|
|
|
|
name: string;
|
|
|
|
id: number;
|
|
|
|
}
|
|
|
|
|
2023-01-04 22:39:28 +00:00
|
|
|
interface PluginAuthor {
|
|
|
|
name: string;
|
|
|
|
id: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
// See https://github.com/vendetta-mod/polymanifest
|
2023-01-03 00:18:19 +00:00
|
|
|
interface PluginManifest {
|
|
|
|
name: string;
|
|
|
|
description: string;
|
2023-01-04 22:39:28 +00:00
|
|
|
authors: PluginAuthor[];
|
|
|
|
main: string;
|
|
|
|
hash: string;
|
|
|
|
// Vendor-specific field, contains our own data
|
|
|
|
vendetta: {
|
|
|
|
icon: string;
|
|
|
|
};
|
2023-01-03 00:18:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
interface Plugin {
|
|
|
|
id: string;
|
|
|
|
manifest: PluginManifest;
|
|
|
|
enabled: boolean;
|
2023-01-07 23:05:14 +00:00
|
|
|
update: boolean;
|
2023-01-03 00:18:19 +00:00
|
|
|
js: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
type Indexable<Type> = { [index: string]: Type }
|
|
|
|
|
2022-10-18 22:04:55 +00:00
|
|
|
interface VendettaObject {
|
|
|
|
patcher: {
|
|
|
|
after: typeof _spitroast.after;
|
|
|
|
before: typeof _spitroast.before;
|
|
|
|
instead: typeof _spitroast.instead;
|
|
|
|
unpatchAll: typeof _spitroast.unpatchAll;
|
2022-10-22 17:59:01 +00:00
|
|
|
};
|
2022-10-18 22:04:55 +00:00
|
|
|
metro: {
|
|
|
|
findByProps: PropsFinder;
|
|
|
|
findByPropsAll: PropsFinderAll;
|
|
|
|
findByDisplayName: (name: string, defaultExp: boolean) => any;
|
|
|
|
findByDisplayNameAll: (name: string, defaultExp: boolean) => any[];
|
2022-10-22 17:59:01 +00:00
|
|
|
common: {
|
2022-10-28 17:50:40 +00:00
|
|
|
constants: PropIntellisense<"API_HOST">;
|
|
|
|
channels: PropIntellisense<"getVoiceChannelId">;
|
|
|
|
i18n: PropIntellisense<"Messages">;
|
|
|
|
url: PropIntellisense<"openURL">;
|
|
|
|
toasts: PropIntellisense<"open" | "close">;
|
2022-10-22 17:59:01 +00:00
|
|
|
React: typeof _React;
|
|
|
|
ReactNative: typeof _RN;
|
|
|
|
AsyncStorage: typeof _AsyncStorage;
|
|
|
|
};
|
|
|
|
};
|
2022-10-28 17:50:40 +00:00
|
|
|
constants: {
|
|
|
|
DISCORD_SERVER: string;
|
|
|
|
GITHUB: string;
|
|
|
|
};
|
|
|
|
utils: {
|
|
|
|
copyText: (content: string) => void;
|
|
|
|
findInReactTree: (tree: { [key: string]: any }, filter: SearchFilter) => void;
|
|
|
|
findInTree: (tree: { [key: string]: any }, filter: SearchFilter, options: FindInTreeOptions) => any;
|
|
|
|
};
|
|
|
|
debug: {
|
|
|
|
connectToDebugger: (url: string) => void;
|
|
|
|
}
|
2022-10-22 22:26:06 +00:00
|
|
|
ui: {
|
2022-10-28 17:50:40 +00:00
|
|
|
components: {
|
2023-01-05 23:07:58 +00:00
|
|
|
Forms: PropIntellisense<"Form" | "FormSection">;
|
|
|
|
General: PropIntellisense<"Button" | "Text" | "View">;
|
2022-10-28 17:50:40 +00:00
|
|
|
}
|
|
|
|
toasts: {
|
|
|
|
showToast: (content: string, asset: number) => void;
|
|
|
|
};
|
2022-10-22 22:26:06 +00:00
|
|
|
assets: {
|
2023-01-07 23:06:36 +00:00
|
|
|
all: Indexable<Asset>;
|
2022-10-22 22:26:06 +00:00
|
|
|
find: (filter: (a: any) => void) => Asset | null | undefined;
|
|
|
|
getAssetByName: (name: string) => Asset;
|
2022-10-22 23:05:04 +00:00
|
|
|
getAssetByID: (id: number) => Asset;
|
2022-10-22 22:26:06 +00:00
|
|
|
getAssetIDByName: (name: string) => number;
|
2022-10-28 17:50:40 +00:00
|
|
|
};
|
2022-10-22 22:26:06 +00:00
|
|
|
};
|
2023-01-08 23:24:00 +00:00
|
|
|
plugins: {
|
|
|
|
plugins: Indexable<Plugin>;
|
|
|
|
fetchPlugin: (id: string) => void;
|
|
|
|
evalPlugin: (id: string) => void;
|
|
|
|
stopPlugin: (id: string) => void;
|
|
|
|
removePlugin: (id: string) => void;
|
|
|
|
getSettings: (id: string) => JSX.Element;
|
|
|
|
}
|
2022-10-18 22:04:55 +00:00
|
|
|
logger: Logger;
|
|
|
|
}
|
|
|
|
|
|
|
|
declare global {
|
2023-01-03 00:18:19 +00:00
|
|
|
type React = typeof _React;
|
2022-10-18 22:04:55 +00:00
|
|
|
interface Window {
|
|
|
|
[key: PropertyKey]: any;
|
|
|
|
modules: MetroModules;
|
|
|
|
vendetta: VendettaObject;
|
2023-01-03 00:18:19 +00:00
|
|
|
React: typeof _React;
|
2022-10-18 22:04:55 +00:00
|
|
|
}
|
2022-10-22 17:59:01 +00:00
|
|
|
}
|