)` +
- `${settings.additionalInfo} - ${Intl.DateTimeFormat("en-GB", { dateStyle: "medium" }).format(BUILD_TIMESTAMP)}`,
- Client: `${RELEASE_CHANNEL} ~ ${client}`,
- Platform: window.navigator.platform
- };
-
- if (IS_DISCORD_DESKTOP) {
- info["Last Crash Reason"] = (await DiscordNative.processUtils.getLastCrash())?.rendererCrashReason ?? "N/A";
- }
-
- const debugInfo = `
->>> ${Object.entries(info).map(([k, v]) => `**${k}**: ${v}`).join("\n")}
-
-Enabled Plugins (${enabledPlugins.length}):
-${makeCodeblock(enabledPlugins.join(", "))}
-`;
-
- return {
- content: debugInfo.trim().replaceAll("```\n", "```")
- };
+ commands: [
+ {
+ name: "vencord-debug",
+ description: "Send Vencord debug info",
+ predicate: ctx => isPluginDev(UserStore.getCurrentUser()?.id) || AllowedChannelIds.includes(ctx.channel.id),
+ execute: async () => ({ content: await generateDebugInfoMessage() })
+ },
+ {
+ name: "vencord-plugins",
+ description: "Send Vencord plugin list",
+ predicate: ctx => isPluginDev(UserStore.getCurrentUser()?.id) || AllowedChannelIds.includes(ctx.channel.id),
+ execute: () => ({ content: generatePluginList() })
}
- }],
+ ],
flux: {
async CHANNEL_SELECT({ channelId }) {
@@ -115,24 +169,25 @@ ${makeCodeblock(enabledPlugins.join(", "))}
const selfId = UserStore.getCurrentUser()?.id;
if (!selfId || isPluginDev(selfId)) return;
- if (isOutdated) {
- return Alerts.show({
- title: "Hold on!",
- body:
- You are using an outdated version of Vencord! Chances are, your issue is already fixed.
-
- Please first update before asking for support!
-
-
,
- 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"
- });
+ if (!IS_UPDATER_DISABLED) {
+ await checkForUpdatesOnce().catch(() => { });
+
+ if (isOutdated) {
+ return Alerts.show({
+ title: "Hold on!",
+ body:
+ You are using an outdated version of Vencord! Chances are, your issue is already fixed.
+
+ Please first update before asking for support!
+
+
,
+ onCancel: () => openUpdaterModal!(),
+ cancelText: "View Updates",
+ confirmText: "Update & Restart Now",
+ onConfirm: forceUpdate,
+ secondaryConfirmText: "I know what I'm doing or I can't update"
+ });
+ }
}
// @ts-ignore outdated type
@@ -148,8 +203,7 @@ ${makeCodeblock(enabledPlugins.join(", "))}
Please either switch to an officially supported version of Vencord, or
contact your package maintainer for support instead.
- ,
- onCloseCallback: () => setTimeout(() => NavigationRouter.back(), 50)
+
});
}
@@ -163,8 +217,7 @@ ${makeCodeblock(enabledPlugins.join(", "))}
Please either switch to an officially supported version of Vencord, or
contact your package maintainer for support instead.
- ,
- onCloseCallback: () => setTimeout(() => NavigationRouter.back(), 50)
+
});
}
}
@@ -172,7 +225,7 @@ ${makeCodeblock(enabledPlugins.join(", "))}
ContributorDmWarningCard: ErrorBoundary.wrap(({ userId }) => {
if (!isPluginDev(userId)) return null;
- if (RelationshipStore.isFriend(userId)) return null;
+ if (RelationshipStore.isFriend(userId) || isPluginDev(UserStore.getCurrentUser()?.id)) return null;
return (
@@ -182,5 +235,86 @@ ${makeCodeblock(enabledPlugins.join(", "))}
{!ChannelStore.getChannel(SUPPORT_CHANNEL_ID) && " (Click the link to join)"}
);
- }, { noop: true })
+ }, { noop: true }),
+
+ start() {
+ addAccessory("vencord-debug", props => {
+ const buttons = [] as JSX.Element[];
+
+ const shouldAddUpdateButton =
+ !IS_UPDATER_DISABLED
+ && (
+ (props.channel.id === KNOWN_ISSUES_CHANNEL_ID) ||
+ (props.channel.id === SUPPORT_CHANNEL_ID && props.message.author.id === VENBOT_USER_ID)
+ )
+ && props.message.content?.includes("update");
+
+ if (shouldAddUpdateButton) {
+ buttons.push(
+
+ );
+ }
+
+ if (props.channel.id === SUPPORT_CHANNEL_ID) {
+ if (props.message.content.includes("/vencord-debug") || props.message.content.includes("/vencord-plugins")) {
+ buttons.push(
+ ,
+
+ );
+ }
+
+ if (props.message.author.id === VENBOT_USER_ID) {
+ const match = CodeBlockRe.exec(props.message.content || props.message.embeds[0]?.rawDescription || "");
+ if (match) {
+ buttons.push(
+
+ );
+ }
+ }
+ }
+
+ return buttons.length
+ ? {buttons}
+ : null;
+ });
+ },
});
diff --git a/src/utils/misc.tsx b/src/utils/misc.ts
similarity index 92%
rename from src/utils/misc.tsx
rename to src/utils/misc.ts
index fb08c93f..7d6b4aff 100644
--- a/src/utils/misc.tsx
+++ b/src/utils/misc.ts
@@ -99,3 +99,14 @@ export const isPluginDev = (id: string) => Object.hasOwn(DevsById, id);
export function pluralise(amount: number, singular: string, plural = singular + "s") {
return amount === 1 ? `${amount} ${singular}` : `${amount} ${plural}`;
}
+
+export function tryOrElse(func: () => T, fallback: T): T {
+ try {
+ const res = func();
+ return res instanceof Promise
+ ? res.catch(() => fallback) as T
+ : res;
+ } catch {
+ return fallback;
+ }
+}
diff --git a/src/utils/text.ts b/src/utils/text.ts
index 63f60074..2e85af4e 100644
--- a/src/utils/text.ts
+++ b/src/utils/text.ts
@@ -131,3 +131,18 @@ export function makeCodeblock(text: string, language?: string) {
const chars = "```";
return `${chars}${language || ""}\n${text.replaceAll("```", "\\`\\`\\`")}\n${chars}`;
}
+
+export function stripIndent(strings: TemplateStringsArray, ...values: any[]) {
+ const string = String.raw({ raw: strings }, ...values);
+
+ const match = string.match(/^[ \t]*(?=\S)/gm);
+ if (!match) return string.trim();
+
+ const minIndent = match.reduce((r, a) => Math.min(r, a.length), Infinity);
+ return string.replace(new RegExp(`^[ \\t]{${minIndent}}`, "gm"), "").trim();
+}
+
+export const ZWSP = "\u200b";
+export function toInlineCode(s: string) {
+ return "``" + ZWSP + s.replaceAll("`", ZWSP + "`" + ZWSP) + ZWSP + "``";
+}