aboutsummaryrefslogtreecommitdiff
path: root/src/webpack/common/utils.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/webpack/common/utils.ts')
-rw-r--r--src/webpack/common/utils.ts112
1 files changed, 112 insertions, 0 deletions
diff --git a/src/webpack/common/utils.ts b/src/webpack/common/utils.ts
new file mode 100644
index 0000000..daac207
--- /dev/null
+++ b/src/webpack/common/utils.ts
@@ -0,0 +1,112 @@
+/*
+ * Vencord, a modification for Discord's desktop app
+ * Copyright (c) 2023 Vendicated and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+*/
+
+import type { User } from "discord-types/general";
+
+// eslint-disable-next-line path-alias/no-relative
+import { _resolveReady,filters, findByCodeLazy, findByPropsLazy, mapMangledModuleLazy, waitFor } from "../webpack";
+import type * as t from "./types/utils";
+
+export let FluxDispatcher: t.FluxDispatcher;
+export const Flux: t.Flux = findByPropsLazy("connectStores");
+
+export const RestAPI: t.RestAPI = findByPropsLazy("getAPIBaseURL", "get");
+export const moment: typeof import("moment") = findByPropsLazy("parseTwoDigitYear");
+
+export const hljs: typeof import("highlight.js") = findByPropsLazy("highlight");
+
+export let SnowflakeUtils: t.SnowflakeUtils;
+waitFor(["fromTimestamp", "extractTimestamp"], m => SnowflakeUtils = m);
+
+export let Parser: t.Parser;
+export let Alerts: t.Alerts;
+
+const ToastType = {
+ MESSAGE: 0,
+ SUCCESS: 1,
+ FAILURE: 2,
+ CUSTOM: 3
+};
+const ToastPosition = {
+ TOP: 0,
+ BOTTOM: 1
+};
+
+export const Toasts = {
+ Type: ToastType,
+ Position: ToastPosition,
+ // what's less likely than getting 0 from Math.random()? Getting it twice in a row
+ genId: () => (Math.random() || Math.random()).toString(36).slice(2),
+
+ // hack to merge with the following interface, dunno if there's a better way
+ ...{} as {
+ show(data: {
+ message: string,
+ id: string,
+ /**
+ * Toasts.Type
+ */
+ type: number,
+ options?: {
+ /**
+ * Toasts.Position
+ */
+ position?: number;
+ component?: React.ReactNode,
+ duration?: number;
+ };
+ }): void;
+ pop(): void;
+ }
+};
+
+export const UserUtils = {
+ fetchUser: findByCodeLazy(".USER(", "getUser") as (id: string) => Promise<User>,
+};
+
+export const Clipboard = mapMangledModuleLazy('document.queryCommandEnabled("copy")||document.queryCommandSupported("copy")', {
+ copy: filters.byCode(".default.copy("),
+ SUPPORTS_COPY: x => typeof x === "boolean",
+});
+
+export const NavigationRouter = mapMangledModuleLazy("transitionToGuild - ", {
+ transitionTo: filters.byCode("transitionTo -"),
+ transitionToGuild: filters.byCode("transitionToGuild -"),
+ goBack: filters.byCode("goBack()"),
+ goForward: filters.byCode("goForward()"),
+});
+
+waitFor(["dispatch", "subscribe"], m => {
+ FluxDispatcher = m;
+ const cb = () => {
+ m.unsubscribe("CONNECTION_OPEN", cb);
+ _resolveReady();
+ };
+ m.subscribe("CONNECTION_OPEN", cb);
+});
+
+
+// This is the same module but this is easier
+waitFor(filters.byCode("currentToast?"), m => Toasts.show = m);
+waitFor(filters.byCode("currentToast:null"), m => Toasts.pop = m);
+
+waitFor(["show", "close"], m => Alerts = m);
+waitFor("parseTopic", m => Parser = m);
+
+export let SettingsRouter: any;
+waitFor(["open", "saveAccountChanges"], m => SettingsRouter = m);