autoJump(channel)}
- />
- );
-};
-
-export default definePlugin({
- name: "AutoJump",
- description: "Automatically jumps to the last message in selected channel & adds a context-menu option to jump to the last message.",
- authors: [EquicordDevs.omaw],
- contextMenus: {
- "channel-context": MenuPatch,
- "user-context": MenuPatch,
- "thread-context": MenuPatch
- },
- flux: {
- async CHANNEL_SELECT({ guildId, channelId }: ChannelSelectEvent) {
- if (!guildId || !channelId) return;
- const channel = ChannelStore.getChannel(channelId);
- if (!channel || lastChan === channel.id) return;
- autoJump(channel);
- }
- }
-});
diff --git a/src/equicordplugins/betterCommands/index.ts b/src/equicordplugins/betterCommands/index.ts
index 26dc8dd05..84f1e6d98 100644
--- a/src/equicordplugins/betterCommands/index.ts
+++ b/src/equicordplugins/betterCommands/index.ts
@@ -15,6 +15,11 @@ const settings = definePluginSettings({
description: "Automatically fill command with all arguements instead of just required ones",
type: OptionType.BOOLEAN,
default: true,
+ },
+ allowNewlinesInCommands: {
+ description: "Allow newlines in command inputs (Shift + Enter)",
+ type: OptionType.BOOLEAN,
+ default: true,
}
});
@@ -40,6 +45,26 @@ export default definePlugin({
replace: "true"
},
]
+ },
+ {
+ find: '"italics"),!0;',
+ predicate: () => settings.store.allowNewlinesInCommands,
+ replacement: [
+ {
+ match: /case (\i\.\i)\.TAB:if\(null!=(\i).selection&&\i\((\i)(?=.{0,300}(\i\.\i\.insertText))/,
+ replace: (orig, keys, editor, event, insertText) => {
+ return `case ${keys}.ENTER:
+ if(${event}.shiftKey){
+ ${event}.preventDefault();
+ ${event}.stopPropagation();
+ ${insertText}(${editor},'\\n');
+ return true;
+ }
+ break;
+ ${orig}`;
+ }
+ }
+ ]
}
],
commands: [
diff --git a/src/equicordplugins/equicordHelper/index.tsx b/src/equicordplugins/equicordHelper/index.tsx
index bd9672f90..6edc80c39 100644
--- a/src/equicordplugins/equicordHelper/index.tsx
+++ b/src/equicordplugins/equicordHelper/index.tsx
@@ -1,49 +1,42 @@
/*
- * Vencord, a modification for Discord's desktop app
- * Copyright (c) 2022 Vendicated and Megumin
- *
- * 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 .
-*/
+ * Vencord, a Discord client mod
+ * Copyright (c) 2025 Vendicated and contributors
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
import "@equicordplugins/_misc/styles.css";
-import { Devs, EQUICORD_HELPERS, EquicordDevs, GUILD_ID } from "@utils/constants";
+import { definePluginSettings, Settings } from "@api/Settings";
+import { Devs, EquicordDevs } from "@utils/constants";
import { Logger } from "@utils/Logger";
-import definePlugin from "@utils/types";
-import { Button, ChannelStore, Flex, Forms, GuildMemberStore, showToast, Toasts } from "@webpack/common";
+import { isEquicordGuild, isEquicordSupport } from "@utils/misc";
+import definePlugin, { OptionType } from "@utils/types";
+import { Button, Flex, showToast, Toasts } from "@webpack/common";
import { JSX } from "react";
import { toggleEnabled } from "./utils";
+const settings = definePluginSettings({
+ disableCreateDMButton: {
+ type: OptionType.BOOLEAN,
+ description: "Disables the create dm button",
+ restartNeeded: true,
+ default: false,
+ },
+ disableDMContextMenu: {
+ type: OptionType.BOOLEAN,
+ description: "Disables the DM list context menu in favor of the x button",
+ restartNeeded: true,
+ default: false
+ }
+});
export default definePlugin({
name: "EquicordHelper",
- description: "Fixes some misc issues with discord",
+ description: "Used to provide support, fix discord caused crashes, and other misc features.",
authors: [Devs.thororen, EquicordDevs.nyx, EquicordDevs.Naibuu],
- settingsAboutComponent: () => <>
-
- This plugin was created to allow us as the Equicord Team & Contributors
- to fix miscellaneous issues Discord may run into or cause.
-
- This includes but is not limited to:
-
- - Unknown Resolution/FPS Fixed?
-
- - Whitelists all domains in CSP
-
- >,
required: true,
+ settings,
patches: [
// Fixes Unknown Resolution/FPS Crashing
{
@@ -58,47 +51,83 @@ export default definePlugin({
replace: "return $1;"
}
]
- }
+ },
+ {
+ find: ".createDMButtonContainer,",
+ replacement: {
+ match: /"create-dm"\)/,
+ replace: "$&&&false"
+ },
+ predicate: () => settings.store.disableCreateDMButton
+ },
+ {
+ find: "#{intl::d+e27u::raw}",
+ replacement: {
+ match: /\{dotsInsteadOfCloseButton:(\i),rearrangeContextMenu:(\i).*?autoTrackExposure:!0\}\)/,
+ replace: "$1=false,$2=false"
+ },
+ predicate: () => settings.store.disableDMContextMenu
+ },
],
- renderMessageAccessory(props) {
- const buttons = [] as JSX.Element[];
-
- const equicordSupport = GuildMemberStore.getMember(GUILD_ID, props.message.author.id)?.roles?.includes(EQUICORD_HELPERS);
-
- const msg = props.message.content?.toLowerCase() ?? "";
-
- const contentWords = (msg.match(/`\w+`/g) ?? []).map(e => e.slice(1, -1));
- const matchedPlugins = Object.keys(Vencord.Plugins.plugins).filter(name => contentWords.includes(name.toLowerCase()));
- const matchedPlugin = matchedPlugins.sort((a, b) => b.length - a.length)[0];
- const pluginData = matchedPlugin && Vencord.Plugins.plugins[matchedPlugin];
- const equicordGuild = ChannelStore.getChannel(props.channel.id)?.guild_id === GUILD_ID;
- const ableCheck = msg.startsWith("enable") || msg.startsWith("disable");
- const shouldAddPluginButtons = equicordGuild && equicordSupport && matchedPlugin && pluginData && ableCheck;
-
- if (shouldAddPluginButtons) {
- if (pluginData.required || pluginData.name.endsWith("API")) return;
- const isEnabled = Vencord.Plugins.isPluginEnabled(matchedPlugin);
- buttons.push(
-
- );
+ start() {
+ if (Settings.plugins?.PinDMs?.disableCreateDMButton) {
+ settings.store.disableCreateDMButton = true;
}
-
- return buttons.length
- ? {buttons}
- : null;
+ },
+ renderMessageAccessory(props) {
+ return pluginToggleButtons(props);
}
});
+
+function pluginToggleButtons(props) {
+ const buttons = [] as JSX.Element[];
+ const msg = props.message.content?.toLowerCase() ?? "";
+
+ const contentWords = (msg.match(/`\w+`/g) ?? []).map(e => e.slice(1, -1));
+ const matchedPlugins = Object.keys(Vencord.Plugins.plugins).filter(name => contentWords.includes(name.toLowerCase()));
+ const matchedPlugin = matchedPlugins.sort((a, b) => b.length - a.length)[0];
+ const pluginData = matchedPlugin ? Vencord.Plugins.plugins[matchedPlugin] : null;
+
+ const isEquicord = isEquicordGuild(props.channel.id) && isEquicordSupport(props.message.author.id);
+ const startsWithEnabled = msg.startsWith("enable");
+ const startsWithDisabled = msg.startsWith("disable");
+
+ const shouldAddPluginButtons = pluginData && isEquicord && (startsWithEnabled || startsWithDisabled);
+
+ if (shouldAddPluginButtons) {
+ if (pluginData.required || pluginData.name.endsWith("API")) return;
+ const isEnabled = Vencord.Plugins.isPluginEnabled(matchedPlugin);
+
+ let label = `${matchedPlugin} is already ${isEnabled ? "enabled" : "disabled"}`;
+ let disabled = true;
+
+ if ((startsWithDisabled && isEnabled) || (startsWithEnabled && !isEnabled)) {
+ label = `${isEnabled ? "Disable" : "Enable"} ${matchedPlugin}`;
+ disabled = false;
+ }
+
+ buttons.push(
+
+ );
+ }
+
+ return buttons.length
+ ? {buttons}
+ : null;
+}
diff --git a/src/equicordplugins/equissant/index.ts b/src/equicordplugins/equissant/index.ts
index 1975caf77..849d1ad04 100644
--- a/src/equicordplugins/equissant/index.ts
+++ b/src/equicordplugins/equissant/index.ts
@@ -1,39 +1,40 @@
/*
- * Vencord, a modification for Discord's desktop app
- * Copyright (c) 2022 Vendicated and Megumin
- *
- * 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 .
-*/
+ * Vencord, a Discord client mod
+ * Copyright (c) 2025 Vendicated and contributors
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+import { definePluginSettings } from "@api/Settings";
import { Devs, EquicordDevs } from "@utils/constants";
-import definePlugin from "@utils/types";
+import definePlugin, { OptionType } from "@utils/types";
let clickCount = 0;
function play() {
clickCount++;
- if (clickCount % 10 === 0) {
+ const triggerAmount = settings.store.amount;
+
+ if (clickCount % triggerAmount === 0) {
const audio = new Audio("https://github.com/Equicord/Equibored/raw/main/sounds/equissant/croissant.mp3");
audio.play();
+ clickCount = 0;
}
}
+const settings = definePluginSettings({
+ amount: {
+ type: OptionType.NUMBER,
+ description: "amount of clicks to trigger crossant",
+ default: 10,
+ }
+});
+
export default definePlugin({
name: "Equissant",
- description: "Crossant every 10 clicks :trolley:",
+ description: "Crossant every specified amount of clicks :trolley:",
authors: [EquicordDevs.SomeAspy, Devs.thororen],
+ settings,
start() {
document.addEventListener("click", play);
},
diff --git a/src/equicordplugins/jellyfinRichPresence/index.tsx b/src/equicordplugins/jellyfinRichPresence/index.tsx
index 758f14df5..af04abb77 100644
--- a/src/equicordplugins/jellyfinRichPresence/index.tsx
+++ b/src/equicordplugins/jellyfinRichPresence/index.tsx
@@ -65,6 +65,19 @@ const settings = definePluginSettings({
description: "Jellyfin user ID obtained from your user profile URL",
type: OptionType.STRING,
},
+ nameDisplay: {
+ description: "Choose how the application name should appear in Rich Presence",
+ type: OptionType.SELECT,
+ options: [
+ { label: "Series/Movie Name", value: "default", default: true },
+ { label: "Series - Episode/Track/Movie Name", value: "full" },
+ { label: "Custom", value: "custom" },
+ ],
+ },
+ customName: {
+ description: "Custom Rich Presence name (only used if 'Custom' is selected).\nOptions: {name}, {series}, {season}, {episode}, {artist}, {album}, {year}",
+ type: OptionType.STRING,
+ },
overrideRichPresenceType: {
description: "Override the rich presence type",
type: OptionType.SELECT,
@@ -113,16 +126,27 @@ function setActivity(activity: Activity | null) {
export default definePlugin({
name: "JellyfinRichPresence",
description: "Rich presence for Jellyfin media server",
- authors: [EquicordDevs.vmohammad],
+ authors: [EquicordDevs.vmohammad, EquicordDevs.SerStars],
settingsAboutComponent: () => (
<>
How to get an API key
- An API key is required to fetch your current media. To get one, go to your
- Jellyfin dashboard, navigate to Administration {">"} API Keys and
- create a new API key.
-
+ Auth token can be found by following these steps:
+
+
1. Log into your Jellyfin instance
+
2. Open your browser's Developer Tools (usually F12 or right-click then Inspect)
+
3. Go to the Network tab in Developer Tools
+
4. Look for requests to your Jellyfin server
+
+ 5. In the request headers, find X-MediaBrowser-Token or Authorization
+
+
+ Easiest way: press Ctrl+F in the Developer Tools and search for X-MediaBrowser-Token
+
+