|
|
@ -16,20 +16,24 @@
|
|
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
import { DataStore } from "@api/index";
|
|
|
|
import ErrorBoundary from "@components/ErrorBoundary";
|
|
|
|
|
|
|
|
import { Link } from "@components/Link";
|
|
|
|
|
|
|
|
import { openUpdaterModal } from "@components/VencordSettings/UpdaterTab";
|
|
|
|
import { Devs, SUPPORT_CHANNEL_ID } from "@utils/constants";
|
|
|
|
import { Devs, SUPPORT_CHANNEL_ID } from "@utils/constants";
|
|
|
|
|
|
|
|
import { Margins } from "@utils/margins";
|
|
|
|
import { isPluginDev } from "@utils/misc";
|
|
|
|
import { isPluginDev } from "@utils/misc";
|
|
|
|
|
|
|
|
import { relaunch } from "@utils/native";
|
|
|
|
import { makeCodeblock } from "@utils/text";
|
|
|
|
import { makeCodeblock } from "@utils/text";
|
|
|
|
import definePlugin from "@utils/types";
|
|
|
|
import definePlugin from "@utils/types";
|
|
|
|
import { isOutdated } from "@utils/updater";
|
|
|
|
import { isOutdated, update } from "@utils/updater";
|
|
|
|
import { Alerts, Forms, UserStore } from "@webpack/common";
|
|
|
|
import { Alerts, Card, ChannelStore, Forms, GuildMemberStore, NavigationRouter, Parser, RelationshipStore, UserStore } from "@webpack/common";
|
|
|
|
|
|
|
|
|
|
|
|
import gitHash from "~git-hash";
|
|
|
|
import gitHash from "~git-hash";
|
|
|
|
import plugins from "~plugins";
|
|
|
|
import plugins from "~plugins";
|
|
|
|
|
|
|
|
|
|
|
|
import settings from "./settings";
|
|
|
|
import settings from "./settings";
|
|
|
|
|
|
|
|
|
|
|
|
const REMEMBER_DISMISS_KEY = "Vencord-SupportHelper-Dismiss";
|
|
|
|
const VENCORD_GUILD_ID = "1015060230222131221";
|
|
|
|
|
|
|
|
|
|
|
|
const AllowedChannelIds = [
|
|
|
|
const AllowedChannelIds = [
|
|
|
|
SUPPORT_CHANNEL_ID,
|
|
|
|
SUPPORT_CHANNEL_ID,
|
|
|
@ -37,6 +41,12 @@ const AllowedChannelIds = [
|
|
|
|
"1033680203433660458", // Vencord > #v
|
|
|
|
"1033680203433660458", // Vencord > #v
|
|
|
|
];
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const TrustedRolesIds = [
|
|
|
|
|
|
|
|
"1026534353167208489", // contributor
|
|
|
|
|
|
|
|
"1026504932959977532", // regular
|
|
|
|
|
|
|
|
"1042507929485586532", // donor
|
|
|
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
export default definePlugin({
|
|
|
|
export default definePlugin({
|
|
|
|
name: "SupportHelper",
|
|
|
|
name: "SupportHelper",
|
|
|
|
required: true,
|
|
|
|
required: true,
|
|
|
@ -44,6 +54,14 @@ export default definePlugin({
|
|
|
|
authors: [Devs.Ven],
|
|
|
|
authors: [Devs.Ven],
|
|
|
|
dependencies: ["CommandsAPI"],
|
|
|
|
dependencies: ["CommandsAPI"],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
patches: [{
|
|
|
|
|
|
|
|
find: ".BEGINNING_DM.format",
|
|
|
|
|
|
|
|
replacement: {
|
|
|
|
|
|
|
|
match: /BEGINNING_DM\.format\(\{.+?\}\),(?=.{0,100}userId:(\i\.getRecipientId\(\)))/,
|
|
|
|
|
|
|
|
replace: "$& $self.ContributorDmWarningCard({ userId: $1 }),"
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}],
|
|
|
|
|
|
|
|
|
|
|
|
commands: [{
|
|
|
|
commands: [{
|
|
|
|
name: "vencord-debug",
|
|
|
|
name: "vencord-debug",
|
|
|
|
description: "Send Vencord Debug info",
|
|
|
|
description: "Send Vencord Debug info",
|
|
|
@ -64,15 +82,13 @@ export default definePlugin({
|
|
|
|
const isApiPlugin = (plugin: string) => plugin.endsWith("API") || plugins[plugin].required;
|
|
|
|
const isApiPlugin = (plugin: string) => plugin.endsWith("API") || plugins[plugin].required;
|
|
|
|
|
|
|
|
|
|
|
|
const enabledPlugins = Object.keys(plugins).filter(p => Vencord.Plugins.isPluginEnabled(p) && !isApiPlugin(p));
|
|
|
|
const enabledPlugins = Object.keys(plugins).filter(p => Vencord.Plugins.isPluginEnabled(p) && !isApiPlugin(p));
|
|
|
|
const enabledApiPlugins = Object.keys(plugins).filter(p => Vencord.Plugins.isPluginEnabled(p) && isApiPlugin(p));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const info = {
|
|
|
|
const info = {
|
|
|
|
Vencord: `v${VERSION} • ${gitHash}${settings.additionalInfo} - ${Intl.DateTimeFormat("en-GB", { dateStyle: "medium" }).format(BUILD_TIMESTAMP)}`,
|
|
|
|
Vencord:
|
|
|
|
"Discord Branch": RELEASE_CHANNEL,
|
|
|
|
`v${VERSION} • [${gitHash}](<https://github.com/Vendicated/Vencord/commit/${gitHash}>)` +
|
|
|
|
Client: client,
|
|
|
|
`${settings.additionalInfo} - ${Intl.DateTimeFormat("en-GB", { dateStyle: "medium" }).format(BUILD_TIMESTAMP)}`,
|
|
|
|
Platform: window.navigator.platform,
|
|
|
|
Client: `${RELEASE_CHANNEL} ~ ${client}`,
|
|
|
|
Outdated: isOutdated,
|
|
|
|
Platform: window.navigator.platform
|
|
|
|
OpenAsar: "openasar" in window,
|
|
|
|
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
if (IS_DISCORD_DESKTOP) {
|
|
|
|
if (IS_DISCORD_DESKTOP) {
|
|
|
@ -80,11 +96,10 @@ export default definePlugin({
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const debugInfo = `
|
|
|
|
const debugInfo = `
|
|
|
|
**Vencord Debug Info**
|
|
|
|
>>> ${Object.entries(info).map(([k, v]) => `**${k}**: ${v}`).join("\n")}
|
|
|
|
>>> ${Object.entries(info).map(([k, v]) => `${k}: ${v}`).join("\n")}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Enabled Plugins (${enabledPlugins.length + enabledApiPlugins.length}):
|
|
|
|
Enabled Plugins (${enabledPlugins.length}):
|
|
|
|
${makeCodeblock(enabledPlugins.join(", ") + "\n\n" + enabledApiPlugins.join(", "))}
|
|
|
|
${makeCodeblock(enabledPlugins.join(", "))}
|
|
|
|
`;
|
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
return {
|
|
|
@ -97,24 +112,75 @@ ${makeCodeblock(enabledPlugins.join(", ") + "\n\n" + enabledApiPlugins.join(", "
|
|
|
|
async CHANNEL_SELECT({ channelId }) {
|
|
|
|
async CHANNEL_SELECT({ channelId }) {
|
|
|
|
if (channelId !== SUPPORT_CHANNEL_ID) return;
|
|
|
|
if (channelId !== SUPPORT_CHANNEL_ID) return;
|
|
|
|
|
|
|
|
|
|
|
|
if (isPluginDev(UserStore.getCurrentUser().id)) return;
|
|
|
|
const selfId = UserStore.getCurrentUser()?.id;
|
|
|
|
|
|
|
|
if (!selfId || isPluginDev(selfId)) return;
|
|
|
|
|
|
|
|
|
|
|
|
if (isOutdated && gitHash !== await DataStore.get(REMEMBER_DISMISS_KEY)) {
|
|
|
|
if (isOutdated) {
|
|
|
|
const rememberDismiss = () => DataStore.set(REMEMBER_DISMISS_KEY, gitHash);
|
|
|
|
return Alerts.show({
|
|
|
|
|
|
|
|
|
|
|
|
Alerts.show({
|
|
|
|
|
|
|
|
title: "Hold on!",
|
|
|
|
title: "Hold on!",
|
|
|
|
body: <div>
|
|
|
|
body: <div>
|
|
|
|
<Forms.FormText>You are using an outdated version of Vencord! Chances are, your issue is already fixed.</Forms.FormText>
|
|
|
|
<Forms.FormText>You are using an outdated version of Vencord! Chances are, your issue is already fixed.</Forms.FormText>
|
|
|
|
<Forms.FormText>
|
|
|
|
<Forms.FormText className={Margins.top8}>
|
|
|
|
Please first update using the Updater Page in Settings, or use the VencordInstaller (Update Vencord Button)
|
|
|
|
Please first update before asking for support!
|
|
|
|
to do so, in case you can't access the Updater page.
|
|
|
|
</Forms.FormText>
|
|
|
|
|
|
|
|
</div>,
|
|
|
|
|
|
|
|
onCancel: () => openUpdaterModal!(),
|
|
|
|
|
|
|
|
cancelText: "View Updates",
|
|
|
|
|
|
|
|
confirmText: "Update & Restart Now",
|
|
|
|
|
|
|
|
async onConfirm() {
|
|
|
|
|
|
|
|
await update();
|
|
|
|
|
|
|
|
relaunch();
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
secondaryConfirmText: "I know what I'm doing or I can't update"
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// @ts-ignore outdated type
|
|
|
|
|
|
|
|
const roles = GuildMemberStore.getSelfMember(VENCORD_GUILD_ID)?.roles;
|
|
|
|
|
|
|
|
if (!roles || TrustedRolesIds.some(id => roles.includes(id))) return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (IS_UPDATER_DISABLED) {
|
|
|
|
|
|
|
|
return Alerts.show({
|
|
|
|
|
|
|
|
title: "Hold on!",
|
|
|
|
|
|
|
|
body: <div>
|
|
|
|
|
|
|
|
<Forms.FormText>You are using an externally updated Vencord version, which we do not provide support for!</Forms.FormText>
|
|
|
|
|
|
|
|
<Forms.FormText className={Margins.top8}>
|
|
|
|
|
|
|
|
Please either switch to an <Link href="https://vencord.dev/download">officially supported version of Vencord</Link>, or
|
|
|
|
|
|
|
|
contact your package maintainer for support instead.
|
|
|
|
</Forms.FormText>
|
|
|
|
</Forms.FormText>
|
|
|
|
</div>,
|
|
|
|
</div>,
|
|
|
|
onCancel: rememberDismiss,
|
|
|
|
onCloseCallback: () => setTimeout(() => NavigationRouter.back(), 50)
|
|
|
|
onConfirm: rememberDismiss
|
|
|
|
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const repo = await VencordNative.updater.getRepo();
|
|
|
|
|
|
|
|
if (repo.ok && !repo.value.includes("Vendicated/Vencord")) {
|
|
|
|
|
|
|
|
return Alerts.show({
|
|
|
|
|
|
|
|
title: "Hold on!",
|
|
|
|
|
|
|
|
body: <div>
|
|
|
|
|
|
|
|
<Forms.FormText>You are using a fork of Vencord, which we do not provide support for!</Forms.FormText>
|
|
|
|
|
|
|
|
<Forms.FormText className={Margins.top8}>
|
|
|
|
|
|
|
|
Please either switch to an <Link href="https://vencord.dev/download">officially supported version of Vencord</Link>, or
|
|
|
|
|
|
|
|
contact your package maintainer for support instead.
|
|
|
|
|
|
|
|
</Forms.FormText>
|
|
|
|
|
|
|
|
</div>,
|
|
|
|
|
|
|
|
onCloseCallback: () => setTimeout(() => NavigationRouter.back(), 50)
|
|
|
|
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ContributorDmWarningCard: ErrorBoundary.wrap(({ userId }) => {
|
|
|
|
|
|
|
|
if (!isPluginDev(userId)) return null;
|
|
|
|
|
|
|
|
if (RelationshipStore.isFriend(userId)) return null;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
|
|
|
<Card className={`vc-plugins-restart-card ${Margins.top8}`}>
|
|
|
|
|
|
|
|
Please do not private message Vencord plugin developers for support!
|
|
|
|
|
|
|
|
<br />
|
|
|
|
|
|
|
|
Instead, use the Vencord support channel: {Parser.parse("https://discord.com/channels/1015060230222131221/1026515880080842772")}
|
|
|
|
|
|
|
|
{!ChannelStore.getChannel(SUPPORT_CHANNEL_ID) && " (Click the link to join)"}
|
|
|
|
|
|
|
|
</Card>
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
}, { noop: true })
|
|
|
|
});
|
|
|
|
});
|
|
|
|