2023-01-25 02:25:29 +00:00
|
|
|
/*
|
|
|
|
* 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/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
// eslint-disable-next-line path-alias/no-relative
|
2024-05-28 21:02:57 +00:00
|
|
|
import { _resolveDiscordLoaded, filters, find, findByCode, findByProps, waitFor } from "../webpack";
|
2023-01-25 02:25:29 +00:00
|
|
|
import type * as t from "./types/utils";
|
|
|
|
|
2024-05-11 08:19:12 +00:00
|
|
|
export const FluxDispatcher = find<t.FluxDispatcher>(filters.byProps("dispatch", "subscribe"), (m: t.FluxDispatcher) => {
|
2024-05-02 21:52:41 +00:00
|
|
|
// Non import call to avoid circular dependency
|
|
|
|
Vencord.Plugins.subscribeAllPluginsFluxEvents(m);
|
|
|
|
|
2023-11-25 00:32:21 +00:00
|
|
|
const cb = () => {
|
|
|
|
m.unsubscribe("CONNECTION_OPEN", cb);
|
2024-05-28 21:02:57 +00:00
|
|
|
_resolveDiscordLoaded();
|
2023-11-25 00:32:21 +00:00
|
|
|
};
|
|
|
|
m.subscribe("CONNECTION_OPEN", cb);
|
2024-05-03 02:18:12 +00:00
|
|
|
|
|
|
|
return m;
|
2023-11-25 00:32:21 +00:00
|
|
|
});
|
|
|
|
|
2024-05-08 07:48:48 +00:00
|
|
|
export const ComponentDispatch = find(filters.byProps("ComponentDispatch", "ComponentDispatcher"), m => m.ComponentDispatch);
|
2023-10-25 12:39:57 +00:00
|
|
|
|
2024-05-03 22:23:48 +00:00
|
|
|
export const Constants = findByProps("Endpoints");
|
2024-05-03 22:21:02 +00:00
|
|
|
|
2024-05-03 02:18:12 +00:00
|
|
|
export const RestAPI = find<t.RestAPI>(filters.byProps("getAPIBaseURL"), m => m.HTTP ?? m);
|
|
|
|
export const moment = findByProps<typeof import("moment")>("parseTwoDigitYear");
|
2023-01-25 02:25:29 +00:00
|
|
|
|
2024-05-03 02:18:12 +00:00
|
|
|
export const hljs = findByProps<typeof import("highlight.js")>("highlight", "registerLanguage");
|
2023-01-25 02:25:29 +00:00
|
|
|
|
2024-05-03 02:18:12 +00:00
|
|
|
export const lodash = findByProps<typeof import("lodash")>("debounce", "cloneDeep");
|
2023-01-25 02:25:29 +00:00
|
|
|
|
2024-05-03 02:18:12 +00:00
|
|
|
export const i18n = find<t.i18n>(m => m.Messages?.["en-US"]);
|
2023-10-25 18:29:32 +00:00
|
|
|
|
2024-05-03 02:18:12 +00:00
|
|
|
export const SnowflakeUtils = findByProps<t.SnowflakeUtils>("fromTimestamp", "extractTimestamp");
|
2023-03-25 02:37:29 +00:00
|
|
|
|
2024-05-03 02:18:12 +00:00
|
|
|
export const Parser = findByProps<t.Parser>("parseTopic");
|
|
|
|
export const Alerts = findByProps<t.Alerts>("show", "close");
|
2023-01-25 02:25:29 +00:00
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2024-05-03 02:18:12 +00:00
|
|
|
waitFor(filters.byCode("showToast"), m => {
|
2023-11-25 00:32:21 +00:00
|
|
|
Toasts.show = m.showToast;
|
|
|
|
Toasts.pop = m.popToast;
|
|
|
|
});
|
|
|
|
|
2023-06-29 14:06:21 +00:00
|
|
|
/**
|
|
|
|
* Show a simple toast. If you need more options, use Toasts.show manually
|
|
|
|
*/
|
|
|
|
export function showToast(message: string, type = ToastType.MESSAGE) {
|
|
|
|
Toasts.show({
|
|
|
|
id: Toasts.genId(),
|
|
|
|
message,
|
|
|
|
type
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2024-05-11 08:44:52 +00:00
|
|
|
export const UserUtils = findByProps<t.UserUtils>("getUser", "fetchCurrentUser");
|
2024-05-15 02:53:41 +00:00
|
|
|
|
|
|
|
export const UploadManager = findByProps("clearAll", "addFile");
|
2024-05-11 08:44:52 +00:00
|
|
|
export const UploadHandler = findByProps<t.UploadHandler>("showUploadFileSizeExceededError", "promptToUpload");
|
2023-01-25 02:25:29 +00:00
|
|
|
|
2024-05-11 08:44:52 +00:00
|
|
|
export const ApplicationAssetUtils = findByProps<t.ApplicationAssetUtils>("fetchAssetIds", "getAssetImage");
|
2023-10-25 16:20:32 +00:00
|
|
|
|
2024-05-03 02:18:12 +00:00
|
|
|
export const Clipboard = findByProps<t.Clipboard>("SUPPORTS_COPY", "copy");
|
2023-01-25 02:25:29 +00:00
|
|
|
|
2024-05-03 02:18:12 +00:00
|
|
|
export const NavigationRouter = findByProps<t.NavigationRouter>("transitionTo", "replaceWith", "transitionToGuild");
|
2023-01-25 02:25:29 +00:00
|
|
|
|
2024-05-03 02:18:12 +00:00
|
|
|
export const SettingsRouter = findByProps("open", "saveAccountChanges");
|
2023-05-15 00:33:04 +00:00
|
|
|
|
2024-05-08 07:48:48 +00:00
|
|
|
export const PermissionsBits = find<t.PermissionsBits>(m => typeof m.Permissions?.ADMINISTRATOR === "bigint", m => m.Permissions);
|
2023-11-30 05:10:50 +00:00
|
|
|
|
2024-05-17 21:10:21 +00:00
|
|
|
export const zustandCreate = findByCode("will be removed in v4");
|
2023-11-30 05:10:50 +00:00
|
|
|
|
|
|
|
const persistFilter = filters.byCode("[zustand persist middleware]");
|
2024-05-17 21:08:07 +00:00
|
|
|
export const zustandPersist = find(m => m.persist && persistFilter(m.persist), m => m.persist);
|
2023-12-14 01:01:07 +00:00
|
|
|
|
2024-05-03 02:18:12 +00:00
|
|
|
export const MessageActions = findByProps("editMessage", "sendMessage");
|
2024-05-29 08:08:19 +00:00
|
|
|
export const MessageCache = findByProps("clearCache", "_channelMessages");
|
2024-05-03 02:18:12 +00:00
|
|
|
export const UserProfileActions = findByProps("openUserProfileModal", "closeUserProfileModal");
|
|
|
|
export const InviteActions = findByProps("resolveInvite");
|
2024-02-15 09:36:01 +00:00
|
|
|
|
2024-05-03 02:18:12 +00:00
|
|
|
export const IconUtils = findByProps<t.IconUtils>("getGuildBannerURL", "getUserAvatarURL");
|