mirror of
https://github.com/Equicord/Equicord.git
synced 2025-06-07 13:43:03 -04:00
Merge Dev & Optimize Some Stuff
This commit is contained in:
commit
0fae2ee510
16 changed files with 233 additions and 200 deletions
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "equicord",
|
"name": "equicord",
|
||||||
"private": "true",
|
"private": "true",
|
||||||
"version": "1.12.0",
|
"version": "1.12.1",
|
||||||
"description": "The other cutest Discord client mod",
|
"description": "The other cutest Discord client mod",
|
||||||
"homepage": "https://github.com/Equicord/Equicord#readme",
|
"homepage": "https://github.com/Equicord/Equicord#readme",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
|
|
|
@ -186,7 +186,7 @@ export const globPlugins = kind => ({
|
||||||
const mod = `p${i}`;
|
const mod = `p${i}`;
|
||||||
code += `import ${mod} from "./${dir}/${fileName.replace(/\.tsx?$/, "")}";\n`;
|
code += `import ${mod} from "./${dir}/${fileName.replace(/\.tsx?$/, "")}";\n`;
|
||||||
pluginsCode += `[${mod}.name]:${mod},\n`;
|
pluginsCode += `[${mod}.name]:${mod},\n`;
|
||||||
metaCode += `[${mod}.name]:${JSON.stringify({ folderName, userPlugin })},\n`; // TODO: add excluded plugins to display in the UI?
|
metaCode += `[${mod}.name]:${JSON.stringify({ folderName, userPlugin })},\n`;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@ import { openUpdaterModal } from "@components/VencordSettings/UpdaterTab";
|
||||||
import { StartAt } from "@utils/types";
|
import { StartAt } from "@utils/types";
|
||||||
|
|
||||||
import { get as dsGet } from "./api/DataStore";
|
import { get as dsGet } from "./api/DataStore";
|
||||||
import { showNotification } from "./api/Notifications";
|
import { NotificationData, showNotification } from "./api/Notifications";
|
||||||
import { PlainSettings, Settings } from "./api/Settings";
|
import { PlainSettings, Settings } from "./api/Settings";
|
||||||
import { patches, PMLogger, startAllPlugins } from "./plugins";
|
import { patches, PMLogger, startAllPlugins } from "./plugins";
|
||||||
import { localStorage } from "./utils/localStorage";
|
import { localStorage } from "./utils/localStorage";
|
||||||
|
@ -105,6 +105,46 @@ async function syncSettings() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let notifiedForUpdatesThisSession = false;
|
||||||
|
|
||||||
|
async function runUpdateCheck() {
|
||||||
|
const notify = (data: NotificationData) => {
|
||||||
|
if (notifiedForUpdatesThisSession) return;
|
||||||
|
notifiedForUpdatesThisSession = true;
|
||||||
|
|
||||||
|
setTimeout(() => showNotification({
|
||||||
|
permanent: true,
|
||||||
|
noPersist: true,
|
||||||
|
...data
|
||||||
|
}), 10_000);
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const isOutdated = await checkForUpdates();
|
||||||
|
if (!isOutdated) return;
|
||||||
|
|
||||||
|
if (Settings.autoUpdate) {
|
||||||
|
await update();
|
||||||
|
if (Settings.autoUpdateNotification) {
|
||||||
|
notify({
|
||||||
|
title: "Equicord has been updated!",
|
||||||
|
body: "Click here to restart",
|
||||||
|
onClick: relaunch
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
notify({
|
||||||
|
title: "A Equicord update is available!",
|
||||||
|
body: "Click here to view the update",
|
||||||
|
onClick: openUpdaterModal!
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
UpdateLogger.error("Failed to check for updates", err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function init() {
|
async function init() {
|
||||||
await onceReady;
|
await onceReady;
|
||||||
startAllPlugins(StartAt.WebpackReady);
|
startAllPlugins(StartAt.WebpackReady);
|
||||||
|
@ -112,34 +152,8 @@ async function init() {
|
||||||
syncSettings();
|
syncSettings();
|
||||||
|
|
||||||
if (!IS_WEB && !IS_UPDATER_DISABLED) {
|
if (!IS_WEB && !IS_UPDATER_DISABLED) {
|
||||||
try {
|
runUpdateCheck();
|
||||||
const isOutdated = await checkForUpdates();
|
setInterval(runUpdateCheck, 1000 * 60 * 30); // 30 minutes
|
||||||
if (!isOutdated) return;
|
|
||||||
|
|
||||||
if (Settings.autoUpdate) {
|
|
||||||
await update();
|
|
||||||
if (Settings.updateRelaunch) return relaunch;
|
|
||||||
if (Settings.autoUpdateNotification)
|
|
||||||
setTimeout(() => showNotification({
|
|
||||||
title: "Equicord has been updated!",
|
|
||||||
body: "Click here to restart",
|
|
||||||
permanent: true,
|
|
||||||
noPersist: true,
|
|
||||||
onClick: relaunch
|
|
||||||
}), 10_000);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setTimeout(() => showNotification({
|
|
||||||
title: "A Equicord update is available!",
|
|
||||||
body: "Click here to view the update",
|
|
||||||
permanent: true,
|
|
||||||
noPersist: true,
|
|
||||||
onClick: openUpdaterModal!
|
|
||||||
}), 10_000);
|
|
||||||
} catch (err) {
|
|
||||||
UpdateLogger.error("Failed to check for updates", err);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IS_DEV) {
|
if (IS_DEV) {
|
||||||
|
|
|
@ -39,7 +39,6 @@ export interface Settings {
|
||||||
themeLinks: string[];
|
themeLinks: string[];
|
||||||
frameless: boolean;
|
frameless: boolean;
|
||||||
transparent: boolean;
|
transparent: boolean;
|
||||||
updateRelaunch: boolean;
|
|
||||||
winCtrlQ: boolean;
|
winCtrlQ: boolean;
|
||||||
macosVibrancyStyle:
|
macosVibrancyStyle:
|
||||||
| "content"
|
| "content"
|
||||||
|
@ -101,7 +100,6 @@ const DefaultSettings: Settings = {
|
||||||
winCtrlQ: false,
|
winCtrlQ: false,
|
||||||
macosVibrancyStyle: undefined,
|
macosVibrancyStyle: undefined,
|
||||||
disableMinSize: false,
|
disableMinSize: false,
|
||||||
updateRelaunch: false,
|
|
||||||
winNativeTitleBar: false,
|
winNativeTitleBar: false,
|
||||||
plugins: {},
|
plugins: {},
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ export function VCDonateButton({
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function DonateButton({
|
export function DonateButton({
|
||||||
look = Button.Looks.LINK,
|
look = Button.Looks.LINK,
|
||||||
color = Button.Colors.TRANSPARENT,
|
color = Button.Colors.TRANSPARENT,
|
||||||
...props
|
...props
|
||||||
|
|
|
@ -106,8 +106,6 @@ function Updatable(props: CommonProps) {
|
||||||
const [updates, setUpdates] = React.useState(changes);
|
const [updates, setUpdates] = React.useState(changes);
|
||||||
const [isChecking, setIsChecking] = React.useState(false);
|
const [isChecking, setIsChecking] = React.useState(false);
|
||||||
const [isUpdating, setIsUpdating] = React.useState(false);
|
const [isUpdating, setIsUpdating] = React.useState(false);
|
||||||
|
|
||||||
const settings = useSettings(["updateRelaunch"]);
|
|
||||||
const isOutdated = (updates?.length ?? 0) > 0;
|
const isOutdated = (updates?.length ?? 0) > 0;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
@ -119,7 +117,6 @@ function Updatable(props: CommonProps) {
|
||||||
onClick={withDispatcher(setIsUpdating, async () => {
|
onClick={withDispatcher(setIsUpdating, async () => {
|
||||||
if (await update()) {
|
if (await update()) {
|
||||||
setUpdates([]);
|
setUpdates([]);
|
||||||
if (settings.updateRelaunch) return relaunch();
|
|
||||||
return await new Promise<void>(r => {
|
return await new Promise<void>(r => {
|
||||||
Alerts.show({
|
Alerts.show({
|
||||||
title: "Update Success!",
|
title: "Update Success!",
|
||||||
|
@ -191,7 +188,7 @@ function Newer(props: CommonProps) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function Updater() {
|
function Updater() {
|
||||||
const settings = useSettings(["autoUpdate", "updateRelaunch", "autoUpdateNotification"]);
|
const settings = useSettings(["autoUpdate", "autoUpdateNotification"]);
|
||||||
|
|
||||||
const [repo, err, repoPending] = useAwaiter(getRepo, { fallbackValue: "Loading..." });
|
const [repo, err, repoPending] = useAwaiter(getRepo, { fallbackValue: "Loading..." });
|
||||||
|
|
||||||
|
@ -217,30 +214,12 @@ function Updater() {
|
||||||
</Switch>
|
</Switch>
|
||||||
<Switch
|
<Switch
|
||||||
value={settings.autoUpdateNotification}
|
value={settings.autoUpdateNotification}
|
||||||
onChange={(v: boolean) => {
|
onChange={(v: boolean) => settings.autoUpdateNotification = v}
|
||||||
settings.autoUpdateNotification = v;
|
|
||||||
if (settings.updateRelaunch) {
|
|
||||||
settings.updateRelaunch = !v;
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
note="Shows a notification when Equicord automatically updates"
|
note="Shows a notification when Equicord automatically updates"
|
||||||
disabled={!settings.autoUpdate}
|
disabled={!settings.autoUpdate}
|
||||||
>
|
>
|
||||||
Get notified when an automatic update completes
|
Get notified when an automatic update completes
|
||||||
</Switch>
|
</Switch>
|
||||||
<Switch
|
|
||||||
value={settings.updateRelaunch}
|
|
||||||
onChange={(v: boolean) => {
|
|
||||||
settings.updateRelaunch = v;
|
|
||||||
if (settings.autoUpdateNotification) {
|
|
||||||
settings.autoUpdateNotification = !v;
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
note="Relaunches the app after updating with no prompt"
|
|
||||||
disabled={!settings.autoUpdate}
|
|
||||||
>
|
|
||||||
Automatically relaunch after updating
|
|
||||||
</Switch>
|
|
||||||
|
|
||||||
<Forms.FormTitle tag="h5">Repo</Forms.FormTitle>
|
<Forms.FormTitle tag="h5">Repo</Forms.FormTitle>
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ import "./VencordTab.css";
|
||||||
import { openNotificationLogModal } from "@api/Notifications/notificationLog";
|
import { openNotificationLogModal } from "@api/Notifications/notificationLog";
|
||||||
import { useSettings } from "@api/Settings";
|
import { useSettings } from "@api/Settings";
|
||||||
import { classNameFactory } from "@api/Styles";
|
import { classNameFactory } from "@api/Styles";
|
||||||
import DonateButton, { InviteButton } from "@components/DonateButton";
|
import { DonateButton, InviteButton } from "@components/DonateButton";
|
||||||
import { openContributorModal } from "@components/PluginSettings/ContributorModal";
|
import { openContributorModal } from "@components/PluginSettings/ContributorModal";
|
||||||
import { openPluginModal } from "@components/PluginSettings/PluginModal";
|
import { openPluginModal } from "@components/PluginSettings/PluginModal";
|
||||||
import { gitRemote } from "@shared/vencordUserAgent";
|
import { gitRemote } from "@shared/vencordUserAgent";
|
||||||
|
|
|
@ -19,21 +19,18 @@
|
||||||
import "./fixDiscordBadgePadding.css";
|
import "./fixDiscordBadgePadding.css";
|
||||||
|
|
||||||
import { _getBadges, BadgePosition, BadgeUserArgs, ProfileBadge } from "@api/Badges";
|
import { _getBadges, BadgePosition, BadgeUserArgs, ProfileBadge } from "@api/Badges";
|
||||||
import DonateButton, { VCDonateButton } from "@components/DonateButton";
|
|
||||||
import ErrorBoundary from "@components/ErrorBoundary";
|
import ErrorBoundary from "@components/ErrorBoundary";
|
||||||
import { Flex } from "@components/Flex";
|
|
||||||
import { Heart } from "@components/Heart";
|
|
||||||
import { openContributorModal } from "@components/PluginSettings/ContributorModal";
|
import { openContributorModal } from "@components/PluginSettings/ContributorModal";
|
||||||
import { isEquicordDonor } from "@components/VencordSettings/VencordTab";
|
import { isEquicordDonor } from "@components/VencordSettings/VencordTab";
|
||||||
import { Devs } from "@utils/constants";
|
import { Devs } from "@utils/constants";
|
||||||
import { Logger } from "@utils/Logger";
|
import { Logger } from "@utils/Logger";
|
||||||
import { Margins } from "@utils/margins";
|
|
||||||
import { isEquicordPluginDev, isPluginDev } from "@utils/misc";
|
import { isEquicordPluginDev, isPluginDev } from "@utils/misc";
|
||||||
import { closeModal, ModalContent, ModalFooter, ModalHeader, ModalRoot, openModal } from "@utils/modal";
|
|
||||||
import definePlugin from "@utils/types";
|
import definePlugin from "@utils/types";
|
||||||
import { Forms, Toasts, UserStore } from "@webpack/common";
|
import { Toasts, UserStore } from "@webpack/common";
|
||||||
import { User } from "discord-types/general";
|
import { User } from "discord-types/general";
|
||||||
|
|
||||||
|
import { EquicordDonorModal, VencordDonorModal } from "./modals";
|
||||||
|
|
||||||
const CONTRIBUTOR_BADGE = "https://vencord.dev/assets/favicon.png";
|
const CONTRIBUTOR_BADGE = "https://vencord.dev/assets/favicon.png";
|
||||||
const EQUICORD_CONTRIBUTOR_BADGE = "https://i.imgur.com/57ATLZu.png";
|
const EQUICORD_CONTRIBUTOR_BADGE = "https://i.imgur.com/57ATLZu.png";
|
||||||
const EQUICORD_DONOR_BADGE = "https://cdn.nest.rip/uploads/78cb1e77-b7a6-4242-9089-e91f866159bf.png";
|
const EQUICORD_DONOR_BADGE = "https://cdn.nest.rip/uploads/78cb1e77-b7a6-4242-9089-e91f866159bf.png";
|
||||||
|
@ -62,6 +59,9 @@ const EquicordDonorBadge: ProfileBadge = {
|
||||||
const donorBadges = EquicordDonorBadges[userId]?.map(badge => badge.badge);
|
const donorBadges = EquicordDonorBadges[userId]?.map(badge => badge.badge);
|
||||||
const hasDonorBadge = donorBadges?.includes("https://cdn.nest.rip/uploads/78cb1e77-b7a6-4242-9089-e91f866159bf.png");
|
const hasDonorBadge = donorBadges?.includes("https://cdn.nest.rip/uploads/78cb1e77-b7a6-4242-9089-e91f866159bf.png");
|
||||||
return isEquicordDonor(userId) && !hasDonorBadge;
|
return isEquicordDonor(userId) && !hasDonorBadge;
|
||||||
|
},
|
||||||
|
onClick: () => {
|
||||||
|
return EquicordDonorModal();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -83,6 +83,7 @@ async function loadAllBadges(noCache = false) {
|
||||||
EquicordDonorBadges = equicordBadges;
|
EquicordDonorBadges = equicordBadges;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let intervalId: any;
|
||||||
|
|
||||||
export default definePlugin({
|
export default definePlugin({
|
||||||
name: "BadgeAPI",
|
name: "BadgeAPI",
|
||||||
|
@ -117,6 +118,15 @@ export default definePlugin({
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
||||||
|
// for access from the console or other plugins
|
||||||
|
get DonorBadges() {
|
||||||
|
return DonorBadges;
|
||||||
|
},
|
||||||
|
|
||||||
|
get EquicordDonorBadges() {
|
||||||
|
return EquicordDonorBadges;
|
||||||
|
},
|
||||||
|
|
||||||
toolboxActions: {
|
toolboxActions: {
|
||||||
async "Refetch Badges"() {
|
async "Refetch Badges"() {
|
||||||
await loadAllBadges(true);
|
await loadAllBadges(true);
|
||||||
|
@ -128,11 +138,16 @@ export default definePlugin({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
userProfileBadges: [ContributorBadge, EquicordContributorBadge, EquicordDonorBadge],
|
||||||
|
|
||||||
async start() {
|
async start() {
|
||||||
Vencord.Api.Badges.addProfileBadge(ContributorBadge);
|
|
||||||
Vencord.Api.Badges.addProfileBadge(EquicordContributorBadge);
|
|
||||||
Vencord.Api.Badges.addProfileBadge(EquicordDonorBadge);
|
|
||||||
await loadAllBadges();
|
await loadAllBadges();
|
||||||
|
clearInterval(intervalId);
|
||||||
|
intervalId = setInterval(loadAllBadges, 1000 * 60 * 30); // 30 minutes
|
||||||
|
},
|
||||||
|
|
||||||
|
async stop() {
|
||||||
|
clearInterval(intervalId);
|
||||||
},
|
},
|
||||||
|
|
||||||
getBadges(props: { userId: string; user?: User; guildId: string; }) {
|
getBadges(props: { userId: string; user?: User; guildId: string; }) {
|
||||||
|
@ -166,59 +181,7 @@ export default definePlugin({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onClick() {
|
onClick() {
|
||||||
const modalKey = openModal(props => (
|
return VencordDonorModal();
|
||||||
<ErrorBoundary noop onError={() => {
|
|
||||||
closeModal(modalKey);
|
|
||||||
VencordNative.native.openExternal("https://github.com/sponsors/Vendicated");
|
|
||||||
}}>
|
|
||||||
<ModalRoot {...props}>
|
|
||||||
<ModalHeader>
|
|
||||||
<Flex style={{ width: "100%", justifyContent: "center" }}>
|
|
||||||
<Forms.FormTitle
|
|
||||||
tag="h2"
|
|
||||||
style={{
|
|
||||||
width: "100%",
|
|
||||||
textAlign: "center",
|
|
||||||
margin: 0
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Heart />
|
|
||||||
Vencord Donor
|
|
||||||
</Forms.FormTitle>
|
|
||||||
</Flex>
|
|
||||||
</ModalHeader>
|
|
||||||
<ModalContent>
|
|
||||||
<Flex>
|
|
||||||
<img
|
|
||||||
role="presentation"
|
|
||||||
src="https://cdn.discordapp.com/emojis/1026533070955872337.png"
|
|
||||||
alt=""
|
|
||||||
style={{ margin: "auto" }}
|
|
||||||
/>
|
|
||||||
<img
|
|
||||||
role="presentation"
|
|
||||||
src="https://cdn.discordapp.com/emojis/1026533090627174460.png"
|
|
||||||
alt=""
|
|
||||||
style={{ margin: "auto" }}
|
|
||||||
/>
|
|
||||||
</Flex>
|
|
||||||
<div style={{ padding: "1em" }}>
|
|
||||||
<Forms.FormText>
|
|
||||||
This Badge is a special perk for Vencord Donors
|
|
||||||
</Forms.FormText>
|
|
||||||
<Forms.FormText className={Margins.top20}>
|
|
||||||
Please consider supporting the development of Vencord by becoming a donor. It would mean a lot!
|
|
||||||
</Forms.FormText>
|
|
||||||
</div>
|
|
||||||
</ModalContent>
|
|
||||||
<ModalFooter>
|
|
||||||
<Flex style={{ width: "100%", justifyContent: "center" }}>
|
|
||||||
<VCDonateButton />
|
|
||||||
</Flex>
|
|
||||||
</ModalFooter>
|
|
||||||
</ModalRoot>
|
|
||||||
</ErrorBoundary>
|
|
||||||
));
|
|
||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
@ -235,60 +198,7 @@ export default definePlugin({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onClick() {
|
onClick() {
|
||||||
const modalKey = openModal(props => (
|
return EquicordDonorModal();
|
||||||
<ErrorBoundary noop onError={() => {
|
|
||||||
closeModal(modalKey);
|
|
||||||
// Will get my own in the future
|
|
||||||
VencordNative.native.openExternal("https://github.com/sponsors/Vendicated");
|
|
||||||
}}>
|
|
||||||
<ModalRoot {...props}>
|
|
||||||
<ModalHeader>
|
|
||||||
<Flex style={{ width: "100%", justifyContent: "center" }}>
|
|
||||||
<Forms.FormTitle
|
|
||||||
tag="h2"
|
|
||||||
style={{
|
|
||||||
width: "100%",
|
|
||||||
textAlign: "center",
|
|
||||||
margin: 0
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Heart />
|
|
||||||
Equicord Donor
|
|
||||||
</Forms.FormTitle>
|
|
||||||
</Flex>
|
|
||||||
</ModalHeader>
|
|
||||||
<ModalContent>
|
|
||||||
<Flex>
|
|
||||||
<img
|
|
||||||
role="presentation"
|
|
||||||
src="https://cdn.discordapp.com/emojis/1026533070955872337.png"
|
|
||||||
alt=""
|
|
||||||
style={{ margin: "auto" }}
|
|
||||||
/>
|
|
||||||
<img
|
|
||||||
role="presentation"
|
|
||||||
src="https://cdn.discordapp.com/emojis/1026533090627174460.png"
|
|
||||||
alt=""
|
|
||||||
style={{ margin: "auto" }}
|
|
||||||
/>
|
|
||||||
</Flex>
|
|
||||||
<div style={{ padding: "1em" }}>
|
|
||||||
<Forms.FormText>
|
|
||||||
This Badge is a special perk for Equicord (Not Vencord) Donors
|
|
||||||
</Forms.FormText>
|
|
||||||
<Forms.FormText className={Margins.top20}>
|
|
||||||
Please consider supporting the development of Equicord by becoming a donor. It would mean a lot! :3
|
|
||||||
</Forms.FormText>
|
|
||||||
</div>
|
|
||||||
</ModalContent>
|
|
||||||
<ModalFooter>
|
|
||||||
<Flex style={{ width: "100%", justifyContent: "center" }}>
|
|
||||||
<DonateButton />
|
|
||||||
</Flex>
|
|
||||||
</ModalFooter>
|
|
||||||
</ModalRoot>
|
|
||||||
</ErrorBoundary>
|
|
||||||
));
|
|
||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
126
src/plugins/_api/badges/modals.tsx
Normal file
126
src/plugins/_api/badges/modals.tsx
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
/*
|
||||||
|
* Vencord, a Discord client mod
|
||||||
|
* Copyright (c) 2025 Vendicated and contributors
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { DonateButton, VCDonateButton } from "@components/DonateButton";
|
||||||
|
import { Flex } from "@components/Flex";
|
||||||
|
import { Heart } from "@components/Heart";
|
||||||
|
import { ErrorBoundary } from "@components/index";
|
||||||
|
import { Margins } from "@utils/margins";
|
||||||
|
import { closeModal, ModalContent, ModalFooter, ModalHeader, ModalRoot, openModal } from "@utils/modal";
|
||||||
|
import { Forms } from "@webpack/common";
|
||||||
|
|
||||||
|
export function VencordDonorModal() {
|
||||||
|
const modalKey = openModal(props => (
|
||||||
|
<ErrorBoundary noop onError={() => {
|
||||||
|
closeModal(modalKey);
|
||||||
|
VencordNative.native.openExternal("https://github.com/sponsors/Vendicated");
|
||||||
|
}}>
|
||||||
|
<ModalRoot {...props}>
|
||||||
|
<ModalHeader>
|
||||||
|
<Flex style={{ width: "100%", justifyContent: "center" }}>
|
||||||
|
<Forms.FormTitle
|
||||||
|
tag="h2"
|
||||||
|
style={{
|
||||||
|
width: "100%",
|
||||||
|
textAlign: "center",
|
||||||
|
margin: 0
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Heart />
|
||||||
|
Vencord Donor
|
||||||
|
</Forms.FormTitle>
|
||||||
|
</Flex>
|
||||||
|
</ModalHeader>
|
||||||
|
<ModalContent>
|
||||||
|
<Flex>
|
||||||
|
<img
|
||||||
|
role="presentation"
|
||||||
|
src="https://cdn.discordapp.com/emojis/1026533070955872337.png"
|
||||||
|
alt=""
|
||||||
|
style={{ margin: "auto" }}
|
||||||
|
/>
|
||||||
|
<img
|
||||||
|
role="presentation"
|
||||||
|
src="https://cdn.discordapp.com/emojis/1026533090627174460.png"
|
||||||
|
alt=""
|
||||||
|
style={{ margin: "auto" }}
|
||||||
|
/>
|
||||||
|
</Flex>
|
||||||
|
<div style={{ padding: "1em" }}>
|
||||||
|
<Forms.FormText>
|
||||||
|
This Badge is a special perk for Vencord Donors
|
||||||
|
</Forms.FormText>
|
||||||
|
<Forms.FormText className={Margins.top20}>
|
||||||
|
Please consider supporting the development of Vencord by becoming a donor. It would mean a lot!
|
||||||
|
</Forms.FormText>
|
||||||
|
</div>
|
||||||
|
</ModalContent>
|
||||||
|
<ModalFooter>
|
||||||
|
<Flex style={{ width: "100%", justifyContent: "center" }}>
|
||||||
|
<VCDonateButton />
|
||||||
|
</Flex>
|
||||||
|
</ModalFooter>
|
||||||
|
</ModalRoot>
|
||||||
|
</ErrorBoundary>
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
export function EquicordDonorModal() {
|
||||||
|
const modalKey = openModal(props => (
|
||||||
|
<ErrorBoundary noop onError={() => {
|
||||||
|
closeModal(modalKey);
|
||||||
|
// Will get my own in the future
|
||||||
|
VencordNative.native.openExternal("https://github.com/sponsors/thororen1234");
|
||||||
|
}}>
|
||||||
|
<ModalRoot {...props}>
|
||||||
|
<ModalHeader>
|
||||||
|
<Flex style={{ width: "100%", justifyContent: "center" }}>
|
||||||
|
<Forms.FormTitle
|
||||||
|
tag="h2"
|
||||||
|
style={{
|
||||||
|
width: "100%",
|
||||||
|
textAlign: "center",
|
||||||
|
margin: 0
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Heart />
|
||||||
|
Equicord Donor
|
||||||
|
</Forms.FormTitle>
|
||||||
|
</Flex>
|
||||||
|
</ModalHeader>
|
||||||
|
<ModalContent>
|
||||||
|
<Flex>
|
||||||
|
<img
|
||||||
|
role="presentation"
|
||||||
|
src="https://cdn.discordapp.com/emojis/1026533070955872337.png"
|
||||||
|
alt=""
|
||||||
|
style={{ margin: "auto" }}
|
||||||
|
/>
|
||||||
|
<img
|
||||||
|
role="presentation"
|
||||||
|
src="https://cdn.discordapp.com/emojis/1026533090627174460.png"
|
||||||
|
alt=""
|
||||||
|
style={{ margin: "auto" }}
|
||||||
|
/>
|
||||||
|
</Flex>
|
||||||
|
<div style={{ padding: "1em" }}>
|
||||||
|
<Forms.FormText>
|
||||||
|
This Badge is a special perk for Equicord (Not Vencord) Donors
|
||||||
|
</Forms.FormText>
|
||||||
|
<Forms.FormText className={Margins.top20}>
|
||||||
|
Please consider supporting the development of Equicord by becoming a donor. It would mean a lot! :3
|
||||||
|
</Forms.FormText>
|
||||||
|
</div>
|
||||||
|
</ModalContent>
|
||||||
|
<ModalFooter>
|
||||||
|
<Flex style={{ width: "100%", justifyContent: "center" }}>
|
||||||
|
<DonateButton />
|
||||||
|
</Flex>
|
||||||
|
</ModalFooter>
|
||||||
|
</ModalRoot>
|
||||||
|
</ErrorBoundary>
|
||||||
|
));
|
||||||
|
}
|
|
@ -133,7 +133,7 @@ for (const p of pluginsValues) if (isPluginEnabled(p.name)) {
|
||||||
if (p.renderMessageAccessory) neededApiPlugins.add("MessageAccessoriesAPI");
|
if (p.renderMessageAccessory) neededApiPlugins.add("MessageAccessoriesAPI");
|
||||||
if (p.renderMessageDecoration) neededApiPlugins.add("MessageDecorationsAPI");
|
if (p.renderMessageDecoration) neededApiPlugins.add("MessageDecorationsAPI");
|
||||||
if (p.renderMessagePopoverButton) neededApiPlugins.add("MessagePopoverAPI");
|
if (p.renderMessagePopoverButton) neededApiPlugins.add("MessagePopoverAPI");
|
||||||
if (p.userProfileBadge) neededApiPlugins.add("BadgeAPI");
|
if (p.userProfileBadges) neededApiPlugins.add("BadgeAPI");
|
||||||
|
|
||||||
for (const key of pluginKeysToBind) {
|
for (const key of pluginKeysToBind) {
|
||||||
p[key] &&= p[key].bind(p) as any;
|
p[key] &&= p[key].bind(p) as any;
|
||||||
|
@ -261,7 +261,7 @@ export function subscribeAllPluginsFluxEvents(fluxDispatcher: typeof FluxDispatc
|
||||||
|
|
||||||
export const startPlugin = traceFunction("startPlugin", function startPlugin(p: Plugin) {
|
export const startPlugin = traceFunction("startPlugin", function startPlugin(p: Plugin) {
|
||||||
const {
|
const {
|
||||||
name, commands, contextMenus, managedStyle, userProfileBadge,
|
name, commands, contextMenus, managedStyle, userProfileBadges,
|
||||||
onBeforeMessageEdit, onBeforeMessageSend, onMessageClick,
|
onBeforeMessageEdit, onBeforeMessageSend, onMessageClick,
|
||||||
renderChatBarButton, renderMemberListDecorator, renderNicknameIcon, renderMessageAccessory, renderMessageDecoration, renderMessagePopoverButton
|
renderChatBarButton, renderMemberListDecorator, renderNicknameIcon, renderMessageAccessory, renderMessageDecoration, renderMessagePopoverButton
|
||||||
} = p;
|
} = p;
|
||||||
|
@ -307,7 +307,7 @@ export const startPlugin = traceFunction("startPlugin", function startPlugin(p:
|
||||||
|
|
||||||
if (managedStyle) enableStyle(managedStyle);
|
if (managedStyle) enableStyle(managedStyle);
|
||||||
|
|
||||||
if (userProfileBadge) addProfileBadge(userProfileBadge);
|
if (userProfileBadges) userProfileBadges.forEach(e => addProfileBadge(e));
|
||||||
|
|
||||||
if (onBeforeMessageEdit) addMessagePreEditListener(onBeforeMessageEdit);
|
if (onBeforeMessageEdit) addMessagePreEditListener(onBeforeMessageEdit);
|
||||||
if (onBeforeMessageSend) addMessagePreSendListener(onBeforeMessageSend);
|
if (onBeforeMessageSend) addMessagePreSendListener(onBeforeMessageSend);
|
||||||
|
@ -325,7 +325,7 @@ export const startPlugin = traceFunction("startPlugin", function startPlugin(p:
|
||||||
|
|
||||||
export const stopPlugin = traceFunction("stopPlugin", function stopPlugin(p: Plugin) {
|
export const stopPlugin = traceFunction("stopPlugin", function stopPlugin(p: Plugin) {
|
||||||
const {
|
const {
|
||||||
name, commands, contextMenus, managedStyle, userProfileBadge,
|
name, commands, contextMenus, managedStyle, userProfileBadges,
|
||||||
onBeforeMessageEdit, onBeforeMessageSend, onMessageClick,
|
onBeforeMessageEdit, onBeforeMessageSend, onMessageClick,
|
||||||
renderChatBarButton, renderMemberListDecorator, renderNicknameIcon, renderMessageAccessory, renderMessageDecoration, renderMessagePopoverButton
|
renderChatBarButton, renderMemberListDecorator, renderNicknameIcon, renderMessageAccessory, renderMessageDecoration, renderMessagePopoverButton
|
||||||
} = p;
|
} = p;
|
||||||
|
@ -369,7 +369,7 @@ export const stopPlugin = traceFunction("stopPlugin", function stopPlugin(p: Plu
|
||||||
|
|
||||||
if (managedStyle) disableStyle(managedStyle);
|
if (managedStyle) disableStyle(managedStyle);
|
||||||
|
|
||||||
if (userProfileBadge) removeProfileBadge(userProfileBadge);
|
if (userProfileBadges) userProfileBadges.forEach(e => removeProfileBadge(e));
|
||||||
|
|
||||||
if (onBeforeMessageEdit) removeMessagePreEditListener(onBeforeMessageEdit);
|
if (onBeforeMessageEdit) removeMessagePreEditListener(onBeforeMessageEdit);
|
||||||
if (onBeforeMessageSend) removeMessagePreSendListener(onBeforeMessageSend);
|
if (onBeforeMessageSend) removeMessagePreSendListener(onBeforeMessageSend);
|
||||||
|
|
|
@ -110,7 +110,7 @@ export default definePlugin({
|
||||||
patches: [
|
patches: [
|
||||||
{
|
{
|
||||||
// Indicator
|
// Indicator
|
||||||
find: "#{intl::MESSAGE_EDITED}",
|
find: ".SEND_FAILED,",
|
||||||
replacement: {
|
replacement: {
|
||||||
match: /let\{className:\i,message:\i[^}]*\}=(\i)/,
|
match: /let\{className:\i,message:\i[^}]*\}=(\i)/,
|
||||||
replace: "try {$1 && $self.INV_REGEX.test($1.message.content) ? $1.content.push($self.indicator()) : null } catch {};$&"
|
replace: "try {$1 && $self.INV_REGEX.test($1.message.content) ? $1.content.push($self.indicator()) : null } catch {};$&"
|
||||||
|
|
|
@ -487,22 +487,23 @@ export default definePlugin({
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
|
||||||
// Message content renderer
|
// Message content renderer
|
||||||
find: "#{intl::MESSAGE_EDITED}",
|
|
||||||
replacement: [
|
|
||||||
{
|
{
|
||||||
|
find: ".SEND_FAILED,",
|
||||||
|
replacement: {
|
||||||
// Render editHistory in the deepest div for message content
|
// Render editHistory in the deepest div for message content
|
||||||
match: /(\)\("div",\{id:.+?children:\[)/,
|
match: /(\)\("div",\{id:.+?children:\[)/,
|
||||||
replace:
|
replace: "$1 (!!arguments[0].message.editHistory?.length && $self.renderEdits(arguments[0])),"
|
||||||
"$1 (!!arguments[0].message.editHistory?.length && $self.renderEdits(arguments[0])),",
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
|
find: "#{intl::MESSAGE_EDITED}",
|
||||||
|
replacement: {
|
||||||
// Make edit marker clickable
|
// Make edit marker clickable
|
||||||
match: /"span",\{(?=className:\i\.edited,)/,
|
match: /"span",\{(?=className:\i\.edited,)/,
|
||||||
replace: "$self.EditMarker,{message:arguments[0].message,",
|
replace: "$self.EditMarker,{message:arguments[0].message,"
|
||||||
},
|
}
|
||||||
],
|
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
|
@ -30,7 +30,7 @@ export default definePlugin({
|
||||||
{
|
{
|
||||||
find: "}searchWithoutFetchingLatest(",
|
find: "}searchWithoutFetchingLatest(",
|
||||||
replacement: {
|
replacement: {
|
||||||
match: /searchWithoutFetchingLatest.{20,300}get\((\i).{10,40}?reduce\(\((\i),(\i)\)=>\{/,
|
match: /\.get\((\i)\)\.nameMatchesChain\(\i\)\.reduce\(\((\i),(\i)\)=>\{/,
|
||||||
replace: "$& if ($self.shouldSkip($1, $3)) return $2;"
|
replace: "$& if ($self.shouldSkip($1, $3)) return $2;"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -154,7 +154,7 @@ export default definePlugin({
|
||||||
},
|
},
|
||||||
// Messages
|
// Messages
|
||||||
{
|
{
|
||||||
find: "#{intl::MESSAGE_EDITED}",
|
find: ".SEND_FAILED,",
|
||||||
replacement: {
|
replacement: {
|
||||||
match: /(?<=isUnsupported\]:(\i)\.isUnsupported\}\),)(?=children:\[)/,
|
match: /(?<=isUnsupported\]:(\i)\.isUnsupported\}\),)(?=children:\[)/,
|
||||||
replace: "style:$self.useMessageColorsStyle($1),"
|
replace: "style:$self.useMessageColorsStyle($1),"
|
||||||
|
|
|
@ -177,7 +177,7 @@ export interface PluginDef {
|
||||||
*/
|
*/
|
||||||
managedStyle?: string;
|
managedStyle?: string;
|
||||||
|
|
||||||
userProfileBadge?: ProfileBadge;
|
userProfileBadges?: ProfileBadge[];
|
||||||
|
|
||||||
onMessageClick?: MessageClickListener;
|
onMessageClick?: MessageClickListener;
|
||||||
onBeforeMessageSend?: MessageSendListener;
|
onBeforeMessageSend?: MessageSendListener;
|
||||||
|
|
|
@ -39,10 +39,15 @@ async function Unwrap<T>(p: Promise<IpcRes<T>>) {
|
||||||
|
|
||||||
export async function checkForUpdates() {
|
export async function checkForUpdates() {
|
||||||
changes = await Unwrap(VencordNative.updater.getUpdates());
|
changes = await Unwrap(VencordNative.updater.getUpdates());
|
||||||
|
|
||||||
|
// we only want to check this for the git updater, not the http updater
|
||||||
|
if (!IS_STANDALONE) {
|
||||||
if (changes.some(c => c.hash === gitHash)) {
|
if (changes.some(c => c.hash === gitHash)) {
|
||||||
isNewer = true;
|
isNewer = true;
|
||||||
return (isOutdated = false);
|
return (isOutdated = false);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return (isOutdated = changes.length > 0);
|
return (isOutdated = changes.length > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue