Revenge/src/def.d.ts

486 lines
14 KiB
TypeScript
Raw Normal View History

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 _Clipboard from "@react-native-clipboard/clipboard";
import _moment from "moment";
import _chroma from "chroma-js";
import _lodash from "lodash";
2022-10-18 22:04:55 +00:00
type MetroModules = { [id: number]: any };
2023-02-13 20:34:58 +00:00
// Component types
interface SummaryProps {
label: string;
icon?: string;
noPadding?: boolean;
2023-03-04 22:33:00 +00:00
noAnimation?: boolean;
2023-02-13 20:34:58 +00:00
children: JSX.Element | JSX.Element[];
}
2023-02-26 02:20:01 +00:00
interface ErrorBoundaryProps {
children: JSX.Element | JSX.Element[],
}
2022-10-18 22:04:55 +00:00
// 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
}
2023-03-08 00:39:11 +00:00
type SearchTree = Record<string, any>;
type SearchFilter = (tree: SearchTree) => boolean;
2022-10-18 22:21:58 +00:00
interface FindInTreeOptions {
walkable?: string[];
ignore?: string[];
maxDepth?: number;
}
2022-10-22 22:26:06 +00:00
interface Asset {
name: string;
id: number;
}
2023-02-26 22:56:36 +00:00
export enum ButtonColors {
BRAND = "brand",
RED = "red",
GREEN = "green",
PRIMARY = "primary",
TRANSPARENT = "transparent",
GREY = "grey",
LIGHTGREY = "lightgrey",
WHITE = "white",
LINK = "link"
}
interface ConfirmationAlertOptions {
2023-04-05 23:08:48 +00:00
title?: string;
content: string | JSX.Element | JSX.Element[];
2023-04-05 23:08:48 +00:00
confirmText?: string;
confirmColor?: ButtonColors;
onConfirm: () => void;
2023-04-05 23:08:48 +00:00
cancelText?: string;
}
interface InputAlertProps {
2023-04-05 23:08:48 +00:00
title?: string;
confirmText?: string;
confirmColor?: ButtonColors;
onConfirm: (input: string) => (void | Promise<void>);
cancelText?: string;
placeholder?: string;
initialValue?: string;
}
interface Author {
2023-01-04 22:39:28 +00:00
name: string;
id?: string;
2023-01-04 22:39:28 +00:00
}
// See https://github.com/vendetta-mod/polymanifest
interface PluginManifest {
name: string;
description: string;
authors: Author[];
2023-01-04 22:39:28 +00:00
main: string;
hash: string;
// Vendor-specific field, contains our own data
2023-01-16 08:11:46 +00:00
vendetta?: {
icon?: string;
2023-01-04 22:39:28 +00:00
};
}
interface Plugin {
id: string;
manifest: PluginManifest;
enabled: boolean;
2023-01-07 23:05:14 +00:00
update: boolean;
js: string;
}
interface ThemeData {
name: string;
description?: string;
authors?: Author[];
spec: number;
semanticColors?: Indexable<string[]>;
rawColors?: Indexable<string>;
}
interface Theme {
id: string;
selected: boolean;
data: ThemeData;
}
2023-01-10 08:05:56 +00:00
interface Settings {
debuggerUrl: string;
developerSettings: boolean;
}
2023-01-30 00:40:56 +00:00
interface ApplicationCommand {
description: string;
name: string;
options: ApplicationCommandOption[];
execute: (args: any[], ctx: CommandContext) => CommandResult | void | Promise<CommandResult> | Promise<void>;
id?: string;
applicationId: string;
displayName: string;
displayDescription: string;
inputType: ApplicationCommandInputType;
type: ApplicationCommandType;
}
2023-02-26 22:56:36 +00:00
export enum ApplicationCommandInputType {
BUILT_IN,
BUILT_IN_TEXT,
BUILT_IN_INTEGRATION,
BOT,
PLACEHOLDER,
}
2023-01-30 00:40:56 +00:00
interface ApplicationCommandOption {
name: string;
description: string;
required?: boolean;
type: ApplicationCommandOptionType;
displayName: string;
displayDescription: string;
}
2023-02-26 22:56:36 +00:00
export enum ApplicationCommandOptionType {
SUB_COMMAND = 1,
SUB_COMMAND_GROUP,
STRING,
INTEGER,
BOOLEAN,
USER,
CHANNEL,
ROLE,
MENTIONABLE,
NUMBER,
ATTACHMENT,
}
2023-02-26 22:56:36 +00:00
export enum ApplicationCommandType {
CHAT = 1,
USER,
MESSAGE,
}
2023-01-30 00:40:56 +00:00
interface CommandContext {
channel: any;
guild: any;
}
2023-01-30 00:40:56 +00:00
interface CommandResult {
content: string;
tts?: boolean;
}
interface RNConstants extends _RN.PlatformConstants {
// Android
Version: number;
Release: string;
Serial: string;
Fingerprint: string;
Model: string;
Brand: string;
Manufacturer: string;
ServerHost?: string;
// iOS
forceTouchAvailable: boolean;
interfaceIdiom: string;
osVersion: string;
systemName: string;
}
2023-01-16 23:52:20 +00:00
/**
* A key-value storage based upon `SharedPreferences` on Android.
*
* These types are based on Android though everything should be the same between
* platforms.
*/
interface MMKVManager {
/**
* Get the value for the given `key`, or null
* @param key The key to fetch
*/
getItem: (key: string) => Promise<string | null>;
/**
* Deletes the value for the given `key`
* @param key The key to delete
*/
removeItem: (key: string) => void;
/**
* Sets the value of `key` to `value`
*/
setItem: (key: string, value: string) => void;
/**
* Goes through every item in storage and returns it, excluding the
* keys specified in `exclude`.
* @param exclude A list of items to exclude from result
*/
refresh: (exclude: string[]) => Promise<Record<string, string>>;
/**
* You will be murdered if you use this function.
* Clears ALL of Discord's settings.
*/
clear: () => void;
}
2023-04-05 19:40:17 +00:00
interface FileManager {
/**
* @param path **Full** path to file
*/
fileExists: (path: string) => Promise<boolean>;
/**
* Allowed URI schemes on Android: `file://`, `content://` ([See here](https://developer.android.com/reference/android/content/ContentResolver#accepts-the-following-uri-schemes:_3))
*/
getSize: (uri: string) => Promise<boolean>;
/**
* @param path **Full** path to file
* @param encoding Set to `base64` in order to encode response
*/
readFile(path: string, encoding: "base64" | "utf8"): Promise<string>;
saveFileToGallery?(uri: string, fileName: string, fileType: "PNG" | "JPEG"): Promise<string>;
/**
2023-02-09 21:48:43 +00:00
* Beware! This function has differing functionality on iOS and Android.
* @param storageDir Either `cache` or `documents`.
* @param path Path in `storageDir`, parents are recursively created.
* @param data The data to write to the file
* @param encoding Set to `base64` if `data` is base64 encoded.
* @returns Promise that resolves to path of the file once it got written
*/
writeFile(storageDir: "cache" | "documents", path: string, data: string, encoding: "base64" | "utf8"): Promise<string>;
getConstants: () => {
/**
* The path the `documents` storage dir (see {@link writeFile}) represents.
*/
DocumentsDirPath: string;
};
/**
* Will apparently cease to exist some time in the future so please use {@link getConstants} instead.
* @deprecated
*/
DocumentsDirPath: string;
}
type Indexable<Type> = { [index: string]: Type }
2023-01-30 14:15:44 +00:00
type EmitterEvent = "SET" | "GET" | "DEL";
interface EmitterListenerData {
path: string[];
value?: any;
}
type EmitterListener = (
event: EmitterEvent,
data: EmitterListenerData | any
) => any;
type EmitterListeners = Indexable<Set<EmitterListener>>;
interface Emitter {
listeners: EmitterListeners;
on: (event: EmitterEvent, listener: EmitterListener) => void;
off: (event: EmitterEvent, listener: EmitterListener) => void;
once: (event: EmitterEvent, listener: EmitterListener) => void;
emit: (event: EmitterEvent, data: EmitterListenerData) => void;
}
interface StorageBackend {
get: () => unknown | Promise<unknown>;
set: (data: unknown) => void | Promise<void>;
}
interface LoaderConfig {
customLoadUrl: {
enabled: boolean;
url: string;
};
loadReactDevTools: boolean;
}
interface LoaderIdentity {
name: string;
features: {
loaderConfig?: boolean;
devtools?: {
prop: string;
version: string;
},
themes?: {
prop: string;
}
}
}
2023-04-04 18:33:31 +00:00
interface DiscordStyleSheet {
[index: string]: any,
2023-04-06 23:06:05 +00:00
createThemedStyleSheet: typeof import("react-native").StyleSheet.create;
2023-04-04 18:33:31 +00:00
}
2022-10-18 22:04:55 +00:00
interface VendettaObject {
patcher: {
after: typeof _spitroast.after;
before: typeof _spitroast.before;
instead: typeof _spitroast.instead;
2022-10-22 17:59:01 +00:00
};
2022-10-18 22:04:55 +00:00
metro: {
2023-02-22 00:25:14 +00:00
find: (filter: (m: any) => boolean) => any;
findAll: (filter: (m: any) => boolean) => any[];
2022-10-18 22:04:55 +00:00
findByProps: PropsFinder;
findByPropsAll: PropsFinderAll;
findByName: (name: string, defaultExp?: boolean) => any;
findByNameAll: (name: string, defaultExp?: boolean) => any[];
findByDisplayName: (displayName: string, defaultExp?: boolean) => any;
findByDisplayNameAll: (displayName: string, defaultExp?: boolean) => any[];
2023-04-04 18:45:53 +00:00
findByTypeName: (typeName: string, defaultExp?: boolean) => any;
findByTypeNameAll: (typeName: string, defaultExp?: boolean) => any[];
2023-02-14 18:28:27 +00:00
findByStoreName: (name: string) => any;
2022-10-22 17:59:01 +00:00
common: {
constants: PropIntellisense<"API_HOST">;
channels: PropIntellisense<"getVoiceChannelId">;
i18n: PropIntellisense<"Messages">;
url: PropIntellisense<"openURL">;
toasts: PropIntellisense<"open" | "close">;
2023-04-04 18:33:31 +00:00
stylesheet: DiscordStyleSheet;
clipboard: typeof _Clipboard;
2023-02-04 02:29:45 +00:00
assets: PropIntellisense<"registerAsset">;
invites: PropIntellisense<"acceptInviteAndTransitionToInviteChannel">;
2023-02-04 17:11:50 +00:00
commands: PropIntellisense<"getBuiltInCommands">;
2023-02-04 02:29:45 +00:00
navigation: PropIntellisense<"pushLazy">;
navigationStack: PropIntellisense<"createStackNavigator">;
NavigationNative: PropIntellisense<"NavigationContainer">;
2023-02-09 21:48:43 +00:00
// You may ask: "Why not just install Flux's types?"
// Answer: Discord have a (presumably proprietary) fork. It's wildly different.
Flux: PropIntellisense<"connectStores">;
FluxDispatcher: PropIntellisense<"_currentDispatchActionType">;
2022-10-22 17:59:01 +00:00
React: typeof _React;
ReactNative: typeof _RN;
moment: typeof _moment;
chroma: typeof _chroma;
lodash: typeof _lodash;
2022-10-22 17:59:01 +00:00
};
};
constants: {
DISCORD_SERVER: string;
DISCORD_SERVER_ID: string;
PLUGINS_CHANNEL_ID: string;
THEMES_CHANNEL_ID: string;
GITHUB: string;
PROXY_PREFIX: string;
HTTP_REGEX: RegExp;
HTTP_REGEX_MULTI: RegExp;
};
utils: {
2023-03-08 00:39:11 +00:00
findInReactTree: (tree: SearchTree, filter: SearchFilter) => any;
findInTree: (tree: SearchTree, filter: SearchFilter, options: FindInTreeOptions) => any;
2023-03-20 21:30:13 +00:00
safeFetch: (input: RequestInfo | URL, options?: RequestInit) => Promise<Response>;
2023-02-04 02:37:36 +00:00
unfreeze: (obj: object) => object;
2023-04-09 18:53:26 +00:00
without: <O extends object, K extends readonly (keyof O)[]>(object: O, ...keys: K) => Omit<O, typeof keys[number]>;
};
debug: {
connectToDebugger: (url: string) => void;
2023-02-04 02:29:45 +00:00
// TODO: Type output?
getDebugInfo: () => void;
}
2022-10-22 22:26:06 +00:00
ui: {
components: {
2023-02-13 20:34:58 +00:00
// Discord
Forms: PropIntellisense<"Form" | "FormSection">;
General: PropIntellisense<"Button" | "Text" | "View">;
2023-02-09 21:48:43 +00:00
Search: _React.ComponentType;
Alert: _React.ComponentType;
2023-02-13 20:34:58 +00:00
// Vendetta
2023-02-26 22:24:38 +00:00
Summary: _React.ComponentType<SummaryProps>;
ErrorBoundary: _React.ComponentType<ErrorBoundaryProps>;
}
toasts: {
showToast: (content: string, asset: number) => void;
};
alerts: {
showConfirmationAlert: (options: ConfirmationAlertOptions) => void;
showCustomAlert: (component: _React.ComponentType, props: any) => void;
showInputAlert: (options: InputAlertProps) => 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;
};
2023-02-21 17:59:29 +00:00
// TODO: Make a vain attempt to type these
semanticColors: Indexable<any>;
rawColors: Indexable<any>;
2022-10-22 22:26:06 +00:00
};
2023-01-08 23:24:00 +00:00
plugins: {
plugins: Indexable<Plugin>;
2023-04-05 20:18:22 +00:00
fetchPlugin: (id: string) => Promise<void>;
installPlugin: (id: string, enabled?: boolean) => Promise<void>;
startPlugin: (id: string) => Promise<void>;
2023-03-20 21:30:13 +00:00
stopPlugin: (id: string, disable?: boolean) => void;
2023-01-08 23:24:00 +00:00
removePlugin: (id: string) => void;
getSettings: (id: string) => JSX.Element;
};
themes: {
themes: Indexable<Theme>;
2023-04-05 20:18:22 +00:00
fetchTheme: (id: string, selected?: boolean) => Promise<void>;
installTheme: (id: string) => Promise<void>;
selectTheme: (id: string) => Promise<void>;
2023-03-20 21:30:13 +00:00
removeTheme: (id: string) => Promise<boolean>;
getCurrentTheme: () => Theme | null;
2023-04-05 20:18:22 +00:00
updateThemes: () => Promise<void>;
};
commands: {
registerCommand: (command: ApplicationCommand) => () => void;
};
storage: {
createProxy: <T>(target: T) => { proxy: T, emitter: Emitter };
useProxy: <T>(storage: T) => T;
createStorage: <T>(backend: StorageBackend) => Promise<Awaited<T>>;
wrapSync: <T extends Promise<any>>(store: T) => Awaited<T>;
awaitSyncWrapper: (store: any) => Promise<void>;
createMMKVBackend: (store: string) => StorageBackend;
createFileBackend: (file: string) => StorageBackend;
};
settings: Settings;
loader: {
identity?: LoaderIdentity;
config: LoaderConfig;
};
2022-10-18 22:04:55 +00:00
logger: Logger;
2023-01-10 23:30:46 +00:00
version: string;
2023-02-04 02:29:45 +00:00
unload: () => void;
2022-10-18 22:04:55 +00:00
}
2023-01-30 21:34:14 +00:00
interface VendettaPluginObject {
id: string;
2023-02-14 18:35:48 +00:00
manifest: PluginManifest;
storage: Indexable<any>;
2023-01-30 21:34:14 +00:00
}
2022-10-18 22:04:55 +00:00
declare global {
type React = typeof _React;
2022-10-18 22:04:55 +00:00
interface Window {
[key: PropertyKey]: any;
modules: MetroModules;
vendetta: VendettaObject;
React: typeof _React;
__vendetta_loader?: LoaderIdentity;
2022-10-18 22:04:55 +00:00
}
2022-10-22 17:59:01 +00:00
}