>
);
-}
+}
\ No newline at end of file
diff --git a/src/equicordplugins/channelTabs/index.tsx b/src/equicordplugins/channelTabs/index.tsx
index 6c5aaf103..f0cc1b4fe 100644
--- a/src/equicordplugins/channelTabs/index.tsx
+++ b/src/equicordplugins/channelTabs/index.tsx
@@ -15,7 +15,7 @@ import { Channel, Message } from "discord-types/general";
import { JSX } from "react";
import ChannelsTabsContainer from "./components/ChannelTabsContainer";
-import { BasicChannelTabsProps, createTab, settings } from "./util";
+import { BasicChannelTabsProps, createTab, handleChannelSwitch, settings } from "./util";
import * as ChannelTabsUtils from "./util";
const contextMenuPatch: NavContextMenuPatchCallback = (children, props: { channel: Channel, messageId?: string; }) =>
@@ -52,6 +52,14 @@ export default definePlugin({
replace: "$1$4$self.render,{currentChannel:$2,children:$3})$5"
}
},
+ // intercept channel navigation to switch/create tabs
+ {
+ find: "transitionToGuild",
+ replacement: {
+ match: /transitionToGuild\(([^,]+),([^)]+)\)/,
+ replace: "$&;$self.handleNavigation($1,$2)"
+ }
+ },
// ctrl click to open in new tab in inbox unread
{
find: ".messageContainer,onKeyDown",
@@ -113,5 +121,14 @@ export default definePlugin({
createTab(tab, false, message.id);
},
+ handleNavigation(guildId: string, channelId: string) {
+ if (!guildId || !channelId) return;
+
+ // wait for discord to update channel data
+ requestAnimationFrame(() => {
+ handleChannelSwitch({ guildId, channelId });
+ });
+ },
+
util: ChannelTabsUtils,
-});
+});
\ No newline at end of file
diff --git a/src/equicordplugins/channelTabs/style.css b/src/equicordplugins/channelTabs/style.css
index 2d4f187ae..b99f4c2e0 100644
--- a/src/equicordplugins/channelTabs/style.css
+++ b/src/equicordplugins/channelTabs/style.css
@@ -145,6 +145,9 @@
width: 12rem;
min-width: 0;
margin-right: 0.25rem;
+ background-color: var(--background-primary);
+ border: 1px solid var(--background-modifier-accent);
+ transition: background-color 0.15s ease;
}
.vc-channeltabs-tab.vc-channeltabs-wider:not(.vc-channeltabs-tab-compact) {
@@ -159,6 +162,7 @@
.vc-channeltabs-tab-selected {
background: var(--bg-overlay-selected);
background-color: var(--background-modifier-selected);
+ border-color: var(--brand-500);
}
/* channel type container */
diff --git a/src/equicordplugins/channelTabs/util/constants.tsx b/src/equicordplugins/channelTabs/util/constants.tsx
index 04e2b078e..7d72f16cc 100644
--- a/src/equicordplugins/channelTabs/util/constants.tsx
+++ b/src/equicordplugins/channelTabs/util/constants.tsx
@@ -71,7 +71,32 @@ export const settings = definePluginSettings({
type: OptionType.BOOLEAN,
default: false,
restartNeeded: false
+ },
+ switchToExistingTab: {
+ type: OptionType.BOOLEAN,
+ description: "Switch to tab if it already exists for the channel you're navigating to",
+ default: false,
+ restartNeeded: false
+ },
+ createNewTabIfNotExists: {
+ type: OptionType.BOOLEAN,
+ description: "Create a new tab if one doesn't exist for the channel you're navigating to",
+ default: false,
+ restartNeeded: false
+ },
+ enableRapidNavigation: {
+ type: OptionType.BOOLEAN,
+ description: "Enable rapid navigation behavior - quickly navigating between channels will replace the current tab instead of creating new ones",
+ default: false,
+ restartNeeded: false
+ },
+ rapidNavigationThreshold: {
+ type: OptionType.SLIDER,
+ description: "Time window (in milliseconds) for rapid navigation. Within this time, new channels replace the current tab instead of creating new ones.",
+ markers: [500, 1000, 1500, 2000, 3000, 5000, 10000],
+ default: 3000,
+ stickToMarkers: false,
}
});
-export const CircleQuestionIcon = findComponentByCodeLazy("10.58l-3.3-3.3a1");
+export const CircleQuestionIcon = findComponentByCodeLazy("10.58l-3.3-3.3a1");
\ No newline at end of file
diff --git a/src/equicordplugins/channelTabs/util/tabs.tsx b/src/equicordplugins/channelTabs/util/tabs.tsx
index 3deb257f1..747734950 100644
--- a/src/equicordplugins/channelTabs/util/tabs.tsx
+++ b/src/equicordplugins/channelTabs/util/tabs.tsx
@@ -128,11 +128,46 @@ export function closeTabsToTheLeft(id: number) {
else update();
}
+let lastNavigationTime = 0;
+
export function handleChannelSwitch(ch: BasicChannelTabsProps) {
const tab = openTabs.find(c => c.id === currentlyOpenTab);
- if (tab === undefined) return logger.error("Couldn't find the currently open channel " + currentlyOpenTab, openTabs);
+ const existingTab = openTabs.find(tab => tab.channelId === ch.channelId && tab.guildId === ch.guildId);
- if (tab.channelId !== ch.channelId) openTabs[openTabs.indexOf(tab)] = { id: tab.id, compact: tab.compact, ...ch };
+ // First check: switch to existing tab if setting enabled and tab exists
+ if (settings.store.switchToExistingTab && existingTab) {
+ moveToTab(existingTab.id);
+ return;
+ }
+
+ // Second check: create new tab if setting enabled
+ if (settings.store.createNewTabIfNotExists) {
+ // Apply rapid navigation logic when creating new tabs
+ const now = Date.now();
+ const isRapidNavigation = now - lastNavigationTime < settings.store.rapidNavigationThreshold;
+ lastNavigationTime = now;
+
+ if (isRapidNavigation && settings.store.enableRapidNavigation) {
+ // Replace current tab content instead of creating new one
+ const currentTab = openTabs.find(t => t.id === currentlyOpenTab);
+ if (currentTab) {
+ currentTab.channelId = ch.channelId;
+ currentTab.guildId = ch.guildId;
+ update();
+ return;
+ }
+ }
+
+ // Create new tab (normal behavior)
+ createTab(ch, true);
+ return;
+ }
+
+ // Default behavior: replace current tab content
+ if (tab && tab.channelId !== ch.channelId) {
+ openTabs[openTabs.indexOf(tab)] = { id: tab.id, compact: tab.compact, ...ch };
+ update();
+ }
}
export function hasClosedTabs() {
@@ -271,4 +306,4 @@ export function useGhostTabs() {
setCount(0);
};
return new Array
(count).fill(
);
-}
+}
\ No newline at end of file
From b27ddc222a43fc5bcc38b5958bfe85cb8b3cdae9 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Wed, 11 Jun 2025 17:01:25 -0400
Subject: [PATCH 010/845] Fix Patches
---
src/equicordplugins/channelTabs/index.tsx | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/equicordplugins/channelTabs/index.tsx b/src/equicordplugins/channelTabs/index.tsx
index f0cc1b4fe..43c41cf14 100644
--- a/src/equicordplugins/channelTabs/index.tsx
+++ b/src/equicordplugins/channelTabs/index.tsx
@@ -54,10 +54,10 @@ export default definePlugin({
},
// intercept channel navigation to switch/create tabs
{
- find: "transitionToGuild",
+ find: "sourceLocationStack,null",
replacement: {
- match: /transitionToGuild\(([^,]+),([^)]+)\)/,
- replace: "$&;$self.handleNavigation($1,$2)"
+ match: /(\i\((\i),(\i),\i,\i\)\{)(.{0,25}"transitionToGuild)/,
+ replace: "$1$self.handleNavigation($2,$3);$4"
}
},
// ctrl click to open in new tab in inbox unread
@@ -86,7 +86,7 @@ export default definePlugin({
},
// prevent issues with the pins/inbox popouts being too tall
{
- find: ".messagesPopoutWrap",
+ find: ".messagesPopoutWrap),style",
replacement: {
match: /\i&&\((\i).maxHeight.{0,5}\)/,
replace: "$&;$1.maxHeight-=$self.containerHeight"
@@ -131,4 +131,4 @@ export default definePlugin({
},
util: ChannelTabsUtils,
-});
\ No newline at end of file
+});
From 7112caaedd80cd9bbb1134f5979bb755d0d92d43 Mon Sep 17 00:00:00 2001
From: Nuckyz <61953774+Nuckyz@users.noreply.github.com>
Date: Wed, 11 Jun 2025 19:07:45 -0300
Subject: [PATCH 011/845] Experiments: Fix toolbar help menu dev icon patch
---
src/plugins/experiments/index.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/plugins/experiments/index.tsx b/src/plugins/experiments/index.tsx
index 2482d051c..967197ad4 100644
--- a/src/plugins/experiments/index.tsx
+++ b/src/plugins/experiments/index.tsx
@@ -81,7 +81,7 @@ export default definePlugin({
},
// Change top right chat toolbar button from the help one to the dev one
{
- find: ".CONTEXTLESS,isActivityPanelMode:",
+ find: '"M9 3v18"',
replacement: {
match: /hasBugReporterAccess:(\i)/,
replace: "_hasBugReporterAccess:$1=true"
From 7f2c4a35660002cbf31df72ad43bff67b7026fc0 Mon Sep 17 00:00:00 2001
From: Nuckyz <61953774+Nuckyz@users.noreply.github.com>
Date: Wed, 11 Jun 2025 19:10:14 -0300
Subject: [PATCH 012/845] Delete Banger plugin ~ Ban modal no longer contains a
gif
Discord removed the gifs displayed in the ban modal, so this plugin serves no purpose anymore.
---
src/plugins/banger/index.ts | 49 -------------------------------------
1 file changed, 49 deletions(-)
delete mode 100644 src/plugins/banger/index.ts
diff --git a/src/plugins/banger/index.ts b/src/plugins/banger/index.ts
deleted file mode 100644
index eed0e1b44..000000000
--- a/src/plugins/banger/index.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Vencord, a modification for Discord's desktop app
- * Copyright (c) 2022 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 .
-*/
-
-import { definePluginSettings } from "@api/Settings";
-import { Devs } from "@utils/constants";
-import definePlugin, { OptionType } from "@utils/types";
-
-const settings = definePluginSettings({
- source: {
- description: "Source to replace ban GIF with (Video or Gif)",
- type: OptionType.STRING,
- default: "https://i.imgur.com/wp5q52C.mp4",
- restartNeeded: true,
- }
-});
-
-export default definePlugin({
- name: "BANger",
- description: "Replaces the GIF in the ban dialogue with a custom one.",
- authors: [Devs.Xinto, Devs.Glitch],
- settings,
- patches: [
- {
- find: "#{intl::jeKpoq::raw}", // BAN_CONFIRM_TITLE
- replacement: {
- match: /src:\i\("?\d+"?\)/g,
- replace: "src:$self.source"
- }
- }
- ],
- get source() {
- return settings.store.source;
- }
-});
From ed5ed4b80a7b3a50858eefef083b385449147486 Mon Sep 17 00:00:00 2001
From: Vending Machine
Date: Thu, 12 Jun 2025 02:19:45 +0200
Subject: [PATCH 013/845] Allow users to manually whitelist Domains for use in
themes (#3476)
---
browser/VencordNativeStub.ts | 1 +
src/VencordNative.ts | 13 ++
src/components/VencordSettings/CloudTab.tsx | 4 +-
src/components/VencordSettings/ThemesTab.tsx | 69 ++++++++--
.../VencordSettings/themesStyles.css | 23 ++++
src/main/{csp.ts => csp/index.ts} | 64 +++++----
src/main/csp/manager.ts | 125 ++++++++++++++++++
src/main/ipcMain.ts | 3 +
src/main/settings.ts | 6 +-
src/shared/IpcEvents.ts | 4 +
src/utils/cloud.tsx | 39 +++++-
src/utils/settingsSync.ts | 8 +-
12 files changed, 313 insertions(+), 46 deletions(-)
rename src/main/{csp.ts => csp/index.ts} (69%)
create mode 100644 src/main/csp/manager.ts
diff --git a/browser/VencordNativeStub.ts b/browser/VencordNativeStub.ts
index 9080f6443..8cb3ff296 100644
--- a/browser/VencordNativeStub.ts
+++ b/browser/VencordNativeStub.ts
@@ -115,4 +115,5 @@ window.VencordNative = {
},
pluginHelpers: {} as any,
+ csp: {} as any,
};
diff --git a/src/VencordNative.ts b/src/VencordNative.ts
index 3bed5a592..faf9b052c 100644
--- a/src/VencordNative.ts
+++ b/src/VencordNative.ts
@@ -5,6 +5,7 @@
*/
import type { Settings } from "@api/Settings";
+import { CspRequestResult } from "@main/csp/manager";
import { PluginIpcMappings } from "@main/ipcPlugins";
import type { UserThemeHeader } from "@main/themes";
import { IpcEvents } from "@shared/IpcEvents";
@@ -73,5 +74,17 @@ export default {
openExternal: (url: string) => invoke(IpcEvents.OPEN_EXTERNAL, url)
},
+ csp: {
+ /**
+ * Note: Only supports full explicit matches, not wildcards.
+ *
+ * If `*.example.com` is allowed, `isDomainAllowed("https://sub.example.com")` will return false.
+ */
+ isDomainAllowed: (url: string, directives: string[]) => invoke(IpcEvents.CSP_IS_DOMAIN_ALLOWED, url, directives),
+ removeOverride: (url: string) => invoke(IpcEvents.CSP_REMOVE_OVERRIDE, url),
+ requestAddOverride: (url: string, directives: string[], callerName: string) =>
+ invoke(IpcEvents.CSP_REQUEST_ADD_OVERRIDE, url, directives, callerName),
+ },
+
pluginHelpers: PluginHelpers
};
diff --git a/src/components/VencordSettings/CloudTab.tsx b/src/components/VencordSettings/CloudTab.tsx
index a13c3f6ca..809d40622 100644
--- a/src/components/VencordSettings/CloudTab.tsx
+++ b/src/components/VencordSettings/CloudTab.tsx
@@ -21,7 +21,7 @@ import { Settings, useSettings } from "@api/Settings";
import { CheckedTextInput } from "@components/CheckedTextInput";
import { Grid } from "@components/Grid";
import { Link } from "@components/Link";
-import { authorizeCloud, cloudLogger, deauthorizeCloud, getCloudAuth, getCloudUrl } from "@utils/cloud";
+import { authorizeCloud, checkCloudUrlCsp, cloudLogger, deauthorizeCloud, getCloudAuth, getCloudUrl } from "@utils/cloud";
import { Margins } from "@utils/margins";
import { deleteCloudSettings, getCloudSettings, putCloudSettings } from "@utils/settingsSync";
import { Alerts, Button, Forms, Switch, Tooltip } from "@webpack/common";
@@ -38,6 +38,8 @@ function validateUrl(url: string) {
}
async function eraseAllData() {
+ if (!await checkCloudUrlCsp()) return;
+
const res = await fetch(new URL("/v1/", getCloudUrl()), {
method: "DELETE",
headers: { Authorization: await getCloudAuth() }
diff --git a/src/components/VencordSettings/ThemesTab.tsx b/src/components/VencordSettings/ThemesTab.tsx
index 0c66ec5db..ceb598986 100644
--- a/src/components/VencordSettings/ThemesTab.tsx
+++ b/src/components/VencordSettings/ThemesTab.tsx
@@ -24,15 +24,15 @@ import { DeleteIcon, FolderIcon, PaintbrushIcon, PencilIcon, PlusIcon, RestartIc
import { Link } from "@components/Link";
import { openPluginModal } from "@components/PluginSettings/PluginModal";
import type { UserThemeHeader } from "@main/themes";
-import { useCspErrors } from "@utils/cspViolations";
+import { CspBlockedUrls, useCspErrors } from "@utils/cspViolations";
import { openInviteModal } from "@utils/discord";
import { Margins } from "@utils/margins";
import { classes } from "@utils/misc";
-import { showItemInFolder } from "@utils/native";
-import { useAwaiter } from "@utils/react";
+import { relaunch, showItemInFolder } from "@utils/native";
+import { useAwaiter, useForceUpdater } from "@utils/react";
import { getStylusWebStoreUrl } from "@utils/web";
import { findLazy } from "@webpack";
-import { Card, Forms, React, showToast, TabBar, TextArea, useEffect, useRef, useState } from "@webpack/common";
+import { Alerts, Button, Card, Forms, React, showToast, TabBar, TextArea, useEffect, useRef, useState } from "@webpack/common";
import type { ComponentType, Ref, SyntheticEvent } from "react";
import Plugins from "~plugins";
@@ -365,22 +365,73 @@ function ThemesTab() {
}
export function CspErrorCard() {
+ if (IS_WEB) return null;
+
const errors = useCspErrors();
+ const forceUpdate = useForceUpdater();
if (!errors.length) return null;
+ const isImgurHtmlDomain = (url: string) => url.startsWith("https://imgur.com/");
+
+ const allowUrl = async (url: string) => {
+ const { origin: baseUrl, hostname } = new URL(url);
+
+ const result = await VencordNative.csp.requestAddOverride(baseUrl, ["connect-src", "img-src", "style-src", "font-src"], "Vencord Themes");
+ if (result !== "ok") return;
+
+ CspBlockedUrls.forEach(url => {
+ if (new URL(url).hostname === hostname) {
+ CspBlockedUrls.delete(url);
+ }
+ });
+
+ forceUpdate();
+
+ Alerts.show({
+ title: "Restart Required",
+ body: "A restart is required to apply this change",
+ confirmText: "Restart now",
+ cancelText: "Later!",
+ onConfirm: relaunch
+ });
+ };
+
+ const hasImgurHtmlDomain = errors.some(isImgurHtmlDomain);
+
return (
Blocked Resources
Some images, styles, or fonts were blocked because they come from disallowed domains.
- Make sure that your themes and custom css only load resources from whitelisted websites, such as GitHub, Imgur and Google Fonts.
+ It is highly recommended to move them to GitHub or Imgur. But you may also allow domains if you fully trust them.
+
+ After allowing a domain, you have to fully close (from tray / task manager) and restart {IS_DISCORD_DESKTOP ? "Discord" : "Vesktop"} to apply the change.
+
Blocked URLs
-
- {errors.map(url => (
- {url}
+
+ {errors.map((url, i) => (
+
+ {i !== 0 &&
}
+
+ {url}
+ allowUrl(url)} disabled={isImgurHtmlDomain(url)}>
+ Allow
+
+
+
))}
-
+
+
+ {hasImgurHtmlDomain && (
+ <>
+
+
+ Imgur links should be direct links in the form of https://i.imgur.com/...
+
+ To obtain a direct link, right-click the image and select "Copy image address".
+ >
+ )}
);
}
diff --git a/src/components/VencordSettings/themesStyles.css b/src/components/VencordSettings/themesStyles.css
index 6038274f8..b10daff31 100644
--- a/src/components/VencordSettings/themesStyles.css
+++ b/src/components/VencordSettings/themesStyles.css
@@ -27,3 +27,26 @@
.vc-settings-theme-author::before {
content: "by ";
}
+
+.vc-settings-csp-list {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.vc-settings-csp-row {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 8px;
+
+
+ & a {
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+ line-height: 1.2em;
+ }
+
+ --custom-button-button-md-height: 26px;
+}
diff --git a/src/main/csp.ts b/src/main/csp/index.ts
similarity index 69%
rename from src/main/csp.ts
rename to src/main/csp/index.ts
index 2faee606e..fefbc774d 100644
--- a/src/main/csp.ts
+++ b/src/main/csp/index.ts
@@ -4,59 +4,63 @@
* SPDX-License-Identifier: GPL-3.0-or-later
*/
+import { NativeSettings } from "@main/settings";
import { session } from "electron";
type PolicyMap = Record;
export const ConnectSrc = ["connect-src"];
-export const MediaSrc = [...ConnectSrc, "img-src", "media-src"];
+export const ImageSrc = [...ConnectSrc, "img-src"];
export const CssSrc = ["style-src", "font-src"];
-export const MediaAndCssSrc = [...MediaSrc, ...CssSrc];
-export const MediaScriptsAndCssSrc = [...MediaAndCssSrc, "script-src", "worker-src"];
+export const ImageAndCssSrc = [...ImageSrc, ...CssSrc];
+export const ImageScriptsAndCssSrc = [...ImageAndCssSrc, "script-src", "worker-src"];
// Plugins can whitelist their own domains by importing this object in their native.ts
// script and just adding to it. But generally, you should just edit this file instead
export const CspPolicies: PolicyMap = {
- "*.github.io": MediaAndCssSrc, // GitHub pages, used by most themes
- "github.com": MediaAndCssSrc, // GitHub content (stuff uploaded to markdown forms), used by most themes
- "raw.githubusercontent.com": MediaAndCssSrc, // GitHub raw, used by some themes
- "*.gitlab.io": MediaAndCssSrc, // GitLab pages, used by some themes
- "gitlab.com": MediaAndCssSrc, // GitLab raw, used by some themes
- "*.codeberg.page": MediaAndCssSrc, // Codeberg pages, used by some themes
- "codeberg.org": MediaAndCssSrc, // Codeberg raw, used by some themes
+ "localhost": ImageAndCssSrc,
+ "127.0.0.1": ImageAndCssSrc,
- "*.githack.com": MediaAndCssSrc, // githack (namely raw.githack.com), used by some themes
- "jsdelivr.net": MediaAndCssSrc, // jsDelivr, used by very few themes
+ "*.github.io": ImageAndCssSrc, // GitHub pages, used by most themes
+ "github.com": ImageAndCssSrc, // GitHub content (stuff uploaded to markdown forms), used by most themes
+ "raw.githubusercontent.com": ImageAndCssSrc, // GitHub raw, used by some themes
+ "*.gitlab.io": ImageAndCssSrc, // GitLab pages, used by some themes
+ "gitlab.com": ImageAndCssSrc, // GitLab raw, used by some themes
+ "*.codeberg.page": ImageAndCssSrc, // Codeberg pages, used by some themes
+ "codeberg.org": ImageAndCssSrc, // Codeberg raw, used by some themes
+
+ "*.githack.com": ImageAndCssSrc, // githack (namely raw.githack.com), used by some themes
+ "jsdelivr.net": ImageAndCssSrc, // jsDelivr, used by very few themes
"fonts.googleapis.com": CssSrc, // Google Fonts, used by many themes
- "i.imgur.com": MediaSrc, // Imgur, used by some themes
- "i.ibb.co": MediaSrc, // ImgBB, used by some themes
- "i.pinimg.com": MediaSrc, // Pinterest, used by some themes
- "*.tenor.com": MediaSrc, // Tenor, used by some themes
- "files.catbox.moe": MediaSrc, // Catbox, used by some themes
+ "i.imgur.com": ImageSrc, // Imgur, used by some themes
+ "i.ibb.co": ImageSrc, // ImgBB, used by some themes
+ "i.pinimg.com": ImageSrc, // Pinterest, used by some themes
+ "*.tenor.com": ImageSrc, // Tenor, used by some themes
+ "files.catbox.moe": ImageAndCssSrc, // Catbox, used by some themes
- "cdn.discordapp.com": MediaAndCssSrc, // Discord CDN, used by Vencord and some themes to load media
- "media.discordapp.net": MediaSrc, // Discord media CDN, possible alternative to Discord CDN
+ "cdn.discordapp.com": ImageAndCssSrc, // Discord CDN, used by Vencord and some themes to load media
+ "media.discordapp.net": ImageSrc, // Discord media CDN, possible alternative to Discord CDN
// CDNs used for some things by Vencord.
// FIXME: we really should not be using CDNs anymore
- "cdnjs.cloudflare.com": MediaScriptsAndCssSrc,
- "cdn.jsdelivr.net": MediaScriptsAndCssSrc,
+ "cdnjs.cloudflare.com": ImageScriptsAndCssSrc,
+ "cdn.jsdelivr.net": ImageScriptsAndCssSrc,
// Function Specific
"api.github.com": ConnectSrc, // used for updating Vencord itself
"ws.audioscrobbler.com": ConnectSrc, // Last.fm API
"translate-pa.googleapis.com": ConnectSrc, // Google Translate API
- "*.vencord.dev": MediaSrc, // VenCloud (api.vencord.dev) and Badges (badges.vencord.dev)
- "manti.vendicated.dev": MediaSrc, // ReviewDB API
+ "*.vencord.dev": ImageSrc, // VenCloud (api.vencord.dev) and Badges (badges.vencord.dev)
+ "manti.vendicated.dev": ImageSrc, // ReviewDB API
"decor.fieryflames.dev": ConnectSrc, // Decor API
- "ugc.decor.fieryflames.dev": MediaSrc, // Decor CDN
+ "ugc.decor.fieryflames.dev": ImageSrc, // Decor CDN
"sponsor.ajay.app": ConnectSrc, // Dearrow API
- "dearrow-thumb.ajay.app": MediaSrc, // Dearrow Thumbnail CDN
- "usrbg.is-hardly.online": MediaSrc, // USRBG API
- "icons.duckduckgo.com": MediaSrc, // DuckDuckGo Favicon API (Reverse Image Search)
+ "dearrow-thumb.ajay.app": ImageSrc, // Dearrow Thumbnail CDN
+ "usrbg.is-hardly.online": ImageSrc, // USRBG API
+ "icons.duckduckgo.com": ImageSrc, // DuckDuckGo Favicon API (Reverse Image Search)
};
const findHeader = (headers: PolicyMap, headerName: Lowercase) => {
@@ -107,6 +111,12 @@ const patchCsp = (headers: PolicyMap) => {
pushDirective(directive, "blob:", "data:", "vencord:");
}
+ for (const [host, directives] of Object.entries(NativeSettings.store.customCspRules)) {
+ for (const directive of directives) {
+ pushDirective(directive, host);
+ }
+ }
+
for (const [host, directives] of Object.entries(CspPolicies)) {
for (const directive of directives) {
pushDirective(directive, host);
diff --git a/src/main/csp/manager.ts b/src/main/csp/manager.ts
new file mode 100644
index 000000000..b8fbbea33
--- /dev/null
+++ b/src/main/csp/manager.ts
@@ -0,0 +1,125 @@
+/*
+ * Vencord, a Discord client mod
+ * Copyright (c) 2025 Vendicated and contributors
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+import { NativeSettings } from "@main/settings";
+import { IpcEvents } from "@shared/IpcEvents";
+import { dialog, ipcMain, IpcMainInvokeEvent } from "electron";
+
+import { CspPolicies, ImageAndCssSrc } from ".";
+
+export type CspRequestResult = "invalid" | "cancelled" | "unchecked" | "ok" | "conflict";
+
+export function registerCspIpcHandlers() {
+ ipcMain.handle(IpcEvents.CSP_REMOVE_OVERRIDE, removeCspRule);
+ ipcMain.handle(IpcEvents.CSP_REQUEST_ADD_OVERRIDE, addCspRule);
+ ipcMain.handle(IpcEvents.CSP_IS_DOMAIN_ALLOWED, isDomainAllowed);
+}
+
+function validate(url: string, directives: string[]) {
+ try {
+ const { hostname } = new URL(url);
+
+ if (/[;'"\\]/.test(hostname)) return false;
+ } catch {
+ return false;
+ }
+
+ if (directives.length === 0) return false;
+ if (directives.some(d => !ImageAndCssSrc.includes(d))) return false;
+
+ return true;
+}
+
+function getMessage(url: string, directives: string[], callerName: string) {
+ const domain = new URL(url).hostname;
+
+ const message = `${callerName} wants to allow connections to ${domain}`;
+
+ let detail =
+ `Unless you recognise and fully trust ${domain}, you should cancel this request!\n\n` +
+ `You will have to fully close and restart ${IS_DISCORD_DESKTOP ? "Discord" : "Vesktop"} for the changes to take effect.`;
+
+ if (directives.length === 1 && directives[0] === "connect-src") {
+ return { message, detail };
+ }
+
+ const contentTypes = directives
+ .filter(type => type !== "connect-src")
+ .map(type => {
+ switch (type) {
+ case "img-src":
+ return "Images";
+ case "style-src":
+ return "CSS & Themes";
+ case "font-src":
+ return "Fonts";
+ default:
+ throw new Error(`Illegal CSP directive: ${type}`);
+ }
+ })
+ .sort()
+ .join(", ");
+
+ detail = `The following types of content will be allowed to load from ${domain}:\n${contentTypes}\n\n${detail}`;
+
+ return { message, detail };
+}
+
+async function addCspRule(_: IpcMainInvokeEvent, url: string, directives: string[], callerName: string): Promise {
+ if (!validate(url, directives)) {
+ return "invalid";
+ }
+
+ const domain = new URL(url).hostname;
+
+ if (domain in NativeSettings.store.customCspRules) {
+ return "conflict";
+ }
+
+ const { checkboxChecked, response } = await dialog.showMessageBox({
+ ...getMessage(url, directives, callerName),
+ type: callerName ? "info" : "warning",
+ title: "Vencord Host Permissions",
+ buttons: ["Cancel", "Allow"],
+ defaultId: 0,
+ cancelId: 0,
+ checkboxLabel: `I fully trust ${domain} and understand the risks of allowing connections to it.`,
+ checkboxChecked: false,
+ });
+
+ if (response !== 1) {
+ return "cancelled";
+ }
+
+ if (!checkboxChecked) {
+ return "unchecked";
+ }
+
+ NativeSettings.store.customCspRules[domain] = directives;
+ return "ok";
+}
+
+function removeCspRule(_: IpcMainInvokeEvent, domain: string) {
+ if (domain in NativeSettings.store.customCspRules) {
+ delete NativeSettings.store.customCspRules[domain];
+ return true;
+ }
+
+ return false;
+}
+
+function isDomainAllowed(_: IpcMainInvokeEvent, url: string, directives: string[]) {
+ try {
+ const domain = new URL(url).hostname;
+
+ const ruleForDomain = CspPolicies[domain] ?? NativeSettings.store.customCspRules[domain];
+ if (!ruleForDomain) return false;
+
+ return directives.every(d => ruleForDomain.includes(d));
+ } catch (e) {
+ return false;
+ }
+}
diff --git a/src/main/ipcMain.ts b/src/main/ipcMain.ts
index 3979a1bca..b9e4099b3 100644
--- a/src/main/ipcMain.ts
+++ b/src/main/ipcMain.ts
@@ -28,12 +28,15 @@ import { FSWatcher, mkdirSync, watch, writeFileSync } from "fs";
import { open, readdir, readFile } from "fs/promises";
import { join, normalize } from "path";
+import { registerCspIpcHandlers } from "./csp/manager";
import { getThemeInfo, stripBOM, UserThemeHeader } from "./themes";
import { ALLOWED_PROTOCOLS, QUICKCSS_PATH, THEMES_DIR } from "./utils/constants";
import { makeLinksOpenExternally } from "./utils/externalLinks";
mkdirSync(THEMES_DIR, { recursive: true });
+registerCspIpcHandlers();
+
export function ensureSafePath(basePath: string, path: string) {
const normalizedBasePath = normalize(basePath + "/");
const newPath = join(basePath, path);
diff --git a/src/main/settings.ts b/src/main/settings.ts
index 3d367a945..ed2f48500 100644
--- a/src/main/settings.ts
+++ b/src/main/settings.ts
@@ -49,16 +49,18 @@ export interface NativeSettings {
[setting: string]: any;
};
};
+ customCspRules: Record;
}
const DefaultNativeSettings: NativeSettings = {
- plugins: {}
+ plugins: {},
+ customCspRules: {}
};
const nativeSettings = readSettings("native", NATIVE_SETTINGS_FILE);
mergeDefaults(nativeSettings, DefaultNativeSettings);
-export const NativeSettings = new SettingsStore(nativeSettings);
+export const NativeSettings = new SettingsStore(nativeSettings as NativeSettings);
NativeSettings.addGlobalChangeListener(() => {
try {
diff --git a/src/shared/IpcEvents.ts b/src/shared/IpcEvents.ts
index 2027df9cf..914a0a9f1 100644
--- a/src/shared/IpcEvents.ts
+++ b/src/shared/IpcEvents.ts
@@ -42,4 +42,8 @@ export const enum IpcEvents {
OPEN_IN_APP__RESOLVE_REDIRECT = "VencordOIAResolveRedirect",
VOICE_MESSAGES_READ_RECORDING = "VencordVMReadRecording",
+
+ CSP_IS_DOMAIN_ALLOWED = "VencordCspIsDomainAllowed",
+ CSP_REMOVE_OVERRIDE = "VencordCspRemoveOverride",
+ CSP_REQUEST_ADD_OVERRIDE = "VencordCspRequestAddOverride",
}
diff --git a/src/utils/cloud.tsx b/src/utils/cloud.tsx
index 508b1c7ef..3b482d4d8 100644
--- a/src/utils/cloud.tsx
+++ b/src/utils/cloud.tsx
@@ -19,15 +19,40 @@
import * as DataStore from "@api/DataStore";
import { showNotification } from "@api/Notifications";
import { Settings } from "@api/Settings";
-import { OAuth2AuthorizeModal, UserStore } from "@webpack/common";
+import { Alerts, OAuth2AuthorizeModal, UserStore } from "@webpack/common";
import { Logger } from "./Logger";
import { openModal } from "./modal";
+import { relaunch } from "./native";
export const cloudLogger = new Logger("Cloud", "#39b7e0");
-export const getCloudUrl = () => new URL(Settings.cloud.url);
-const cloudUrlOrigin = () => getCloudUrl().origin;
+export const getCloudUrl = () => new URL(Settings.cloud.url);
+const getCloudUrlOrigin = () => getCloudUrl().origin;
+
+export async function checkCloudUrlCsp() {
+ if (IS_WEB) return true;
+
+ const { host } = getCloudUrl();
+ if (host === "api.vencord.dev") return true;
+
+ if (await VencordNative.csp.isDomainAllowed(Settings.cloud.url, ["connect-src"])) {
+ return true;
+ }
+
+ const res = await VencordNative.csp.requestAddOverride(Settings.cloud.url, ["connect-src"], "Cloud Sync");
+ if (res === "ok") {
+ Alerts.show({
+ title: "Cloud Integration enabled",
+ body: `${host} has been added to the whitelist. Please restart the app for the changes to take effect.`,
+ confirmText: "Restart now",
+ cancelText: "Later!",
+ onConfirm: relaunch
+ });
+ }
+ return false;
+}
+
const getUserId = () => {
const id = UserStore.getCurrentUser()?.id;
if (!id) throw new Error("User not yet logged in");
@@ -37,7 +62,7 @@ const getUserId = () => {
export async function getAuthorization() {
const secrets = await DataStore.get>("Vencord_cloudSecret") ?? {};
- const origin = cloudUrlOrigin();
+ const origin = getCloudUrlOrigin();
// we need to migrate from the old format here
if (secrets[origin]) {
@@ -59,7 +84,7 @@ export async function getAuthorization() {
async function setAuthorization(secret: string) {
await DataStore.update>("Vencord_cloudSecret", secrets => {
secrets ??= {};
- secrets[`${cloudUrlOrigin()}:${getUserId()}`] = secret;
+ secrets[`${getCloudUrlOrigin()}:${getUserId()}`] = secret;
return secrets;
});
}
@@ -67,7 +92,7 @@ async function setAuthorization(secret: string) {
export async function deauthorizeCloud() {
await DataStore.update>("Vencord_cloudSecret", secrets => {
secrets ??= {};
- delete secrets[`${cloudUrlOrigin()}:${getUserId()}`];
+ delete secrets[`${getCloudUrlOrigin()}:${getUserId()}`];
return secrets;
});
}
@@ -78,6 +103,8 @@ export async function authorizeCloud() {
return;
}
+ if (!await checkCloudUrlCsp()) return;
+
try {
const oauthConfiguration = await fetch(new URL("/v1/oauth/settings", getCloudUrl()));
var { clientId, redirectUri } = await oauthConfiguration.json();
diff --git a/src/utils/settingsSync.ts b/src/utils/settingsSync.ts
index 6ec3e527a..c711aacd5 100644
--- a/src/utils/settingsSync.ts
+++ b/src/utils/settingsSync.ts
@@ -21,7 +21,7 @@ import { PlainSettings, Settings } from "@api/Settings";
import { moment, Toasts } from "@webpack/common";
import { deflateSync, inflateSync } from "fflate";
-import { getCloudAuth, getCloudUrl } from "./cloud";
+import { checkCloudUrlCsp, getCloudAuth, getCloudUrl } from "./cloud";
import { Logger } from "./Logger";
import { relaunch } from "./native";
import { chooseFile, saveFile } from "./web";
@@ -115,6 +115,8 @@ const cloudSettingsLogger = new Logger("Cloud:Settings", "#39b7e0");
export async function putCloudSettings(manual?: boolean) {
const settings = await exportSettings({ minify: true });
+ if (!await checkCloudUrlCsp()) return;
+
try {
const res = await fetch(new URL("/v1/settings", getCloudUrl()), {
method: "PUT",
@@ -159,6 +161,8 @@ export async function putCloudSettings(manual?: boolean) {
}
export async function getCloudSettings(shouldNotify = true, force = false) {
+ if (!await checkCloudUrlCsp()) return;
+
try {
const res = await fetch(new URL("/v1/settings", getCloudUrl()), {
method: "GET",
@@ -248,6 +252,8 @@ export async function getCloudSettings(shouldNotify = true, force = false) {
}
export async function deleteCloudSettings() {
+ if (!await checkCloudUrlCsp()) return;
+
try {
const res = await fetch(new URL("/v1/settings", getCloudUrl()), {
method: "DELETE",
From a366693e96bb67ef76d705f737458b3e58d624cd Mon Sep 17 00:00:00 2001
From: Randomuser8219 <168323856+Randomuser8219@users.noreply.github.com>
Date: Wed, 11 Jun 2025 17:24:24 -0700
Subject: [PATCH 014/845] ServerInfo: rename "Nitro Boosts" -> "Server Boosts"
(#3364)
---
src/plugins/serverInfo/GuildInfoModal.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/plugins/serverInfo/GuildInfoModal.tsx b/src/plugins/serverInfo/GuildInfoModal.tsx
index 0f08af59a..60401b716 100644
--- a/src/plugins/serverInfo/GuildInfoModal.tsx
+++ b/src/plugins/serverInfo/GuildInfoModal.tsx
@@ -198,7 +198,7 @@ function ServerInfoTab({ guild }: GuildProps) {
"Vanity Link": guild.vanityURLCode ? ({`discord.gg/${guild.vanityURLCode}`} ) : "-", // Making the anchor href valid would cause Discord to reload
"Preferred Locale": guild.preferredLocale || "-",
"Verification Level": ["None", "Low", "Medium", "High", "Highest"][guild.verificationLevel] || "?",
- "Nitro Boosts": `${guild.premiumSubscriberCount ?? 0} (Level ${guild.premiumTier ?? 0})`,
+ "Server Boosts": `${guild.premiumSubscriberCount ?? 0} (Level ${guild.premiumTier ?? 0})`,
"Channels": GuildChannelStore.getChannels(guild.id)?.count - 1 || "?", // - null category
"Roles": Object.keys(GuildStore.getRoles(guild.id)).length - 1, // - @everyone
};
From b35b72c066710943bc4569d4e5791fb758559b11 Mon Sep 17 00:00:00 2001
From: T1ckbase <146760065+T1ckbase@users.noreply.github.com>
Date: Thu, 12 Jun 2025 08:29:50 +0800
Subject: [PATCH 015/845] Translate: Make translation more readable (#3252)
---
src/plugins/translate/TranslationAccessory.tsx | 2 +-
src/plugins/translate/styles.css | 2 ++
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/plugins/translate/TranslationAccessory.tsx b/src/plugins/translate/TranslationAccessory.tsx
index 9b6393cc9..db9461d8f 100644
--- a/src/plugins/translate/TranslationAccessory.tsx
+++ b/src/plugins/translate/TranslationAccessory.tsx
@@ -57,7 +57,7 @@ export function TranslationAccessory({ message }: { message: Message; }) {
{Parser.parse(translation.text)}
- {" "}
+
(translated from {translation.sourceLanguage} - setTranslation(undefined)} />)
);
diff --git a/src/plugins/translate/styles.css b/src/plugins/translate/styles.css
index c07c9e362..33a1fc851 100644
--- a/src/plugins/translate/styles.css
+++ b/src/plugins/translate/styles.css
@@ -15,6 +15,8 @@
margin-top: 0.5em;
font-style: italic;
font-weight: 400;
+ line-height: 1.2rem;
+ white-space: break-spaces;
}
.vc-trans-accessory-icon {
From 15c1af2b6b39edeb6cfbe5f8f7ddfa0450e60dc6 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Thu, 12 Jun 2025 02:06:17 -0400
Subject: [PATCH 016/845] Fixes
---
src/equicordplugins/clientSideBlock/index.tsx | 43 ++++++++++++++++---
src/plugins/implicitRelationships/index.ts | 2 +-
2 files changed, 38 insertions(+), 7 deletions(-)
diff --git a/src/equicordplugins/clientSideBlock/index.tsx b/src/equicordplugins/clientSideBlock/index.tsx
index 279ef9589..cf6415bc5 100644
--- a/src/equicordplugins/clientSideBlock/index.tsx
+++ b/src/equicordplugins/clientSideBlock/index.tsx
@@ -206,11 +206,17 @@ export default definePlugin({
},
// active now list
{
- find: "getUserAffinitiesUserIds(){",
- replacement: {
- match: /return (\i.affinityUserIds)/,
- replace: "return new Set(Array.from($1).filter(id => !$self.shouldHideUser(id)))"
- }
+ find: "NOW_PLAYING_CARD_HOVERED,",
+ replacement: [
+ {
+ match: /(\{party:)(\i)(.*?\}=\i)/,
+ replace: "$1eq_$2$3,$2=$self.partyFilterIgnoredUsers(eq_$2)",
+ },
+ {
+ match: /\{party:(\i).*,\i=\i\(\)\(\i,\i\);/,
+ replace: "$&if($self.shoudBeNull($1)){return null;}"
+ }
+ ]
},
// mutual friends list in user profile
{
@@ -220,5 +226,30 @@ export default definePlugin({
replace: "$1if($2 != undefined) return $2.filter(u => !$self.shouldHideUser(u.key))"
}
}
- ]
+ ],
+ partyFilterIgnoredUsers,
+ shoudBeNull
});
+
+// From https://github.com/Vendicated/Vencord/blob/29060f9ec9359a036fa83e61b5378a19789481dd/src/plugins/HideInActiveNow/index.ts
+
+function partyFilterIgnoredUsers(party) {
+ const filteredPartyMembers = party.partiedMembers.filter(user => shouldHideUser(user));
+ const filteredPartyMembersLength = filteredPartyMembers.length;
+ if (filteredPartyMembersLength === 0) return { ...party, partiedMembers: [] };
+
+ const filteredParty = {
+ ...party,
+ partiedMembers: filteredPartyMembers,
+ currentActivities: party.currentActivities,
+ priorityMembers: party.priorityMembers,
+ voiceChannels: party.voiceChannels
+ };
+ return filteredParty;
+}
+
+function shoudBeNull(party) {
+ if (!party) return true;
+ if (party.partiedMembers.length === 0) return true;
+ return false;
+}
diff --git a/src/plugins/implicitRelationships/index.ts b/src/plugins/implicitRelationships/index.ts
index 13c12ed94..9bd428e02 100644
--- a/src/plugins/implicitRelationships/index.ts
+++ b/src/plugins/implicitRelationships/index.ts
@@ -23,7 +23,7 @@ import { findStoreLazy } from "@webpack";
import { Constants, FluxDispatcher, GuildStore, RelationshipStore, RestAPI, SnowflakeUtils, UserStore } from "@webpack/common";
import { Settings } from "Vencord";
-const UserAffinitiesStore = findStoreLazy("UserAffinitiesStore");
+const UserAffinitiesStore = findStoreLazy("UserAffinitiesV2Store");
export default definePlugin({
name: "ImplicitRelationships",
From c67b87ea4d87b0681fab9b262e12e75034d21a3c Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Thu, 12 Jun 2025 02:11:44 -0400
Subject: [PATCH 017/845] Update ThemesTab
---
src/components/ThemeSettings/ThemesTab.tsx | 83 ++++++++++++++++++-
src/equicordplugins/clientSideBlock/index.tsx | 4 +-
2 files changed, 82 insertions(+), 5 deletions(-)
diff --git a/src/components/ThemeSettings/ThemesTab.tsx b/src/components/ThemeSettings/ThemesTab.tsx
index dc9dc7f4c..c65a30306 100644
--- a/src/components/ThemeSettings/ThemesTab.tsx
+++ b/src/components/ThemeSettings/ThemesTab.tsx
@@ -20,6 +20,7 @@ import "./themesStyles.css";
import { Settings, useSettings } from "@api/Settings";
import { classNameFactory } from "@api/Styles";
+import { ErrorCard } from "@components/ErrorCard";
import { Flex } from "@components/Flex";
import { CogWheel, DeleteIcon, FolderIcon, PaintbrushIcon, PencilIcon, PluginIcon, PlusIcon, RestartIcon } from "@components/Icons";
import { Link } from "@components/Link";
@@ -27,16 +28,19 @@ import { openPluginModal } from "@components/PluginSettings/PluginModal";
import { AddonCard } from "@components/VencordSettings/AddonCard";
import { QuickAction, QuickActionCard } from "@components/VencordSettings/quickActions";
import { SettingsTab, wrapTab } from "@components/VencordSettings/shared";
+import { CspBlockedUrls, useCspErrors } from "@utils/cspViolations";
import { openInviteModal } from "@utils/discord";
+import { Margins } from "@utils/margins";
+import { classes } from "@utils/misc";
import { openModal } from "@utils/modal";
-import { showItemInFolder } from "@utils/native";
-import { useAwaiter } from "@utils/react";
+import { relaunch, showItemInFolder } from "@utils/native";
+import { useAwaiter, useForceUpdater } from "@utils/react";
import type { ThemeHeader } from "@utils/themes";
import { getThemeInfo, stripBOM, type UserThemeHeader } from "@utils/themes/bd";
import { usercssParse } from "@utils/themes/usercss";
import { getStylusWebStoreUrl } from "@utils/web";
import { findLazy } from "@webpack";
-import { Button, Card, Forms, React, showToast, TabBar, TextInput, Tooltip, useEffect, useMemo, useRef, useState } from "@webpack/common";
+import { Alerts, Button, Card, Forms, React, showToast, TabBar, TextInput, Tooltip, useEffect, useMemo, useRef, useState } from "@webpack/common";
import type { ComponentType, Ref, SyntheticEvent } from "react";
import type { UserstyleHeader } from "usercss-meta";
@@ -497,12 +501,85 @@ function ThemesTab() {
+
{currentTab === ThemeTab.LOCAL && }
{currentTab === ThemeTab.ONLINE && }
);
}
+export function CspErrorCard() {
+ if (IS_WEB) return null;
+
+ const errors = useCspErrors();
+ const forceUpdate = useForceUpdater();
+
+ if (!errors.length) return null;
+
+ const isImgurHtmlDomain = (url: string) => url.startsWith("https://imgur.com/");
+
+ const allowUrl = async (url: string) => {
+ const { origin: baseUrl, hostname } = new URL(url);
+
+ const result = await VencordNative.csp.requestAddOverride(baseUrl, ["connect-src", "img-src", "style-src", "font-src"], "Vencord Themes");
+ if (result !== "ok") return;
+
+ CspBlockedUrls.forEach(url => {
+ if (new URL(url).hostname === hostname) {
+ CspBlockedUrls.delete(url);
+ }
+ });
+
+ forceUpdate();
+
+ Alerts.show({
+ title: "Restart Required",
+ body: "A restart is required to apply this change",
+ confirmText: "Restart now",
+ cancelText: "Later!",
+ onConfirm: relaunch
+ });
+ };
+
+ const hasImgurHtmlDomain = errors.some(isImgurHtmlDomain);
+
+ return (
+
+ Blocked Resources
+ Some images, styles, or fonts were blocked because they come from disallowed domains.
+ It is highly recommended to move them to GitHub or Imgur. But you may also allow domains if you fully trust them.
+
+ After allowing a domain, you have to fully close (from tray / task manager) and restart {IS_DISCORD_DESKTOP ? "Discord" : IS_EQUIBOP ? "Equibop" : "Vesktop"} to apply the change.
+
+
+ Blocked URLs
+
+ {errors.map((url, i) => (
+
+ {i !== 0 &&
}
+
+ {url}
+ allowUrl(url)} disabled={isImgurHtmlDomain(url)}>
+ Allow
+
+
+
+ ))}
+
+
+ {hasImgurHtmlDomain && (
+ <>
+
+
+ Imgur links should be direct links in the form of https://i.imgur.com/...
+
+ To obtain a direct link, right-click the image and select "Copy image address".
+ >
+ )}
+
+ );
+}
+
function UserscriptThemesTab() {
return (
diff --git a/src/equicordplugins/clientSideBlock/index.tsx b/src/equicordplugins/clientSideBlock/index.tsx
index cf6415bc5..8a6a49f55 100644
--- a/src/equicordplugins/clientSideBlock/index.tsx
+++ b/src/equicordplugins/clientSideBlock/index.tsx
@@ -209,11 +209,11 @@ export default definePlugin({
find: "NOW_PLAYING_CARD_HOVERED,",
replacement: [
{
- match: /(\{party:)(\i)(.*?\}=\i)/,
+ match: /(let\{party:)(\i)(.*?\}=\i)/,
replace: "$1eq_$2$3,$2=$self.partyFilterIgnoredUsers(eq_$2)",
},
{
- match: /\{party:(\i).*,\i=\i\(\)\(\i,\i\);/,
+ match: /let\{party:(\i).*,\i=\i\(\)\(\i,\i\);/,
replace: "$&if($self.shoudBeNull($1)){return null;}"
}
]
From 6f59fd3a92ba752402c153dbba0af3823e4560a8 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Thu, 12 Jun 2025 02:15:41 -0400
Subject: [PATCH 018/845] Fix Import
---
src/equicordplugins/equicordHelper/native.ts | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/equicordplugins/equicordHelper/native.ts b/src/equicordplugins/equicordHelper/native.ts
index 84887c48e..d46407089 100644
--- a/src/equicordplugins/equicordHelper/native.ts
+++ b/src/equicordplugins/equicordHelper/native.ts
@@ -4,6 +4,6 @@
* SPDX-License-Identifier: GPL-3.0-or-later
*/
-import { CspPolicies, MediaScriptsAndCssSrc } from "@main/csp";
+import { CspPolicies, ImageScriptsAndCssSrc } from "@main/csp";
-CspPolicies["*"] = MediaScriptsAndCssSrc;
+CspPolicies["*"] = ImageScriptsAndCssSrc;
From fed063f5c498e24201b30052f9979310024e33df Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Thu, 12 Jun 2025 02:19:28 -0400
Subject: [PATCH 019/845] Make BetterBanReasons Work On Stable
---
src/equicordplugins/betterBanReasons/index.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/equicordplugins/betterBanReasons/index.tsx b/src/equicordplugins/betterBanReasons/index.tsx
index d638c4529..48a7e83ec 100644
--- a/src/equicordplugins/betterBanReasons/index.tsx
+++ b/src/equicordplugins/betterBanReasons/index.tsx
@@ -82,7 +82,7 @@ export default definePlugin({
replace: "$self.getReasons()"
},
{
- match: /useState\(null\)(?=.{0,200}targetUserId:)/,
+ match: /useState\((null|0)\)(?=.{0,200}targetUserId:)/,
replace: "useState($self.getDefaultState())"
}]
}
From e5601e7d56a631414a415bb9bb8f9b87a8d79e38 Mon Sep 17 00:00:00 2001
From: nyx <60797172+verticalsync@users.noreply.github.com>
Date: Thu, 12 Jun 2025 12:40:56 +0300
Subject: [PATCH 020/845] feat(cloud): always allow cloud.equicord.org
---
src/main/csp/index.ts | 1 +
src/utils/cloud.tsx | 1 +
2 files changed, 2 insertions(+)
diff --git a/src/main/csp/index.ts b/src/main/csp/index.ts
index ca17a9bb3..8e7b10e6e 100644
--- a/src/main/csp/index.ts
+++ b/src/main/csp/index.ts
@@ -54,6 +54,7 @@ export const CspPolicies: PolicyMap = {
"ws.audioscrobbler.com": ConnectSrc, // Last.fm API
"translate-pa.googleapis.com": ConnectSrc, // Google Translate API
"*.vencord.dev": ImageSrc, // VenCloud (api.vencord.dev) and Badges (badges.vencord.dev)
+ "cloud.equicord.org": ConnectSrc, // EquiCLoud (cloud.equicord.org)
"manti.vendicated.dev": ImageSrc, // ReviewDB API
"decor.fieryflames.dev": ConnectSrc, // Decor API
"ugc.decor.fieryflames.dev": ImageSrc, // Decor CDN
diff --git a/src/utils/cloud.tsx b/src/utils/cloud.tsx
index 3b482d4d8..6e0c49f7f 100644
--- a/src/utils/cloud.tsx
+++ b/src/utils/cloud.tsx
@@ -35,6 +35,7 @@ export async function checkCloudUrlCsp() {
const { host } = getCloudUrl();
if (host === "api.vencord.dev") return true;
+ if (host === "cloud.equicord.org") return true;
if (await VencordNative.csp.isDomainAllowed(Settings.cloud.url, ["connect-src"])) {
return true;
From df477d0cd0b64d29556941edc0ac564a88813c18 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Thu, 12 Jun 2025 08:21:57 -0400
Subject: [PATCH 021/845] Make WebContextMenus AddBack Platform Dependent
Enabled
---
src/main/csp/index.ts | 1 -
src/plugins/webContextMenus.web/index.ts | 2 +-
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/main/csp/index.ts b/src/main/csp/index.ts
index 8e7b10e6e..ca17a9bb3 100644
--- a/src/main/csp/index.ts
+++ b/src/main/csp/index.ts
@@ -54,7 +54,6 @@ export const CspPolicies: PolicyMap = {
"ws.audioscrobbler.com": ConnectSrc, // Last.fm API
"translate-pa.googleapis.com": ConnectSrc, // Google Translate API
"*.vencord.dev": ImageSrc, // VenCloud (api.vencord.dev) and Badges (badges.vencord.dev)
- "cloud.equicord.org": ConnectSrc, // EquiCLoud (cloud.equicord.org)
"manti.vendicated.dev": ImageSrc, // ReviewDB API
"decor.fieryflames.dev": ConnectSrc, // Decor API
"ugc.decor.fieryflames.dev": ImageSrc, // Decor CDN
diff --git a/src/plugins/webContextMenus.web/index.ts b/src/plugins/webContextMenus.web/index.ts
index 8966e8b1c..d1d6a59af 100644
--- a/src/plugins/webContextMenus.web/index.ts
+++ b/src/plugins/webContextMenus.web/index.ts
@@ -53,7 +53,7 @@ const settings = definePluginSettings({
addBack: {
type: OptionType.BOOLEAN,
description: "Add back the Discord context menus for images, links and the chat input bar",
- default: true,
+ default: hideSetting,
restartNeeded: true,
// Web slate menu has proper spellcheck suggestions and image context menu is also pretty good,
// so disable this by default. Vesktop just doesn't, so we force enable it there
From 5c981b6c694eab0331408e72abb6982016b19bed Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Thu, 12 Jun 2025 11:17:08 -0400
Subject: [PATCH 022/845] Update Token
---
.github/workflows/nixosBuild.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/nixosBuild.yml b/.github/workflows/nixosBuild.yml
index 1be05c753..934b73eb7 100644
--- a/.github/workflows/nixosBuild.yml
+++ b/.github/workflows/nixosBuild.yml
@@ -5,7 +5,7 @@ on:
- cron: 0 0 * * *
env:
FORCE_COLOR: true
- GITHUB_TOKEN: ${{ secrets.ETOKEN }}
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
permissions: write-all
From ade1454c620d618d9bed59c7cee1a4e1d7a6aea1 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Fri, 13 Jun 2025 18:00:12 -0400
Subject: [PATCH 023/845] Fix Patch
---
src/equicordplugins/moreStickers/index.tsx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/equicordplugins/moreStickers/index.tsx b/src/equicordplugins/moreStickers/index.tsx
index 08796396e..5eada01b9 100644
--- a/src/equicordplugins/moreStickers/index.tsx
+++ b/src/equicordplugins/moreStickers/index.tsx
@@ -37,8 +37,8 @@ export default definePlugin({
match: /(children:\(0,\i\.jsx\)\()(.{0,10})({innerClassName.{10,30}\.stickerButton)/,
replace: "$1arguments[0]?.stickersType?$self.stickerButton:$2$3"
}, {
- match: /(\i=)((\i\.useCallback\(\(\)=>\{\(.*?\)\().*?\.STICKER,(\i.{0,10}));/,
- replace: '$1arguments[0]?.stickersType?$3"stickers+",$4:$2;'
+ match: /(\i=)((\i\.useCallback\(\(\)=>\{\(.*?\)\().*?\.STICKER,(\i.{0,25}\]\)))/,
+ replace: '$1arguments[0]?.stickersType?$3"stickers+",$4:$2'
}, {
match: /(\i)=((\i)===\i\.\i\.STICKER)/,
replace: "$1=arguments[0].stickersType?($3===arguments[0].stickersType):($2)"
From 2a398985cf2e704f086193e868ca355da6c96685 Mon Sep 17 00:00:00 2001
From: Vendicated
Date: Sat, 14 Jun 2025 00:55:14 +0200
Subject: [PATCH 024/845] fix: correctly allow resources from localhost
---
src/components/VencordSettings/ThemesTab.tsx | 4 ++--
src/main/csp/index.ts | 6 ++++--
src/main/csp/manager.ts | 10 +++++-----
3 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/src/components/VencordSettings/ThemesTab.tsx b/src/components/VencordSettings/ThemesTab.tsx
index ceb598986..e3fbe53a7 100644
--- a/src/components/VencordSettings/ThemesTab.tsx
+++ b/src/components/VencordSettings/ThemesTab.tsx
@@ -375,13 +375,13 @@ export function CspErrorCard() {
const isImgurHtmlDomain = (url: string) => url.startsWith("https://imgur.com/");
const allowUrl = async (url: string) => {
- const { origin: baseUrl, hostname } = new URL(url);
+ const { origin: baseUrl, host } = new URL(url);
const result = await VencordNative.csp.requestAddOverride(baseUrl, ["connect-src", "img-src", "style-src", "font-src"], "Vencord Themes");
if (result !== "ok") return;
CspBlockedUrls.forEach(url => {
- if (new URL(url).hostname === hostname) {
+ if (new URL(url).host === host) {
CspBlockedUrls.delete(url);
}
});
diff --git a/src/main/csp/index.ts b/src/main/csp/index.ts
index fefbc774d..c4192f4b7 100644
--- a/src/main/csp/index.ts
+++ b/src/main/csp/index.ts
@@ -19,8 +19,10 @@ export const ImageScriptsAndCssSrc = [...ImageAndCssSrc, "script-src", "worker-s
// script and just adding to it. But generally, you should just edit this file instead
export const CspPolicies: PolicyMap = {
- "localhost": ImageAndCssSrc,
- "127.0.0.1": ImageAndCssSrc,
+ "http://localhost:*": ImageAndCssSrc,
+ "http://127.0.0.1:*": ImageAndCssSrc,
+ "localhost:*": ImageAndCssSrc,
+ "127.0.0.1:*": ImageAndCssSrc,
"*.github.io": ImageAndCssSrc, // GitHub pages, used by most themes
"github.com": ImageAndCssSrc, // GitHub content (stuff uploaded to markdown forms), used by most themes
diff --git a/src/main/csp/manager.ts b/src/main/csp/manager.ts
index b8fbbea33..e6b1a0e31 100644
--- a/src/main/csp/manager.ts
+++ b/src/main/csp/manager.ts
@@ -20,9 +20,9 @@ export function registerCspIpcHandlers() {
function validate(url: string, directives: string[]) {
try {
- const { hostname } = new URL(url);
+ const { host } = new URL(url);
- if (/[;'"\\]/.test(hostname)) return false;
+ if (/[;'"\\]/.test(host)) return false;
} catch {
return false;
}
@@ -34,7 +34,7 @@ function validate(url: string, directives: string[]) {
}
function getMessage(url: string, directives: string[], callerName: string) {
- const domain = new URL(url).hostname;
+ const domain = new URL(url).host;
const message = `${callerName} wants to allow connections to ${domain}`;
@@ -73,7 +73,7 @@ async function addCspRule(_: IpcMainInvokeEvent, url: string, directives: string
return "invalid";
}
- const domain = new URL(url).hostname;
+ const domain = new URL(url).host;
if (domain in NativeSettings.store.customCspRules) {
return "conflict";
@@ -113,7 +113,7 @@ function removeCspRule(_: IpcMainInvokeEvent, domain: string) {
function isDomainAllowed(_: IpcMainInvokeEvent, url: string, directives: string[]) {
try {
- const domain = new URL(url).hostname;
+ const domain = new URL(url).host;
const ruleForDomain = CspPolicies[domain] ?? NativeSettings.store.customCspRules[domain];
if (!ruleForDomain) return false;
From f614b92a7aa95a628aa9098602ef2bb83bdcb571 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Sat, 14 Jun 2025 11:10:51 -0400
Subject: [PATCH 025/845] ClientSideBlock: Fix Active Now
---
src/equicordplugins/clientSideBlock/index.tsx | 50 ++++++-------------
1 file changed, 14 insertions(+), 36 deletions(-)
diff --git a/src/equicordplugins/clientSideBlock/index.tsx b/src/equicordplugins/clientSideBlock/index.tsx
index 8a6a49f55..722701def 100644
--- a/src/equicordplugins/clientSideBlock/index.tsx
+++ b/src/equicordplugins/clientSideBlock/index.tsx
@@ -206,17 +206,11 @@ export default definePlugin({
},
// active now list
{
- find: "NOW_PLAYING_CARD_HOVERED,",
- replacement: [
- {
- match: /(let\{party:)(\i)(.*?\}=\i)/,
- replace: "$1eq_$2$3,$2=$self.partyFilterIgnoredUsers(eq_$2)",
- },
- {
- match: /let\{party:(\i).*,\i=\i\(\)\(\i,\i\);/,
- replace: "$&if($self.shoudBeNull($1)){return null;}"
- }
- ]
+ find: "ACTIVE_NOW_COLUMN)",
+ replacement: {
+ match: /(\i\.\i),\{\}\)\]/,
+ replace: '"div",{children:$self.activeNowView($1())})]'
+ }
},
// mutual friends list in user profile
{
@@ -227,29 +221,13 @@ export default definePlugin({
}
}
],
- partyFilterIgnoredUsers,
- shoudBeNull
+ activeNowView(cards) {
+ if (!Array.isArray(cards)) return cards;
+
+ return cards.filter(card => {
+ if (!card?.key) return false;
+ const newKey = card.key.match(/(?:user-|party-spotify:)(.+)/)?.[1];
+ return this.shouldHideUser(newKey) ? null : card;
+ });
+ }
});
-
-// From https://github.com/Vendicated/Vencord/blob/29060f9ec9359a036fa83e61b5378a19789481dd/src/plugins/HideInActiveNow/index.ts
-
-function partyFilterIgnoredUsers(party) {
- const filteredPartyMembers = party.partiedMembers.filter(user => shouldHideUser(user));
- const filteredPartyMembersLength = filteredPartyMembers.length;
- if (filteredPartyMembersLength === 0) return { ...party, partiedMembers: [] };
-
- const filteredParty = {
- ...party,
- partiedMembers: filteredPartyMembers,
- currentActivities: party.currentActivities,
- priorityMembers: party.priorityMembers,
- voiceChannels: party.voiceChannels
- };
- return filteredParty;
-}
-
-function shoudBeNull(party) {
- if (!party) return true;
- if (party.partiedMembers.length === 0) return true;
- return false;
-}
From 78d3330ccf509b03cb3de2e790092b9d0707984e Mon Sep 17 00:00:00 2001
From: Vendicated
Date: Sat, 14 Jun 2025 18:51:40 +0200
Subject: [PATCH 026/845] make Open Themes/Settings folder properly open the
folder
---
browser/VencordNativeStub.ts | 5 ++++-
src/VencordNative.ts | 4 ++++
src/components/VencordSettings/ThemesTab.tsx | 4 ++--
src/components/VencordSettings/VencordTab.tsx | 8 ++------
src/main/ipcMain.ts | 4 +++-
src/shared/IpcEvents.ts | 3 +++
6 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/browser/VencordNativeStub.ts b/browser/VencordNativeStub.ts
index 8cb3ff296..ce14d28db 100644
--- a/browser/VencordNativeStub.ts
+++ b/browser/VencordNativeStub.ts
@@ -48,6 +48,8 @@ window.VencordNative = {
),
getThemeData: (fileName: string) => DataStore.get(fileName, themeStore),
getSystemValues: async () => ({}),
+
+ openFolder: async () => Promise.reject("themes:openFolder is not supported on web"),
},
native: {
@@ -111,7 +113,8 @@ window.VencordNative = {
}
},
set: async (s: Settings) => localStorage.setItem("VencordSettings", JSON.stringify(s)),
- getSettingsDir: async () => "LocalStorage"
+ getSettingsDir: async () => "LocalStorage",
+ openFolder: async () => Promise.reject("settings:openFolder is not supported on web"),
},
pluginHelpers: {} as any,
diff --git a/src/VencordNative.ts b/src/VencordNative.ts
index faf9b052c..5c581ccfc 100644
--- a/src/VencordNative.ts
+++ b/src/VencordNative.ts
@@ -38,6 +38,8 @@ export default {
getThemesList: () => invoke>(IpcEvents.GET_THEMES_LIST),
getThemeData: (fileName: string) => invoke(IpcEvents.GET_THEME_DATA, fileName),
getSystemValues: () => invoke>(IpcEvents.GET_THEME_SYSTEM_VALUES),
+
+ openFolder: () => invoke(IpcEvents.OPEN_THEMES_FOLDER),
},
updater: {
@@ -51,6 +53,8 @@ export default {
get: () => sendSync(IpcEvents.GET_SETTINGS),
set: (settings: Settings, pathToNotify?: string) => invoke(IpcEvents.SET_SETTINGS, settings, pathToNotify),
getSettingsDir: () => invoke(IpcEvents.GET_SETTINGS_DIR),
+
+ openFolder: () => invoke(IpcEvents.OPEN_SETTINGS_FOLDER),
},
quickCss: {
diff --git a/src/components/VencordSettings/ThemesTab.tsx b/src/components/VencordSettings/ThemesTab.tsx
index e3fbe53a7..9682d51a6 100644
--- a/src/components/VencordSettings/ThemesTab.tsx
+++ b/src/components/VencordSettings/ThemesTab.tsx
@@ -28,7 +28,7 @@ import { CspBlockedUrls, useCspErrors } from "@utils/cspViolations";
import { openInviteModal } from "@utils/discord";
import { Margins } from "@utils/margins";
import { classes } from "@utils/misc";
-import { relaunch, showItemInFolder } from "@utils/native";
+import { relaunch } from "@utils/native";
import { useAwaiter, useForceUpdater } from "@utils/react";
import { getStylusWebStoreUrl } from "@utils/web";
import { findLazy } from "@webpack";
@@ -251,7 +251,7 @@ function ThemesTab() {
) : (
showItemInFolder(themeDir!)}
+ action={() => VencordNative.themes.openFolder()}
disabled={themeDirPending}
Icon={FolderIcon}
/>
diff --git a/src/components/VencordSettings/VencordTab.tsx b/src/components/VencordSettings/VencordTab.tsx
index 54da5a3ff..047ba17dc 100644
--- a/src/components/VencordSettings/VencordTab.tsx
+++ b/src/components/VencordSettings/VencordTab.tsx
@@ -26,8 +26,7 @@ import { gitRemote } from "@shared/vencordUserAgent";
import { DONOR_ROLE_ID, VENCORD_GUILD_ID } from "@utils/constants";
import { Margins } from "@utils/margins";
import { identity, isPluginDev } from "@utils/misc";
-import { relaunch, showItemInFolder } from "@utils/native";
-import { useAwaiter } from "@utils/react";
+import { relaunch } from "@utils/native";
import { Button, Forms, GuildMemberStore, React, Select, Switch, UserStore } from "@webpack/common";
import BadgeAPI from "../../plugins/_api/badges";
@@ -53,9 +52,6 @@ type KeysOfType = {
}[keyof Object];
function VencordSettings() {
- const [settingsDir, , settingsDirPending] = useAwaiter(VencordNative.settings.getSettingsDir, {
- fallbackValue: "Loading..."
- });
const settings = useSettings();
const donateImage = React.useMemo(() => Math.random() > 0.5 ? DEFAULT_DONATE_IMAGE : SHIGGY_DONATE_IMAGE, []);
@@ -171,7 +167,7 @@ function VencordSettings() {
showItemInFolder(settingsDir)}
+ action={() => VencordNative.settings.openFolder()}
/>
)}
({
"os-accent-color": `#${systemPreferences.getAccentColor?.() || ""}`
}));
+ipcMain.handle(IpcEvents.OPEN_THEMES_FOLDER, () => shell.openPath(THEMES_DIR));
+ipcMain.handle(IpcEvents.OPEN_SETTINGS_FOLDER, () => shell.openPath(SETTINGS_DIR));
export function initIpc(mainWindow: BrowserWindow) {
let quickCssWatcher: FSWatcher | undefined;
diff --git a/src/shared/IpcEvents.ts b/src/shared/IpcEvents.ts
index 914a0a9f1..0354e6979 100644
--- a/src/shared/IpcEvents.ts
+++ b/src/shared/IpcEvents.ts
@@ -46,4 +46,7 @@ export const enum IpcEvents {
CSP_IS_DOMAIN_ALLOWED = "VencordCspIsDomainAllowed",
CSP_REMOVE_OVERRIDE = "VencordCspRemoveOverride",
CSP_REQUEST_ADD_OVERRIDE = "VencordCspRequestAddOverride",
+
+ OPEN_THEMES_FOLDER = "VencordOpenThemesFolder",
+ OPEN_SETTINGS_FOLDER = "VencordOpenSettingsFolder",
}
From 3a1e17e04d70cec42967942e8da758c22693c09a Mon Sep 17 00:00:00 2001
From: Vendicated
Date: Sat, 14 Jun 2025 18:55:12 +0200
Subject: [PATCH 027/845] remove redundant methods
---
browser/VencordNativeStub.ts | 2 --
src/VencordNative.ts | 2 --
src/components/VencordSettings/ThemesTab.tsx | 2 --
src/main/ipcMain.ts | 1 -
src/main/settings.ts | 1 -
src/shared/IpcEvents.ts | 26 +++++++++++---------
6 files changed, 14 insertions(+), 20 deletions(-)
diff --git a/browser/VencordNativeStub.ts b/browser/VencordNativeStub.ts
index ce14d28db..c99c176c3 100644
--- a/browser/VencordNativeStub.ts
+++ b/browser/VencordNativeStub.ts
@@ -42,7 +42,6 @@ window.VencordNative = {
themes: {
uploadTheme: (fileName: string, fileData: string) => DataStore.set(fileName, fileData, themeStore),
deleteTheme: (fileName: string) => DataStore.del(fileName, themeStore),
- getThemesDir: async () => "",
getThemesList: () => DataStore.entries(themeStore).then(entries =>
entries.map(([name, css]) => getThemeInfo(css, name.toString()))
),
@@ -113,7 +112,6 @@ window.VencordNative = {
}
},
set: async (s: Settings) => localStorage.setItem("VencordSettings", JSON.stringify(s)),
- getSettingsDir: async () => "LocalStorage",
openFolder: async () => Promise.reject("settings:openFolder is not supported on web"),
},
diff --git a/src/VencordNative.ts b/src/VencordNative.ts
index 5c581ccfc..048b30c7d 100644
--- a/src/VencordNative.ts
+++ b/src/VencordNative.ts
@@ -34,7 +34,6 @@ export default {
themes: {
uploadTheme: (fileName: string, fileData: string) => invoke(IpcEvents.UPLOAD_THEME, fileName, fileData),
deleteTheme: (fileName: string) => invoke(IpcEvents.DELETE_THEME, fileName),
- getThemesDir: () => invoke(IpcEvents.GET_THEMES_DIR),
getThemesList: () => invoke>(IpcEvents.GET_THEMES_LIST),
getThemeData: (fileName: string) => invoke(IpcEvents.GET_THEME_DATA, fileName),
getSystemValues: () => invoke>(IpcEvents.GET_THEME_SYSTEM_VALUES),
@@ -52,7 +51,6 @@ export default {
settings: {
get: () => sendSync(IpcEvents.GET_SETTINGS),
set: (settings: Settings, pathToNotify?: string) => invoke(IpcEvents.SET_SETTINGS, settings, pathToNotify),
- getSettingsDir: () => invoke(IpcEvents.GET_SETTINGS_DIR),
openFolder: () => invoke(IpcEvents.OPEN_SETTINGS_FOLDER),
},
diff --git a/src/components/VencordSettings/ThemesTab.tsx b/src/components/VencordSettings/ThemesTab.tsx
index 9682d51a6..128b6817d 100644
--- a/src/components/VencordSettings/ThemesTab.tsx
+++ b/src/components/VencordSettings/ThemesTab.tsx
@@ -163,7 +163,6 @@ function ThemesTab() {
const [currentTab, setCurrentTab] = useState(ThemeTab.LOCAL);
const [themeText, setThemeText] = useState(settings.themeLinks.join("\n"));
const [userThemes, setUserThemes] = useState(null);
- const [themeDir, , themeDirPending] = useAwaiter(VencordNative.themes.getThemesDir);
useEffect(() => {
refreshLocalThemes();
@@ -252,7 +251,6 @@ function ThemesTab() {
VencordNative.themes.openFolder()}
- disabled={themeDirPending}
Icon={FolderIcon}
/>
)}
diff --git a/src/main/ipcMain.ts b/src/main/ipcMain.ts
index 324a20e16..6990cea90 100644
--- a/src/main/ipcMain.ts
+++ b/src/main/ipcMain.ts
@@ -92,7 +92,6 @@ ipcMain.handle(IpcEvents.SET_QUICK_CSS, (_, css) =>
writeFileSync(QUICKCSS_PATH, css)
);
-ipcMain.handle(IpcEvents.GET_THEMES_DIR, () => THEMES_DIR);
ipcMain.handle(IpcEvents.GET_THEMES_LIST, () => listThemes());
ipcMain.handle(IpcEvents.GET_THEME_DATA, (_, fileName) => getThemeData(fileName));
ipcMain.handle(IpcEvents.GET_THEME_SYSTEM_VALUES, () => ({
diff --git a/src/main/settings.ts b/src/main/settings.ts
index ed2f48500..962bbaa7b 100644
--- a/src/main/settings.ts
+++ b/src/main/settings.ts
@@ -36,7 +36,6 @@ RendererSettings.addGlobalChangeListener(() => {
}
});
-ipcMain.handle(IpcEvents.GET_SETTINGS_DIR, () => SETTINGS_DIR);
ipcMain.on(IpcEvents.GET_SETTINGS, e => e.returnValue = RendererSettings.plain);
ipcMain.handle(IpcEvents.SET_SETTINGS, (_, data: Settings, pathToNotify?: string) => {
diff --git a/src/shared/IpcEvents.ts b/src/shared/IpcEvents.ts
index 0354e6979..e7eb7594f 100644
--- a/src/shared/IpcEvents.ts
+++ b/src/shared/IpcEvents.ts
@@ -17,25 +17,30 @@
*/
export const enum IpcEvents {
- QUICK_CSS_UPDATE = "VencordQuickCssUpdate",
- THEME_UPDATE = "VencordThemeUpdate",
+ OPEN_QUICKCSS = "VencordOpenQuickCss",
GET_QUICK_CSS = "VencordGetQuickCss",
SET_QUICK_CSS = "VencordSetQuickCss",
- UPLOAD_THEME = "VencordUploadTheme",
- DELETE_THEME = "VencordDeleteTheme",
- GET_THEMES_DIR = "VencordGetThemesDir",
+ QUICK_CSS_UPDATE = "VencordQuickCssUpdate",
+
+ GET_SETTINGS = "VencordGetSettings",
+ SET_SETTINGS = "VencordSetSettings",
+
GET_THEMES_LIST = "VencordGetThemesList",
GET_THEME_DATA = "VencordGetThemeData",
GET_THEME_SYSTEM_VALUES = "VencordGetThemeSystemValues",
- GET_SETTINGS_DIR = "VencordGetSettingsDir",
- GET_SETTINGS = "VencordGetSettings",
- SET_SETTINGS = "VencordSetSettings",
+ UPLOAD_THEME = "VencordUploadTheme",
+ DELETE_THEME = "VencordDeleteTheme",
+ THEME_UPDATE = "VencordThemeUpdate",
+
OPEN_EXTERNAL = "VencordOpenExternal",
- OPEN_QUICKCSS = "VencordOpenQuickCss",
+ OPEN_THEMES_FOLDER = "VencordOpenThemesFolder",
+ OPEN_SETTINGS_FOLDER = "VencordOpenSettingsFolder",
+
GET_UPDATES = "VencordGetUpdates",
GET_REPO = "VencordGetRepo",
UPDATE = "VencordUpdate",
BUILD = "VencordBuild",
+
OPEN_MONACO_EDITOR = "VencordOpenMonacoEditor",
GET_PLUGIN_IPC_METHOD_MAP = "VencordGetPluginIpcMethodMap",
@@ -46,7 +51,4 @@ export const enum IpcEvents {
CSP_IS_DOMAIN_ALLOWED = "VencordCspIsDomainAllowed",
CSP_REMOVE_OVERRIDE = "VencordCspRemoveOverride",
CSP_REQUEST_ADD_OVERRIDE = "VencordCspRequestAddOverride",
-
- OPEN_THEMES_FOLDER = "VencordOpenThemesFolder",
- OPEN_SETTINGS_FOLDER = "VencordOpenSettingsFolder",
}
From 7e2b8c19049406a1b3dd52a9cc192bf76b6922fb Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Sat, 14 Jun 2025 13:05:15 -0400
Subject: [PATCH 028/845] CustomUserColors: Fix Some Readability
---
src/equicordplugins/customUserColors/index.tsx | 1 +
src/main/utils/extensions.ts | 3 ++-
src/plugins/ircColors/index.ts | 17 +++++++++++------
src/plugins/roleColorEverywhere/index.tsx | 6 ++++--
src/plugins/typingTweaks/index.tsx | 11 ++++++++---
5 files changed, 26 insertions(+), 12 deletions(-)
diff --git a/src/equicordplugins/customUserColors/index.tsx b/src/equicordplugins/customUserColors/index.tsx
index ad7e3567e..f77749e5b 100644
--- a/src/equicordplugins/customUserColors/index.tsx
+++ b/src/equicordplugins/customUserColors/index.tsx
@@ -62,6 +62,7 @@ const userContextMenuPatch: NavContextMenuPatchCallback = (children, { user }: {
};
export function getCustomColorString(userId: string, withHash?: boolean): string | undefined {
+ if (!userId) return;
if (!colors[userId] || !Settings.plugins.CustomUserColors.enabled) return;
if (withHash) return `#${colors[userId]}`;
return colors[userId];
diff --git a/src/main/utils/extensions.ts b/src/main/utils/extensions.ts
index b48eb33d1..9ecfbfe82 100644
--- a/src/main/utils/extensions.ts
+++ b/src/main/utils/extensions.ts
@@ -79,5 +79,6 @@ export async function installExt(id: string) {
.catch(err => console.error(`Failed to extract extension ${id}`, err));
}
- session.defaultSession.loadExtension(extDir);
+ // @ts-expect-error Electron 36 Deprecates session.defaultSession.loadExtension()
+ session.defaultSession.extensions ? session.defaultSession.extensions.loadExtension(extDir) : session.defaultSession.loadExtension(extDir);
}
diff --git a/src/plugins/ircColors/index.ts b/src/plugins/ircColors/index.ts
index 500302c98..4f71e2286 100644
--- a/src/plugins/ircColors/index.ts
+++ b/src/plugins/ircColors/index.ts
@@ -109,13 +109,18 @@ export default definePlugin({
const id = context?.user?.id;
const colorString = context?.colorString;
const color = calculateNameColorForUser(id);
- const customColor = id && Settings.plugins.CustomUserColors.enabled ? getCustomColorString(id, true) : null;
- if (
- (settings.store.applyColorOnlyInDms && !context?.channel?.isPrivate()) ||
- (settings.store.applyColorOnlyToUsersWithoutColor && colorString)
- ) return customColor ?? colorString;
+ if (Settings.plugins.CustomUserColors.enabled) {
+ const customColor = getCustomColorString(id, true);
+ if (customColor) return customColor;
+ }
- return customColor ?? color;
+ if (settings.store.applyColorOnlyInDms && !context?.channel?.isPrivate()) {
+ return colorString;
+ }
+
+ return (!settings.store.applyColorOnlyToUsersWithoutColor || !colorString)
+ ? color
+ : colorString;
}
});
diff --git a/src/plugins/roleColorEverywhere/index.tsx b/src/plugins/roleColorEverywhere/index.tsx
index 7b2d57148..daafc994d 100644
--- a/src/plugins/roleColorEverywhere/index.tsx
+++ b/src/plugins/roleColorEverywhere/index.tsx
@@ -165,8 +165,10 @@ export default definePlugin({
getColorString(userId: string, channelOrGuildId: string) {
try {
- if (Settings.plugins.CustomUserColors.enabled)
- return getCustomColorString(userId, true);
+ if (Settings.plugins.CustomUserColors.enabled) {
+ const customColor = getCustomColorString(userId, true);
+ if (customColor) return customColor;
+ }
const guildId = ChannelStore.getChannel(channelOrGuildId)?.guild_id ?? GuildStore.getGuild(channelOrGuildId)?.id;
if (guildId == null) return null;
diff --git a/src/plugins/typingTweaks/index.tsx b/src/plugins/typingTweaks/index.tsx
index d556480a3..7aeb58b2d 100644
--- a/src/plugins/typingTweaks/index.tsx
+++ b/src/plugins/typingTweaks/index.tsx
@@ -60,10 +60,15 @@ interface Props {
guildId: string;
}
-function typingUserColor(guildId: string, userId: string) {
+function typingUserColor(guildId: string, userId: string): string | undefined {
if (!settings.store.showRoleColors) return;
- const customColor = Settings.plugins.CustomUserColors.enabled ? getCustomColorString(userId, true) : null;
- return customColor ?? GuildMemberStore.getMember(guildId, userId)?.colorString;
+
+ if (Settings.plugins.CustomUserColors.enabled) {
+ const customColor = getCustomColorString(userId, true);
+ if (customColor) return customColor;
+ }
+
+ return GuildMemberStore.getMember(guildId, userId)?.colorString;
}
const TypingUser = ErrorBoundary.wrap(function ({ user, guildId }: Props) {
From a72ef3869644369fded2f5f2949ef562fe646055 Mon Sep 17 00:00:00 2001
From: meowabyte
Date: Sat, 14 Jun 2025 22:56:14 +0200
Subject: [PATCH 029/845] update(username): + updating plugin to latest (#289)
* Changes to my plugins + username change
+ Username change from kvba to meowabyte
+ Updated my plugins to most recent version (from my repo)
* Did a little oopsie on remixMe
+ Replaced remixMe's imports and methods with actual working ones
---
README.md | 390 ++++++++++----------
src/equicordplugins/noAppsAllowed/index.tsx | 2 +-
src/equicordplugins/remixMe/index.tsx | 10 +-
src/equicordplugins/remixMe/types.ts | 9 +
src/utils/constants.ts | 4 +-
5 files changed, 214 insertions(+), 201 deletions(-)
create mode 100644 src/equicordplugins/remixMe/types.ts
diff --git a/README.md b/README.md
index 0f9e8f0bc..3d76ea2ac 100644
--- a/README.md
+++ b/README.md
@@ -15,207 +15,207 @@ You can join our [discord server](https://discord.gg/5Xh2W87egW) for commits, ch
### All Platforms
-- AllCallTimers by MaxHerbold & D3SOX
-- AltKrispSwitch by newwares
-- AlwaysExpandProfile by thororen
-- AmITyping by MrDiamond
-- Anammox by Kyuuhachi
-- AudiobookShelfRPC by vMohammad
-- AtSomeone by Joona
-- BannersEverywhere by ImLvna & AutumnVN
-- BetterActivities by D3SOX, Arjix, AutumnVN
-- BetterAudioPlayer by Creations
-- BetterBanReasons by Inbestigator
-- BetterBlockedUsers by TheArmagan
-- BetterInvites by iamme
-- BetterPlusReacts by Joona
-- BetterQuickReact by Ven & Sqaaakoi
-- BlockKeywords by catcraft
-- BlockKrisp by D3SOX
-- BypassPinPrompt by thororen
-- BypassStatus by Inbestigator & thororen
-- ChannelBadges by Creations
-- ChannelTabs by TheSun, TheKodeToad, keifufu, Nickyux
-- CharacterCounter by Creations & Panniku
-- CleanChannelName by AutumnVN
-- ClientSideBlock by Samwich
-- CommandPalette by Ethan
-- CopyStickerLinks by Byeoon
-- CopyUserMention by Cortex & castdrian
-- CustomFolderIcons by sadan
-- CustomSounds by TheKodeToad & SpikeHD
-- CustomTimestamps by Rini, nvhrr, Suffocate, Obsidian
-- CustomUserColors by mochienya
-- CuteAnimeBoys by ShadyGoat
-- CuteNekos by echo
-- CutePats by thororen
-- DecodeBase64 by ThePirateStoner
-- Demonstration by Samwich
-- DisableAnimations by S€th
-- DisableCameras by Joona
-- DontFilterMe by Samwich
-- Encryptcord by Inbestigator
-- EquicordHelper by thororen & nyx
-- Equissant by SomeAspy & thororen
-- ExportContacts by dat_insanity
-- FakeProfileThemesAndEffects by ryan
-- CopyProfileColors by Crxa
-- FastDeleteChannels by thororen
-- FindReply by newwares
-- FixFileExtensions by thororen
-- FollowVoiceUser by TheArmagan
-- FontLoader by vmohammad
-- ForwardAnywhere by thororen
-- Freaky by nyx
-- FrequentQuickSwitcher by Samwich
-- FriendCodes by HypedDomi
-- FriendshipRanks by Samwich
-- FriendTags by Samwich
-- FullVcPfp by mochie
-- GensokyoRadioRPC by RyanCaoDev & Prince527
-- GifCollections by Aria & Creations
-- GifRoulette by Samwich
-- GitHubRepos by talhakf
-- Glide by Samwich
-- GlobalBadges by HypedDomi & Hosted by Wolfie
-- GoogleThat by Samwich
-- GuildPickerDumper by Cortex, Samwich, Synth, thororen
-- HideChatButtons by iamme
-- HideServers by bepvte
-- HolyNotes by Wolfie
-- HomeTyping by Samwich
-- HopOn by ImLvna
-- Husk by nin0dev
-- IconViewer by iamme
-- Identity by Samwich
-- IgnoreCalls by TheArmagan
-- IgnoreTerms by D3SOX
-- ImagePreview by Creations
-- ImgToGif by zyqunix
-- Ingtoninator by zyqunix
-- InRole by nin0dev
-- InstantScreenshare by HAHALOSAH & thororen
-- IRememberYou by zoodogood
-- JellyfinRichPresence by vMohammad
-- Jumpscare by Surgedevs
-- JumpToStart by Samwich
-- KeyboardSounds by HypedDomi
-- KeywordNotify by camila314 & x3rt
-- LastActive by Crxa
-- LimitMiddleClickPaste by no dev listed
-- LoginWithQR by nexpid
-- MediaPlaybackSpeed by D3SOX
-- Meow by Samwich
-- MessageBurst by port
-- MessageColors by Hen
-- MessageFetchTimer by GroupXyz
-- MessageLinkTooltip by Kyuuhachi
-- MessageLoggerEnhanced by Aria
-- MessageTranslate by Samwich
-- ModalFade by Kyuuhachi
-- MoreCommands by Arjix, echo, Samu
-- MoreKaomoji by JacobTm & voidbbg
-- MoreStickers by Leko & Arjix
-- MoreUserTags by Cyn, TheSun, RyanCaoDev, LordElias, AutumnVN, hen
-- Morse by zyqunix
-- Moyai by Megu & Nuckyz
-- NeverPausePreviews by vappstar
-- NewPluginsManager by Sqaaakoi
-- NoAppsAllowed by kvba
-- NoBulletPoints by Samwich
-- NoDeleteSafety by Samwich
-- NoMirroredCamera by Nyx
-- NoModalAnimation by AutumnVN
-- NoNitroUpsell by thororen
-- NoOnboarding by omaw & Glitch
-- NoRoleHeaders by Samwich
-- NotificationTitle by Kyuuhachi
-- PartyMode by UwUDev
-- PingNotifications by smuki
-- PinIcon by iamme
-- PlatformSpoofer by Drag
-- PolishWording by Samwich
-- PurgeMessages by bhop & nyx
-- QuestCompleter by Amia
-- QuestionMarkReplacement by nyx
-- Quoter by Samwich
-- RandomVoice by xijexo, omaw, thororen
-- Remix by MrDiamond
-- RemixMe by kvba
-- RepeatMessage by Tolgchu
-- ReplyPingControl by ant0n & MrDiamond
-- RPCEditor by Nyako & nin0dev
-- RPCStats by Samwich
-- SearchFix by Jaxx
-- SekaiStickers by MaiKokain
-- ServerSearch by camila314
-- ShowBadgesInChat by Inbestigator & KrystalSkull
-- SidebarChat by Joona
-- Signature by Ven, Rini, ImBanana, KrystalSkull
-- Slap by Korbo
-- Soggy by sliwka
-- SoundBoardLogger by Moxxie, fres, echo, maintained by thororen
-- SplitLargeMessages by Reycko
-- SpotifyActivityToggle by thororen
-- SpotifyLyrics by Joona
-- StatsfmPresence by Crxa
-- StatusPresets by iamme
-- SteamStatusSync by niko
-- StickerBlocker by Samwich
-- StreamingCodecDisabler by davidkra230
-- TalkInReverse by Tolgchu
-- TeX by Kyuuhachi
-- TextToSpeech by Samwich
-- ThemeLibrary by Fafa
-- TidalEmbeds by vmohammad
-- Timezones by Aria
-- Title by Kyuuhachi
-- ToastNotifications by Skully, Ethan, Buzzy
-- ToggleVideoBind by mochie
-- TosuRPC by AutumnVN
-- Translate+ by Prince527 & Ven
-- UnitConverter by sadan
-- UnlimitedAccounts by thororen
-- UnreadCountBadge by Joona
-- UserPFP by nexpid & thororen
-- UwUifier by echo
-- VCNarratorCustom by Loukios, ported by example-git
-- VCPanelSettings by nin0dev
-- VCSupport by thororen
-- VencordRPC by AutumnVN
-- VideoSpeed by Samwich
-- ViewRawVariant by Kyuuhachi
-- VoiceChatUtilities by D3SOX
-- VoiceJoinMessages by Sqaaakoi & maintained by thororen
-- WallpaperFree by Joona
-- WebpackTarball by Kyuuhachi
-- WhitelistedEmojis by Creations
-- WhosWatching by fres
-- WigglyText by nexpid
-- Woof by Samwich
-- WriteUpperCase by Samwich & KrystalSkull
-- YoutubeDescription by arHSM
+- AllCallTimers by MaxHerbold & D3SOX
+- AltKrispSwitch by newwares
+- AlwaysExpandProfile by thororen
+- AmITyping by MrDiamond
+- Anammox by Kyuuhachi
+- AudiobookShelfRPC by vMohammad
+- AtSomeone by Joona
+- BannersEverywhere by ImLvna & AutumnVN
+- BetterActivities by D3SOX, Arjix, AutumnVN
+- BetterAudioPlayer by Creations
+- BetterBanReasons by Inbestigator
+- BetterBlockedUsers by TheArmagan
+- BetterInvites by iamme
+- BetterPlusReacts by Joona
+- BetterQuickReact by Ven & Sqaaakoi
+- BlockKeywords by catcraft
+- BlockKrisp by D3SOX
+- BypassPinPrompt by thororen
+- BypassStatus by Inbestigator & thororen
+- ChannelBadges by Creations
+- ChannelTabs by TheSun, TheKodeToad, keifufu, Nickyux
+- CharacterCounter by Creations & Panniku
+- CleanChannelName by AutumnVN
+- ClientSideBlock by Samwich
+- CommandPalette by Ethan
+- CopyStickerLinks by Byeoon
+- CopyUserMention by Cortex & castdrian
+- CustomFolderIcons by sadan
+- CustomSounds by TheKodeToad & SpikeHD
+- CustomTimestamps by Rini, nvhrr, Suffocate, Obsidian
+- CustomUserColors by mochienya
+- CuteAnimeBoys by ShadyGoat
+- CuteNekos by echo
+- CutePats by thororen
+- DecodeBase64 by ThePirateStoner
+- Demonstration by Samwich
+- DisableAnimations by S€th
+- DisableCameras by Joona
+- DontFilterMe by Samwich
+- Encryptcord by Inbestigator
+- EquicordHelper by thororen & nyx
+- Equissant by SomeAspy & thororen
+- ExportContacts by dat_insanity
+- FakeProfileThemesAndEffects by ryan
+- CopyProfileColors by Crxa
+- FastDeleteChannels by thororen
+- FindReply by newwares
+- FixFileExtensions by thororen
+- FollowVoiceUser by TheArmagan
+- FontLoader by vmohammad
+- ForwardAnywhere by thororen
+- Freaky by nyx
+- FrequentQuickSwitcher by Samwich
+- FriendCodes by HypedDomi
+- FriendshipRanks by Samwich
+- FriendTags by Samwich
+- FullVcPfp by mochie
+- GensokyoRadioRPC by RyanCaoDev & Prince527
+- GifCollections by Aria & Creations
+- GifRoulette by Samwich
+- GitHubRepos by talhakf
+- Glide by Samwich
+- GlobalBadges by HypedDomi & Hosted by Wolfie
+- GoogleThat by Samwich
+- GuildPickerDumper by Cortex, Samwich, Synth, thororen
+- HideChatButtons by iamme
+- HideServers by bepvte
+- HolyNotes by Wolfie
+- HomeTyping by Samwich
+- HopOn by ImLvna
+- Husk by nin0dev
+- IconViewer by iamme
+- Identity by Samwich
+- IgnoreCalls by TheArmagan
+- IgnoreTerms by D3SOX
+- ImagePreview by Creations
+- ImgToGif by zyqunix
+- Ingtoninator by zyqunix
+- InRole by nin0dev
+- InstantScreenshare by HAHALOSAH & thororen
+- IRememberYou by zoodogood
+- JellyfinRichPresence by vMohammad
+- Jumpscare by Surgedevs
+- JumpToStart by Samwich
+- KeyboardSounds by HypedDomi
+- KeywordNotify by camila314 & x3rt
+- LastActive by Crxa
+- LimitMiddleClickPaste by no dev listed
+- LoginWithQR by nexpid
+- MediaPlaybackSpeed by D3SOX
+- Meow by Samwich
+- MessageBurst by port
+- MessageColors by Hen
+- MessageFetchTimer by GroupXyz
+- MessageLinkTooltip by Kyuuhachi
+- MessageLoggerEnhanced by Aria
+- MessageTranslate by Samwich
+- ModalFade by Kyuuhachi
+- MoreCommands by Arjix, echo, Samu
+- MoreKaomoji by JacobTm & voidbbg
+- MoreStickers by Leko & Arjix
+- MoreUserTags by Cyn, TheSun, RyanCaoDev, LordElias, AutumnVN, hen
+- Morse by zyqunix
+- Moyai by Megu & Nuckyz
+- NeverPausePreviews by vappstar
+- NewPluginsManager by Sqaaakoi
+- NoAppsAllowed by meowabyte
+- NoBulletPoints by Samwich
+- NoDeleteSafety by Samwich
+- NoMirroredCamera by Nyx
+- NoModalAnimation by AutumnVN
+- NoNitroUpsell by thororen
+- NoOnboarding by omaw & Glitch
+- NoRoleHeaders by Samwich
+- NotificationTitle by Kyuuhachi
+- PartyMode by UwUDev
+- PingNotifications by smuki
+- PinIcon by iamme
+- PlatformSpoofer by Drag
+- PolishWording by Samwich
+- PurgeMessages by bhop & nyx
+- QuestCompleter by Amia
+- QuestionMarkReplacement by nyx
+- Quoter by Samwich
+- RandomVoice by xijexo, omaw, thororen
+- Remix by MrDiamond
+- RemixMe by meowabyte
+- RepeatMessage by Tolgchu
+- ReplyPingControl by ant0n & MrDiamond
+- RPCEditor by Nyako & nin0dev
+- RPCStats by Samwich
+- SearchFix by Jaxx
+- SekaiStickers by MaiKokain
+- ServerSearch by camila314
+- ShowBadgesInChat by Inbestigator & KrystalSkull
+- SidebarChat by Joona
+- Signature by Ven, Rini, ImBanana, KrystalSkull
+- Slap by Korbo
+- Soggy by sliwka
+- SoundBoardLogger by Moxxie, fres, echo, maintained by thororen
+- SplitLargeMessages by Reycko
+- SpotifyActivityToggle by thororen
+- SpotifyLyrics by Joona
+- StatsfmPresence by Crxa
+- StatusPresets by iamme
+- SteamStatusSync by niko
+- StickerBlocker by Samwich
+- StreamingCodecDisabler by davidkra230
+- TalkInReverse by Tolgchu
+- TeX by Kyuuhachi
+- TextToSpeech by Samwich
+- ThemeLibrary by Fafa
+- TidalEmbeds by vmohammad
+- Timezones by Aria
+- Title by Kyuuhachi
+- ToastNotifications by Skully, Ethan, Buzzy
+- ToggleVideoBind by mochie
+- TosuRPC by AutumnVN
+- Translate+ by Prince527 & Ven
+- UnitConverter by sadan
+- UnlimitedAccounts by thororen
+- UnreadCountBadge by Joona
+- UserPFP by nexpid & thororen
+- UwUifier by echo
+- VCNarratorCustom by Loukios, ported by example-git
+- VCPanelSettings by nin0dev
+- VCSupport by thororen
+- VencordRPC by AutumnVN
+- VideoSpeed by Samwich
+- ViewRawVariant by Kyuuhachi
+- VoiceChatUtilities by D3SOX
+- VoiceJoinMessages by Sqaaakoi & maintained by thororen
+- WallpaperFree by Joona
+- WebpackTarball by Kyuuhachi
+- WhitelistedEmojis by Creations
+- WhosWatching by fres
+- WigglyText by nexpid
+- Woof by Samwich
+- WriteUpperCase by Samwich & KrystalSkull
+- YoutubeDescription by arHSM
### Web Only
-- None At This Time
+- None At This Time
### Vesktop & Equibop Only
-- ScreenRecorder by AutumnVN
+- ScreenRecorder by AutumnVN
### Discord Desktop Only
-- ClipsEnhancements by niko
-- MediaDownloader by Colorman
-- NoRPC by Cyn
-- StatusWhilePlaying by thororen
+- ClipsEnhancements by niko
+- MediaDownloader by Colorman
+- NoRPC by Cyn
+- StatusWhilePlaying by thororen
### Equicord Devbuilds Only
-- FurudoSpeak by example-git
-- Shakespearean by vmohammad
-- VoiceChannelLog by Sqaaakoi & maintained by thororen
+- FurudoSpeak by example-git
+- Shakespearean by vmohammad
+- VoiceChannelLog by Sqaaakoi & maintained by thororen
@@ -223,18 +223,18 @@ You can join our [discord server](https://discord.gg/5Xh2W87egW) for commits, ch
Windows
-- [GUI](https://github.com/Equicord/Equilotl/releases/latest/download/Equilotl.exe)
-- [CLI](https://github.com/Equicord/Equilotl/releases/latest/download/EquilotlCli.exe)
+- [GUI](https://github.com/Equicord/Equilotl/releases/latest/download/Equilotl.exe)
+- [CLI](https://github.com/Equicord/Equilotl/releases/latest/download/EquilotlCli.exe)
MacOS
-- [GUI](https://github.com/Equicord/Equilotl/releases/latest/download/Equilotl.MacOS.zip)
+- [GUI](https://github.com/Equicord/Equilotl/releases/latest/download/Equilotl.MacOS.zip)
Linux
-- [GUI-X11](https://github.com/Equicord/Equilotl/releases/latest/download/Equilotl-x11)
-- [CLI](https://github.com/Equicord/Equilotl/releases/latest/download/EquilotlCli-Linux)
-- [AUR](https://aur.archlinux.org/packages?O=0&K=equicord)
+- [GUI-X11](https://github.com/Equicord/Equilotl/releases/latest/download/Equilotl-x11)
+- [CLI](https://github.com/Equicord/Equilotl/releases/latest/download/EquilotlCli-Linux)
+- [AUR](https://aur.archlinux.org/packages?O=0&K=equicord)
```shell
sh -c "$(curl -sS https://raw.githubusercontent.com/Equicord/Equicord/refs/heads/main/misc/install.sh)"
diff --git a/src/equicordplugins/noAppsAllowed/index.tsx b/src/equicordplugins/noAppsAllowed/index.tsx
index a97c2864d..ee0e19a18 100644
--- a/src/equicordplugins/noAppsAllowed/index.tsx
+++ b/src/equicordplugins/noAppsAllowed/index.tsx
@@ -10,7 +10,7 @@ import definePlugin from "@utils/types";
export default definePlugin({
name: "NoAppsAllowed",
description: "returns the bot's tag :skulk:",
- authors: [EquicordDevs.kvba],
+ authors: [EquicordDevs.meowabyte],
patches: [
{
diff --git a/src/equicordplugins/remixMe/index.tsx b/src/equicordplugins/remixMe/index.tsx
index d757a272a..438498558 100644
--- a/src/equicordplugins/remixMe/index.tsx
+++ b/src/equicordplugins/remixMe/index.tsx
@@ -4,16 +4,20 @@
* SPDX-License-Identifier: GPL-3.0-or-later
*/
-import { addMessagePreSendListener, MessageExtra, MessageObject, removeMessagePreSendListener } from "@api/MessageEvents";
+import { addMessagePreSendListener, type MessageExtra, type MessageObject, type MessageSendListener, removeMessagePreSendListener } from "@api/MessageEvents";
import { EquicordDevs } from "@utils/constants";
import definePlugin from "@utils/types";
-const handleMessage = (channelID: string, message: MessageObject, messageEx: MessageExtra) => messageEx.uploads && messageEx.uploads.forEach(att => (att as any).isRemix = true);
+import type { UploadWithRemix } from "./types";
+
+
+const handleMessage: MessageSendListener = (_: string, __: MessageObject, ex: MessageExtra) =>
+ ex.uploads && (ex.uploads as UploadWithRemix[]).forEach(att => att.isRemix = true);
export default definePlugin({
name: "RemixMe",
description: "Turns every single message with attachment to have remix tag",
- authors: [EquicordDevs.kvba],
+ authors: [EquicordDevs.meowabyte],
start: () => addMessagePreSendListener(handleMessage),
stop: () => removeMessagePreSendListener(handleMessage)
});
diff --git a/src/equicordplugins/remixMe/types.ts b/src/equicordplugins/remixMe/types.ts
new file mode 100644
index 000000000..df69d500c
--- /dev/null
+++ b/src/equicordplugins/remixMe/types.ts
@@ -0,0 +1,9 @@
+/*
+ * Vencord, a Discord client mod
+ * Copyright (c) 2025 Vendicated and contributors
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+import { Upload } from "@api/MessageEvents";
+
+export type UploadWithRemix = Upload & { isRemix?: boolean; };
diff --git a/src/utils/constants.ts b/src/utils/constants.ts
index 526ba0905..9f1157f54 100644
--- a/src/utils/constants.ts
+++ b/src/utils/constants.ts
@@ -745,8 +745,8 @@ export const EquicordDevs = Object.freeze({
name: "DaBluLite",
id: 582170007505731594n
},
- kvba: {
- name: "kvba",
+ meowabyte: {
+ name: "meowabyte",
id: 105170831130234880n
},
Fafa: {
From 88a2131eb278bf87c9bd4686339b3a0aec5ac418 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Sat, 14 Jun 2025 17:10:13 -0400
Subject: [PATCH 030/845] RemixMe: Balloons
---
README.md | 390 +++++++++----------
src/api/MessageEvents.ts | 2 +
src/equicordplugins/remixMe/index.tsx | 16 +-
src/equicordplugins/remixMe/types.ts | 9 -
src/equicordplugins/viewRawVariant/index.tsx | 10 +
5 files changed, 215 insertions(+), 212 deletions(-)
delete mode 100644 src/equicordplugins/remixMe/types.ts
diff --git a/README.md b/README.md
index 3d76ea2ac..d241c9e78 100644
--- a/README.md
+++ b/README.md
@@ -15,207 +15,207 @@ You can join our [discord server](https://discord.gg/5Xh2W87egW) for commits, ch
### All Platforms
-- AllCallTimers by MaxHerbold & D3SOX
-- AltKrispSwitch by newwares
-- AlwaysExpandProfile by thororen
-- AmITyping by MrDiamond
-- Anammox by Kyuuhachi
-- AudiobookShelfRPC by vMohammad
-- AtSomeone by Joona
-- BannersEverywhere by ImLvna & AutumnVN
-- BetterActivities by D3SOX, Arjix, AutumnVN
-- BetterAudioPlayer by Creations
-- BetterBanReasons by Inbestigator
-- BetterBlockedUsers by TheArmagan
-- BetterInvites by iamme
-- BetterPlusReacts by Joona
-- BetterQuickReact by Ven & Sqaaakoi
-- BlockKeywords by catcraft
-- BlockKrisp by D3SOX
-- BypassPinPrompt by thororen
-- BypassStatus by Inbestigator & thororen
-- ChannelBadges by Creations
-- ChannelTabs by TheSun, TheKodeToad, keifufu, Nickyux
-- CharacterCounter by Creations & Panniku
-- CleanChannelName by AutumnVN
-- ClientSideBlock by Samwich
-- CommandPalette by Ethan
-- CopyStickerLinks by Byeoon
-- CopyUserMention by Cortex & castdrian
-- CustomFolderIcons by sadan
-- CustomSounds by TheKodeToad & SpikeHD
-- CustomTimestamps by Rini, nvhrr, Suffocate, Obsidian
-- CustomUserColors by mochienya
-- CuteAnimeBoys by ShadyGoat
-- CuteNekos by echo
-- CutePats by thororen
-- DecodeBase64 by ThePirateStoner
-- Demonstration by Samwich
-- DisableAnimations by S€th
-- DisableCameras by Joona
-- DontFilterMe by Samwich
-- Encryptcord by Inbestigator
-- EquicordHelper by thororen & nyx
-- Equissant by SomeAspy & thororen
-- ExportContacts by dat_insanity
-- FakeProfileThemesAndEffects by ryan
-- CopyProfileColors by Crxa
-- FastDeleteChannels by thororen
-- FindReply by newwares
-- FixFileExtensions by thororen
-- FollowVoiceUser by TheArmagan
-- FontLoader by vmohammad
-- ForwardAnywhere by thororen
-- Freaky by nyx
-- FrequentQuickSwitcher by Samwich
-- FriendCodes by HypedDomi
-- FriendshipRanks by Samwich
-- FriendTags by Samwich
-- FullVcPfp by mochie
-- GensokyoRadioRPC by RyanCaoDev & Prince527
-- GifCollections by Aria & Creations
-- GifRoulette by Samwich
-- GitHubRepos by talhakf
-- Glide by Samwich
-- GlobalBadges by HypedDomi & Hosted by Wolfie
-- GoogleThat by Samwich
-- GuildPickerDumper by Cortex, Samwich, Synth, thororen
-- HideChatButtons by iamme
-- HideServers by bepvte
-- HolyNotes by Wolfie
-- HomeTyping by Samwich
-- HopOn by ImLvna
-- Husk by nin0dev
-- IconViewer by iamme
-- Identity by Samwich
-- IgnoreCalls by TheArmagan
-- IgnoreTerms by D3SOX
-- ImagePreview by Creations
-- ImgToGif by zyqunix
-- Ingtoninator by zyqunix
-- InRole by nin0dev
-- InstantScreenshare by HAHALOSAH & thororen
-- IRememberYou by zoodogood
-- JellyfinRichPresence by vMohammad
-- Jumpscare by Surgedevs
-- JumpToStart by Samwich
-- KeyboardSounds by HypedDomi
-- KeywordNotify by camila314 & x3rt
-- LastActive by Crxa
-- LimitMiddleClickPaste by no dev listed
-- LoginWithQR by nexpid
-- MediaPlaybackSpeed by D3SOX
-- Meow by Samwich
-- MessageBurst by port
-- MessageColors by Hen
-- MessageFetchTimer by GroupXyz
-- MessageLinkTooltip by Kyuuhachi
-- MessageLoggerEnhanced by Aria
-- MessageTranslate by Samwich
-- ModalFade by Kyuuhachi
-- MoreCommands by Arjix, echo, Samu
-- MoreKaomoji by JacobTm & voidbbg
-- MoreStickers by Leko & Arjix
-- MoreUserTags by Cyn, TheSun, RyanCaoDev, LordElias, AutumnVN, hen
-- Morse by zyqunix
-- Moyai by Megu & Nuckyz
-- NeverPausePreviews by vappstar
-- NewPluginsManager by Sqaaakoi
-- NoAppsAllowed by meowabyte
-- NoBulletPoints by Samwich
-- NoDeleteSafety by Samwich
-- NoMirroredCamera by Nyx
-- NoModalAnimation by AutumnVN
-- NoNitroUpsell by thororen
-- NoOnboarding by omaw & Glitch
-- NoRoleHeaders by Samwich
-- NotificationTitle by Kyuuhachi
-- PartyMode by UwUDev
-- PingNotifications by smuki
-- PinIcon by iamme
-- PlatformSpoofer by Drag
-- PolishWording by Samwich
-- PurgeMessages by bhop & nyx
-- QuestCompleter by Amia
-- QuestionMarkReplacement by nyx
-- Quoter by Samwich
-- RandomVoice by xijexo, omaw, thororen
-- Remix by MrDiamond
-- RemixMe by meowabyte
-- RepeatMessage by Tolgchu
-- ReplyPingControl by ant0n & MrDiamond
-- RPCEditor by Nyako & nin0dev
-- RPCStats by Samwich
-- SearchFix by Jaxx
-- SekaiStickers by MaiKokain
-- ServerSearch by camila314
-- ShowBadgesInChat by Inbestigator & KrystalSkull
-- SidebarChat by Joona
-- Signature by Ven, Rini, ImBanana, KrystalSkull
-- Slap by Korbo
-- Soggy by sliwka
-- SoundBoardLogger by Moxxie, fres, echo, maintained by thororen
-- SplitLargeMessages by Reycko
-- SpotifyActivityToggle by thororen
-- SpotifyLyrics by Joona
-- StatsfmPresence by Crxa
-- StatusPresets by iamme
-- SteamStatusSync by niko
-- StickerBlocker by Samwich
-- StreamingCodecDisabler by davidkra230
-- TalkInReverse by Tolgchu
-- TeX by Kyuuhachi
-- TextToSpeech by Samwich
-- ThemeLibrary by Fafa
-- TidalEmbeds by vmohammad
-- Timezones by Aria
-- Title by Kyuuhachi
-- ToastNotifications by Skully, Ethan, Buzzy
-- ToggleVideoBind by mochie
-- TosuRPC by AutumnVN
-- Translate+ by Prince527 & Ven
-- UnitConverter by sadan
-- UnlimitedAccounts by thororen
-- UnreadCountBadge by Joona
-- UserPFP by nexpid & thororen
-- UwUifier by echo
-- VCNarratorCustom by Loukios, ported by example-git
-- VCPanelSettings by nin0dev
-- VCSupport by thororen
-- VencordRPC by AutumnVN
-- VideoSpeed by Samwich
-- ViewRawVariant by Kyuuhachi
-- VoiceChatUtilities by D3SOX
-- VoiceJoinMessages by Sqaaakoi & maintained by thororen
-- WallpaperFree by Joona
-- WebpackTarball by Kyuuhachi
-- WhitelistedEmojis by Creations
-- WhosWatching by fres
-- WigglyText by nexpid
-- Woof by Samwich
-- WriteUpperCase by Samwich & KrystalSkull
-- YoutubeDescription by arHSM
+- AllCallTimers by MaxHerbold & D3SOX
+- AltKrispSwitch by newwares
+- AlwaysExpandProfile by thororen
+- AmITyping by MrDiamond
+- Anammox by Kyuuhachi
+- AudiobookShelfRPC by vMohammad
+- AtSomeone by Joona
+- BannersEverywhere by ImLvna & AutumnVN
+- BetterActivities by D3SOX, Arjix, AutumnVN
+- BetterAudioPlayer by Creations
+- BetterBanReasons by Inbestigator
+- BetterBlockedUsers by TheArmagan
+- BetterInvites by iamme
+- BetterPlusReacts by Joona
+- BetterQuickReact by Ven & Sqaaakoi
+- BlockKeywords by catcraft
+- BlockKrisp by D3SOX
+- BypassPinPrompt by thororen
+- BypassStatus by Inbestigator & thororen
+- ChannelBadges by Creations
+- ChannelTabs by TheSun, TheKodeToad, keifufu, Nickyux
+- CharacterCounter by Creations & Panniku
+- CleanChannelName by AutumnVN
+- ClientSideBlock by Samwich
+- CommandPalette by Ethan
+- CopyStickerLinks by Byeoon
+- CopyUserMention by Cortex & castdrian
+- CustomFolderIcons by sadan
+- CustomSounds by TheKodeToad & SpikeHD
+- CustomTimestamps by Rini, nvhrr, Suffocate, Obsidian
+- CustomUserColors by mochienya
+- CuteAnimeBoys by ShadyGoat
+- CuteNekos by echo
+- CutePats by thororen
+- DecodeBase64 by ThePirateStoner
+- Demonstration by Samwich
+- DisableAnimations by S€th
+- DisableCameras by Joona
+- DontFilterMe by Samwich
+- Encryptcord by Inbestigator
+- EquicordHelper by thororen & nyx
+- Equissant by SomeAspy & thororen
+- ExportContacts by dat_insanity
+- FakeProfileThemesAndEffects by ryan
+- CopyProfileColors by Crxa
+- FastDeleteChannels by thororen
+- FindReply by newwares
+- FixFileExtensions by thororen
+- FollowVoiceUser by TheArmagan
+- FontLoader by vmohammad
+- ForwardAnywhere by thororen
+- Freaky by nyx
+- FrequentQuickSwitcher by Samwich
+- FriendCodes by HypedDomi
+- FriendshipRanks by Samwich
+- FriendTags by Samwich
+- FullVcPfp by mochie
+- GensokyoRadioRPC by RyanCaoDev & Prince527
+- GifCollections by Aria & Creations
+- GifRoulette by Samwich
+- GitHubRepos by talhakf
+- Glide by Samwich
+- GlobalBadges by HypedDomi & Hosted by Wolfie
+- GoogleThat by Samwich
+- GuildPickerDumper by Cortex, Samwich, Synth, thororen
+- HideChatButtons by iamme
+- HideServers by bepvte
+- HolyNotes by Wolfie
+- HomeTyping by Samwich
+- HopOn by ImLvna
+- Husk by nin0dev
+- IconViewer by iamme
+- Identity by Samwich
+- IgnoreCalls by TheArmagan
+- IgnoreTerms by D3SOX
+- ImagePreview by Creations
+- ImgToGif by zyqunix
+- Ingtoninator by zyqunix
+- InRole by nin0dev
+- InstantScreenshare by HAHALOSAH & thororen
+- IRememberYou by zoodogood
+- JellyfinRichPresence by vMohammad
+- Jumpscare by Surgedevs
+- JumpToStart by Samwich
+- KeyboardSounds by HypedDomi
+- KeywordNotify by camila314 & x3rt
+- LastActive by Crxa
+- LimitMiddleClickPaste by no dev listed
+- LoginWithQR by nexpid
+- MediaPlaybackSpeed by D3SOX
+- Meow by Samwich
+- MessageBurst by port
+- MessageColors by Hen
+- MessageFetchTimer by GroupXyz
+- MessageLinkTooltip by Kyuuhachi
+- MessageLoggerEnhanced by Aria
+- MessageTranslate by Samwich
+- ModalFade by Kyuuhachi
+- MoreCommands by Arjix, echo, Samu
+- MoreKaomoji by JacobTm & voidbbg
+- MoreStickers by Leko & Arjix
+- MoreUserTags by Cyn, TheSun, RyanCaoDev, LordElias, AutumnVN, hen
+- Morse by zyqunix
+- Moyai by Megu & Nuckyz
+- NeverPausePreviews by vappstar
+- NewPluginsManager by Sqaaakoi
+- NoAppsAllowed by meowabyte
+- NoBulletPoints by Samwich
+- NoDeleteSafety by Samwich
+- NoMirroredCamera by Nyx
+- NoModalAnimation by AutumnVN
+- NoNitroUpsell by thororen
+- NoOnboarding by omaw & Glitch
+- NoRoleHeaders by Samwich
+- NotificationTitle by Kyuuhachi
+- PartyMode by UwUDev
+- PingNotifications by smuki
+- PinIcon by iamme
+- PlatformSpoofer by Drag
+- PolishWording by Samwich
+- PurgeMessages by bhop & nyx
+- QuestCompleter by Amia
+- QuestionMarkReplacement by nyx
+- Quoter by Samwich
+- RandomVoice by xijexo, omaw, thororen
+- Remix by MrDiamond
+- RemixMe by meowabyte
+- RepeatMessage by Tolgchu
+- ReplyPingControl by ant0n & MrDiamond
+- RPCEditor by Nyako & nin0dev
+- RPCStats by Samwich
+- SearchFix by Jaxx
+- SekaiStickers by MaiKokain
+- ServerSearch by camila314
+- ShowBadgesInChat by Inbestigator & KrystalSkull
+- SidebarChat by Joona
+- Signature by Ven, Rini, ImBanana, KrystalSkull
+- Slap by Korbo
+- Soggy by sliwka
+- SoundBoardLogger by Moxxie, fres, echo, maintained by thororen
+- SplitLargeMessages by Reycko
+- SpotifyActivityToggle by thororen
+- SpotifyLyrics by Joona
+- StatsfmPresence by Crxa
+- StatusPresets by iamme
+- SteamStatusSync by niko
+- StickerBlocker by Samwich
+- StreamingCodecDisabler by davidkra230
+- TalkInReverse by Tolgchu
+- TeX by Kyuuhachi
+- TextToSpeech by Samwich
+- ThemeLibrary by Fafa
+- TidalEmbeds by vmohammad
+- Timezones by Aria
+- Title by Kyuuhachi
+- ToastNotifications by Skully, Ethan, Buzzy
+- ToggleVideoBind by mochie
+- TosuRPC by AutumnVN
+- Translate+ by Prince527 & Ven
+- UnitConverter by sadan
+- UnlimitedAccounts by thororen
+- UnreadCountBadge by Joona
+- UserPFP by nexpid & thororen
+- UwUifier by echo
+- VCNarratorCustom by Loukios, ported by example-git
+- VCPanelSettings by nin0dev
+- VCSupport by thororen
+- VencordRPC by AutumnVN
+- VideoSpeed by Samwich
+- ViewRawVariant by Kyuuhachi
+- VoiceChatUtilities by D3SOX
+- VoiceJoinMessages by Sqaaakoi & maintained by thororen
+- WallpaperFree by Joona
+- WebpackTarball by Kyuuhachi
+- WhitelistedEmojis by Creations
+- WhosWatching by fres
+- WigglyText by nexpid
+- Woof by Samwich
+- WriteUpperCase by Samwich & KrystalSkull
+- YoutubeDescription by arHSM
### Web Only
-- None At This Time
+- None At This Time
### Vesktop & Equibop Only
-- ScreenRecorder by AutumnVN
+- ScreenRecorder by AutumnVN
### Discord Desktop Only
-- ClipsEnhancements by niko
-- MediaDownloader by Colorman
-- NoRPC by Cyn
-- StatusWhilePlaying by thororen
+- ClipsEnhancements by niko
+- MediaDownloader by Colorman
+- NoRPC by Cyn
+- StatusWhilePlaying by thororen
### Equicord Devbuilds Only
-- FurudoSpeak by example-git
-- Shakespearean by vmohammad
-- VoiceChannelLog by Sqaaakoi & maintained by thororen
+- FurudoSpeak by example-git
+- Shakespearean by vmohammad
+- VoiceChannelLog by Sqaaakoi & maintained by thororen
@@ -223,18 +223,18 @@ You can join our [discord server](https://discord.gg/5Xh2W87egW) for commits, ch
Windows
-- [GUI](https://github.com/Equicord/Equilotl/releases/latest/download/Equilotl.exe)
-- [CLI](https://github.com/Equicord/Equilotl/releases/latest/download/EquilotlCli.exe)
+- [GUI](https://github.com/Equicord/Equilotl/releases/latest/download/Equilotl.exe)
+- [CLI](https://github.com/Equicord/Equilotl/releases/latest/download/EquilotlCli.exe)
MacOS
-- [GUI](https://github.com/Equicord/Equilotl/releases/latest/download/Equilotl.MacOS.zip)
+- [GUI](https://github.com/Equicord/Equilotl/releases/latest/download/Equilotl.MacOS.zip)
Linux
-- [GUI-X11](https://github.com/Equicord/Equilotl/releases/latest/download/Equilotl-x11)
-- [CLI](https://github.com/Equicord/Equilotl/releases/latest/download/EquilotlCli-Linux)
-- [AUR](https://aur.archlinux.org/packages?O=0&K=equicord)
+- [GUI-X11](https://github.com/Equicord/Equilotl/releases/latest/download/Equilotl-x11)
+- [CLI](https://github.com/Equicord/Equilotl/releases/latest/download/EquilotlCli-Linux)
+- [AUR](https://aur.archlinux.org/packages?O=0&K=equicord)
```shell
sh -c "$(curl -sS https://raw.githubusercontent.com/Equicord/Equicord/refs/heads/main/misc/install.sh)"
diff --git a/src/api/MessageEvents.ts b/src/api/MessageEvents.ts
index 9f87a0efc..1210e18cd 100644
--- a/src/api/MessageEvents.ts
+++ b/src/api/MessageEvents.ts
@@ -38,6 +38,8 @@ export interface Upload {
filename: string;
id: string;
isImage: boolean;
+ isRemix?: boolean;
+ isThumbnail: boolean;
isVideo: boolean;
item: {
file: File;
diff --git a/src/equicordplugins/remixMe/index.tsx b/src/equicordplugins/remixMe/index.tsx
index 438498558..08d4916ae 100644
--- a/src/equicordplugins/remixMe/index.tsx
+++ b/src/equicordplugins/remixMe/index.tsx
@@ -4,20 +4,20 @@
* SPDX-License-Identifier: GPL-3.0-or-later
*/
-import { addMessagePreSendListener, type MessageExtra, type MessageObject, type MessageSendListener, removeMessagePreSendListener } from "@api/MessageEvents";
+import { addMessagePreSendListener, MessageSendListener, removeMessagePreSendListener } from "@api/MessageEvents";
import { EquicordDevs } from "@utils/constants";
import definePlugin from "@utils/types";
-import type { UploadWithRemix } from "./types";
-
-
-const handleMessage: MessageSendListener = (_: string, __: MessageObject, ex: MessageExtra) =>
- ex.uploads && (ex.uploads as UploadWithRemix[]).forEach(att => att.isRemix = true);
+const handleMessage: MessageSendListener = (_, __, ex) => ex.uploads && ex.uploads.forEach(att => att.isRemix = true);
export default definePlugin({
name: "RemixMe",
description: "Turns every single message with attachment to have remix tag",
authors: [EquicordDevs.meowabyte],
- start: () => addMessagePreSendListener(handleMessage),
- stop: () => removeMessagePreSendListener(handleMessage)
+ start() {
+ addMessagePreSendListener(handleMessage);
+ },
+ stop() {
+ removeMessagePreSendListener(handleMessage);
+ }
});
diff --git a/src/equicordplugins/remixMe/types.ts b/src/equicordplugins/remixMe/types.ts
deleted file mode 100644
index df69d500c..000000000
--- a/src/equicordplugins/remixMe/types.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
- * Vencord, a Discord client mod
- * Copyright (c) 2025 Vendicated and contributors
- * SPDX-License-Identifier: GPL-3.0-or-later
- */
-
-import { Upload } from "@api/MessageEvents";
-
-export type UploadWithRemix = Upload & { isRemix?: boolean; };
diff --git a/src/equicordplugins/viewRawVariant/index.tsx b/src/equicordplugins/viewRawVariant/index.tsx
index a6a1f40f1..62c267d06 100644
--- a/src/equicordplugins/viewRawVariant/index.tsx
+++ b/src/equicordplugins/viewRawVariant/index.tsx
@@ -5,8 +5,10 @@
*/
import { NavContextMenuPatchCallback } from "@api/ContextMenu";
+import { addMessagePreSendListener, MessageExtra, MessageObject, MessageSendListener, removeMessagePreSendListener } from "@api/MessageEvents";
import { CodeBlock } from "@components/CodeBlock";
import ErrorBoundary from "@components/ErrorBoundary";
+import { UploadWithRemix } from "@equicordplugins/remixMe/types";
import { Devs } from "@utils/constants";
import { getIntlMessage } from "@utils/discord";
import { Margins } from "@utils/margins";
@@ -125,6 +127,8 @@ function makeContextCallback(
};
}
+const handleMessage: MessageSendListener = (_: string, __: MessageObject, ex: MessageExtra) => ex.uploads && (ex.uploads as UploadWithRemix[]).forEach(att => console.log(att));
+
export default definePlugin({
name: "ViewRawVariant",
description: "Copy/View raw content of any message, channel, or guild, but show in the right click menu.",
@@ -143,4 +147,10 @@ export default definePlugin({
openViewRawModal(cleanMessage(val), "Message", true),
),
},
+ start() {
+ addMessagePreSendListener(handleMessage);
+ },
+ stop() {
+ removeMessagePreSendListener(handleMessage);
+ }
});
From 810b3e5b4afb8c74ef49e50fb8bad9cd3be2a8a5 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Sat, 14 Jun 2025 17:10:36 -0400
Subject: [PATCH 031/845] Remove Testing :)
---
src/equicordplugins/viewRawVariant/index.tsx | 10 ----------
1 file changed, 10 deletions(-)
diff --git a/src/equicordplugins/viewRawVariant/index.tsx b/src/equicordplugins/viewRawVariant/index.tsx
index 62c267d06..a6a1f40f1 100644
--- a/src/equicordplugins/viewRawVariant/index.tsx
+++ b/src/equicordplugins/viewRawVariant/index.tsx
@@ -5,10 +5,8 @@
*/
import { NavContextMenuPatchCallback } from "@api/ContextMenu";
-import { addMessagePreSendListener, MessageExtra, MessageObject, MessageSendListener, removeMessagePreSendListener } from "@api/MessageEvents";
import { CodeBlock } from "@components/CodeBlock";
import ErrorBoundary from "@components/ErrorBoundary";
-import { UploadWithRemix } from "@equicordplugins/remixMe/types";
import { Devs } from "@utils/constants";
import { getIntlMessage } from "@utils/discord";
import { Margins } from "@utils/margins";
@@ -127,8 +125,6 @@ function makeContextCallback(
};
}
-const handleMessage: MessageSendListener = (_: string, __: MessageObject, ex: MessageExtra) => ex.uploads && (ex.uploads as UploadWithRemix[]).forEach(att => console.log(att));
-
export default definePlugin({
name: "ViewRawVariant",
description: "Copy/View raw content of any message, channel, or guild, but show in the right click menu.",
@@ -147,10 +143,4 @@ export default definePlugin({
openViewRawModal(cleanMessage(val), "Message", true),
),
},
- start() {
- addMessagePreSendListener(handleMessage);
- },
- stop() {
- removeMessagePreSendListener(handleMessage);
- }
});
From e9f366808a10561e7f875191643162c04e9642d2 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Mon, 16 Jun 2025 01:03:16 -0400
Subject: [PATCH 032/845] Update Cortex Dev ID
---
src/utils/constants.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/utils/constants.ts b/src/utils/constants.ts
index 9f1157f54..d06e173b3 100644
--- a/src/utils/constants.ts
+++ b/src/utils/constants.ts
@@ -627,7 +627,7 @@ export const EquicordDevs = Object.freeze({
},
Cortex: {
name: "Cortex",
- id: 400111022901559298n
+ id: 913205935319691335n
},
KrystalSkull: {
name: "krystalskullofficial",
From d94977c04b1f4d2e6f0bf0218aac8e391a669b94 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Mon, 16 Jun 2025 15:13:02 -0400
Subject: [PATCH 033/845] Patch Fixes
---
src/equicordplugins/atSomeone/index.ts | 2 +-
src/equicordplugins/expandedUserTags/index.tsx | 3 +--
src/equicordplugins/holyNotes/NoteHandler.ts | 4 +---
.../holyNotes/components/modals/RenderMessage.tsx | 9 +++------
src/equicordplugins/holyNotes/index.tsx | 7 ++++++-
src/plugins/roleColorEverywhere/index.tsx | 4 ++--
6 files changed, 14 insertions(+), 15 deletions(-)
diff --git a/src/equicordplugins/atSomeone/index.ts b/src/equicordplugins/atSomeone/index.ts
index 445fe0a65..40902e6c4 100644
--- a/src/equicordplugins/atSomeone/index.ts
+++ b/src/equicordplugins/atSomeone/index.ts
@@ -26,7 +26,7 @@ export default definePlugin({
{
find: "inQuote:",
replacement: {
- match: /\|Clyde/,
+ match: /\|here/,
replace: "$&|someone"
}
}
diff --git a/src/equicordplugins/expandedUserTags/index.tsx b/src/equicordplugins/expandedUserTags/index.tsx
index 3948b4a1a..32ad46605 100644
--- a/src/equicordplugins/expandedUserTags/index.tsx
+++ b/src/equicordplugins/expandedUserTags/index.tsx
@@ -128,7 +128,7 @@ export default definePlugin({
message, user, channelId, isChat, channel
}: {
message?: Message,
- user?: User & { isClyde(): boolean; },
+ user?: User,
channel?: Channel & { isForumPost(): boolean; isMediaPost(): boolean; },
channelId?: string;
isChat?: boolean;
@@ -137,7 +137,6 @@ export default definePlugin({
if (!user) return null;
if (isChat && user.id === "1") return null;
- if (user.isClyde()) return null;
if (user.bot && settings.dontShowForBots) return null;
channel ??= ChannelStore.getChannel(channelId!) as any;
diff --git a/src/equicordplugins/holyNotes/NoteHandler.ts b/src/equicordplugins/holyNotes/NoteHandler.ts
index 70a005bef..2235528ea 100644
--- a/src/equicordplugins/holyNotes/NoteHandler.ts
+++ b/src/equicordplugins/holyNotes/NoteHandler.ts
@@ -4,10 +4,10 @@
* SPDX-License-Identifier: GPL-3.0-or-later
*/
-import { findByCode } from "@webpack";
import { ChannelStore, lodash, Toasts, UserStore } from "@webpack/common";
import { Channel, Message } from "discord-types/general";
+import { User } from ".";
import { Discord, HolyNotes } from "./types";
import { deleteCacheFromDataStore, DeleteEntireStore, saveCacheToDataStore } from "./utils";
@@ -142,8 +142,6 @@ export default new (class NoteHandler {
public refreshAvatars = async () => {
const notebooks = this.getAllNotes();
- const User = findByCode("tag", "isClyde");
-
for (const notebook in notebooks)
for (const noteId in notebooks[notebook]) {
const note = notebooks[notebook][noteId];
diff --git a/src/equicordplugins/holyNotes/components/modals/RenderMessage.tsx b/src/equicordplugins/holyNotes/components/modals/RenderMessage.tsx
index 45edbf7c4..feb8fe9e4 100644
--- a/src/equicordplugins/holyNotes/components/modals/RenderMessage.tsx
+++ b/src/equicordplugins/holyNotes/components/modals/RenderMessage.tsx
@@ -4,10 +4,11 @@
* SPDX-License-Identifier: GPL-3.0-or-later
*/
+import { Channel, cozyMessage, groupStart, message, MessageType, User } from "@equicordplugins/holyNotes";
import { copyToClipboard } from "@utils/clipboard";
import { classes } from "@utils/misc";
import { ModalProps } from "@utils/modal";
-import { findByCode, findByCodeLazy, findByProps, findComponentByCodeLazy } from "@webpack";
+import { findComponentByCodeLazy } from "@webpack";
import { ContextMenuApi, FluxDispatcher, Menu, NavigationRouter, React } from "@webpack/common";
import noteHandler from "../../NoteHandler";
@@ -28,10 +29,6 @@ export const RenderMessage = ({
closeModal?: () => void;
}) => {
const ChannelMessage = findComponentByCodeLazy("Message must not be a thread");
- const { message, groupStart, cozyMessage } = findByProps("cozyMessage");
- const User = findByCode("isClyde(){");
- const Message = findByCode("isEdited(){");
- const Channel = findByCodeLazy("computeLurkerPermissionsAllowList");
const [isHoldingDelete, setHoldingDelete] = React.useState(false);
@@ -90,7 +87,7 @@ export const RenderMessage = ({
// @ts-ignore
channel={new Channel({ id: "holy-notes" })}
message={
- new Message(
+ new MessageType(
Object.assign(
{ ...note },
{
diff --git a/src/equicordplugins/holyNotes/index.tsx b/src/equicordplugins/holyNotes/index.tsx
index 0810d954e..d01ba040e 100644
--- a/src/equicordplugins/holyNotes/index.tsx
+++ b/src/equicordplugins/holyNotes/index.tsx
@@ -26,7 +26,7 @@ import { EquicordDevs } from "@utils/constants";
import { classes } from "@utils/misc";
import { openModal } from "@utils/modal";
import definePlugin from "@utils/types";
-import { findByProps, findComponentByCodeLazy } from "@webpack";
+import { findByCodeLazy, findByProps, findByPropsLazy, findComponentByCodeLazy } from "@webpack";
import { ChannelStore, Menu } from "@webpack/common";
import { Message } from "discord-types/general";
@@ -35,6 +35,11 @@ import { NoteModal } from "./components/modals/Notebook";
import noteHandler, { noteHandlerCache } from "./NoteHandler";
import { DataStoreToCache, HolyNoteStore } from "./utils";
+export const User = findByCodeLazy("isSystemUser(){");
+export const { message, groupStart, cozyMessage } = findByPropsLazy("cozyMessage");
+export const MessageType = findByCodeLazy("isEdited(){");
+export const Channel = findByCodeLazy("computeLurkerPermissionsAllowList(){");
+
const HeaderBarIcon = findComponentByCodeLazy(".HEADER_BAR_BADGE_TOP:", '.iconBadge,"top"');
const messageContextMenuPatch: NavContextMenuPatchCallback = async (children, { message }: { message: Message; }) => {
diff --git a/src/plugins/roleColorEverywhere/index.tsx b/src/plugins/roleColorEverywhere/index.tsx
index daafc994d..683797533 100644
--- a/src/plugins/roleColorEverywhere/index.tsx
+++ b/src/plugins/roleColorEverywhere/index.tsx
@@ -85,8 +85,8 @@ export default definePlugin({
find: ".USER_MENTION)",
replacement: [
{
- match: /(?<=onContextMenu:\i,color:)\i(?<=\.getNickname\((\i),\i,(\i).+?)/,
- replace: "$self.getColorInt($2?.id,$1)",
+ match: /(?<=onContextMenu:\i(?!,children))(?<=\.getNickname\((\i),\i,(\i).+?)/,
+ replace: ",color:$self.getColorInt($2?.id,$1)",
}
],
predicate: () => settings.store.chatMentions
From e49f3de2aa6ac1b446480d24a4af2ca108507286 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Mon, 16 Jun 2025 15:49:58 -0400
Subject: [PATCH 034/845] Remove ThemeLibrary Download Button Temp
---
.../components/ThemeInfoModal.tsx | 78 +------------------
1 file changed, 2 insertions(+), 76 deletions(-)
diff --git a/src/equicordplugins/themeLibrary/components/ThemeInfoModal.tsx b/src/equicordplugins/themeLibrary/components/ThemeInfoModal.tsx
index 5954c06ed..1d8fb233a 100644
--- a/src/equicordplugins/themeLibrary/components/ThemeInfoModal.tsx
+++ b/src/equicordplugins/themeLibrary/components/ThemeInfoModal.tsx
@@ -9,29 +9,17 @@ import { Heart } from "@components/Heart";
import { copyToClipboard } from "@utils/clipboard";
import { openInviteModal } from "@utils/discord";
import { Margins } from "@utils/margins";
-import { classes } from "@utils/misc";
import { ModalContent, ModalFooter, ModalHeader, ModalRoot, ModalSize, openModal } from "@utils/modal";
import type { PluginNative } from "@utils/types";
import { findComponentByCodeLazy } from "@webpack";
import { Button, Forms, Parser, React, showToast, Toasts } from "@webpack/common";
-import { Theme, ThemeInfoModalProps } from "../types";
-import { ClockIcon, DownloadIcon, WarningIcon } from "../utils/Icons";
-import { logger } from "./ThemeTab";
+import { ThemeInfoModalProps } from "../types";
+import { ClockIcon, WarningIcon } from "../utils/Icons";
const Native = VencordNative.pluginHelpers.ThemeLibrary as PluginNative;
const UserSummaryItem = findComponentByCodeLazy("defaultRenderUser", "showDefaultAvatarsForNullUsers");
-async function downloadTheme(themesDir: string, theme: Theme) {
- try {
- await Native.downloadTheme(themesDir, theme);
- showToast(`Downloaded ${theme.name}!`, Toasts.Type.SUCCESS);
- } catch (err: unknown) {
- logger.error(err);
- showToast(`Failed to download ${theme.name}! (check console)`, Toasts.Type.FAILURE);
- }
-}
-
export const ThemeInfoModal: React.FC = ({ author, theme, ...props }) => {
const { type, content, likes, guild, tags, last_updated, requiresThemeAttributes } = theme;
@@ -189,68 +177,6 @@ export const ThemeInfoModal: React.FC = ({ author, theme, .
>
Close
- {
- const themesDir = await VencordNative.themes.getThemesDir();
- const exists = await Native.themeExists(themesDir, theme);
- // using another function so we get the proper file path instead of just guessing
- // which slash to use (im looking at you windows)
- const validThemesDir = await Native.getThemesDir(themesDir, theme);
- // check if theme exists, and ask if they want to overwrite
- if (exists) {
- openModal(modalProps => (
-
-
- Conflict!
-
-
-
-
-
A theme with the same name already exist in your themes directory! Do you want to overwrite it?
-
-
- {validThemesDir}
-
-
-
-
-
-
- {
- await downloadTheme(themesDir, theme);
- modalProps.onClose();
- }}
- >
- Overwrite
-
- modalProps.onClose()}
- >
- Keep my file
-
-
-
- ));
- } else {
- await downloadTheme(themesDir, theme);
- }
- }}
- >
-
- Download
-
-
);
From 8799a2e08c11a336291d88c654d126d8167fd856 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Mon, 16 Jun 2025 16:17:52 -0400
Subject: [PATCH 035/845] Revert Some Changes
---
browser/VencordNativeStub.ts | 2 ++
src/VencordNative.ts | 2 ++
src/components/ThemeSettings/ThemesTab.tsx | 6 +++--
src/main/ipcMain.ts | 1 +
src/main/settings.ts | 1 +
src/shared/IpcEvents.ts | 26 ++++++++++------------
6 files changed, 22 insertions(+), 16 deletions(-)
diff --git a/browser/VencordNativeStub.ts b/browser/VencordNativeStub.ts
index 072d6d015..ba789c666 100644
--- a/browser/VencordNativeStub.ts
+++ b/browser/VencordNativeStub.ts
@@ -41,6 +41,7 @@ window.VencordNative = {
themes: {
uploadTheme: (fileName: string, fileData: string) => DataStore.set(fileName, fileData, themeStore),
deleteTheme: (fileName: string) => DataStore.del(fileName, themeStore),
+ getThemesDir: async () => "",
getThemesList: () => DataStore.entries(themeStore).then(entries =>
entries.map(([name, css]) => ({ fileName: name as string, content: css }))
),
@@ -111,6 +112,7 @@ window.VencordNative = {
}
},
set: async (s: Settings) => localStorage.setItem("EquicordSettings", JSON.stringify(s)),
+ getSettingsDir: async () => "LocalStorage",
openFolder: async () => Promise.reject("settings:openFolder is not supported on web"),
},
diff --git a/src/VencordNative.ts b/src/VencordNative.ts
index 1e6024903..380c42954 100644
--- a/src/VencordNative.ts
+++ b/src/VencordNative.ts
@@ -33,6 +33,7 @@ export default {
themes: {
uploadTheme: (fileName: string, fileData: string) => invoke(IpcEvents.UPLOAD_THEME, fileName, fileData),
deleteTheme: (fileName: string) => invoke(IpcEvents.DELETE_THEME, fileName),
+ getThemesDir: () => invoke(IpcEvents.GET_THEMES_DIR),
getThemesList: () => invoke>(IpcEvents.GET_THEMES_LIST),
getThemeData: (fileName: string) => invoke(IpcEvents.GET_THEME_DATA, fileName),
getSystemValues: () => invoke>(IpcEvents.GET_THEME_SYSTEM_VALUES),
@@ -50,6 +51,7 @@ export default {
settings: {
get: () => sendSync(IpcEvents.GET_SETTINGS),
set: (settings: Settings, pathToNotify?: string) => invoke(IpcEvents.SET_SETTINGS, settings, pathToNotify),
+ getSettingsDir: () => invoke(IpcEvents.GET_SETTINGS_DIR),
openFolder: () => invoke(IpcEvents.OPEN_SETTINGS_FOLDER),
},
diff --git a/src/components/ThemeSettings/ThemesTab.tsx b/src/components/ThemeSettings/ThemesTab.tsx
index d1d2a7197..4743d38d7 100644
--- a/src/components/ThemeSettings/ThemesTab.tsx
+++ b/src/components/ThemeSettings/ThemesTab.tsx
@@ -33,7 +33,7 @@ import { openInviteModal } from "@utils/discord";
import { Margins } from "@utils/margins";
import { classes } from "@utils/misc";
import { openModal } from "@utils/modal";
-import { relaunch } from "@utils/native";
+import { relaunch, showItemInFolder } from "@utils/native";
import { useAwaiter, useForceUpdater } from "@utils/react";
import type { ThemeHeader } from "@utils/themes";
import { getThemeInfo, stripBOM, type UserThemeHeader } from "@utils/themes/bd";
@@ -201,6 +201,7 @@ function ThemesTab() {
const [themeLinkValid, setThemeLinkValid] = useState(false);
const [userThemes, setUserThemes] = useState(null);
const [onlineThemes, setOnlineThemes] = useState<(UserThemeHeader & { link: string; })[] | null>(null);
+ const [themeDir, , themeDirPending] = useAwaiter(VencordNative.themes.getThemesDir);
useEffect(() => {
updateThemes();
@@ -344,7 +345,8 @@ function ThemesTab() {
) : (
VencordNative.themes.openFolder()}
+ action={() => showItemInFolder(themeDir!)}
+ disabled={themeDirPending}
Icon={FolderIcon}
/>
)}
diff --git a/src/main/ipcMain.ts b/src/main/ipcMain.ts
index 9c9a11a53..3d07b1756 100644
--- a/src/main/ipcMain.ts
+++ b/src/main/ipcMain.ts
@@ -80,6 +80,7 @@ ipcMain.handle(IpcEvents.SET_QUICK_CSS, (_, css) =>
writeFileSync(QUICKCSS_PATH, css)
);
+ipcMain.handle(IpcEvents.GET_THEMES_DIR, () => THEMES_DIR);
ipcMain.handle(IpcEvents.GET_THEMES_LIST, () => listThemes());
ipcMain.handle(IpcEvents.GET_THEME_DATA, (_, fileName) => getThemeData(fileName));
ipcMain.handle(IpcEvents.GET_THEME_SYSTEM_VALUES, () => ({
diff --git a/src/main/settings.ts b/src/main/settings.ts
index 962bbaa7b..ed2f48500 100644
--- a/src/main/settings.ts
+++ b/src/main/settings.ts
@@ -36,6 +36,7 @@ RendererSettings.addGlobalChangeListener(() => {
}
});
+ipcMain.handle(IpcEvents.GET_SETTINGS_DIR, () => SETTINGS_DIR);
ipcMain.on(IpcEvents.GET_SETTINGS, e => e.returnValue = RendererSettings.plain);
ipcMain.handle(IpcEvents.SET_SETTINGS, (_, data: Settings, pathToNotify?: string) => {
diff --git a/src/shared/IpcEvents.ts b/src/shared/IpcEvents.ts
index e7eb7594f..0354e6979 100644
--- a/src/shared/IpcEvents.ts
+++ b/src/shared/IpcEvents.ts
@@ -17,30 +17,25 @@
*/
export const enum IpcEvents {
- OPEN_QUICKCSS = "VencordOpenQuickCss",
+ QUICK_CSS_UPDATE = "VencordQuickCssUpdate",
+ THEME_UPDATE = "VencordThemeUpdate",
GET_QUICK_CSS = "VencordGetQuickCss",
SET_QUICK_CSS = "VencordSetQuickCss",
- QUICK_CSS_UPDATE = "VencordQuickCssUpdate",
-
- GET_SETTINGS = "VencordGetSettings",
- SET_SETTINGS = "VencordSetSettings",
-
+ UPLOAD_THEME = "VencordUploadTheme",
+ DELETE_THEME = "VencordDeleteTheme",
+ GET_THEMES_DIR = "VencordGetThemesDir",
GET_THEMES_LIST = "VencordGetThemesList",
GET_THEME_DATA = "VencordGetThemeData",
GET_THEME_SYSTEM_VALUES = "VencordGetThemeSystemValues",
- UPLOAD_THEME = "VencordUploadTheme",
- DELETE_THEME = "VencordDeleteTheme",
- THEME_UPDATE = "VencordThemeUpdate",
-
+ GET_SETTINGS_DIR = "VencordGetSettingsDir",
+ GET_SETTINGS = "VencordGetSettings",
+ SET_SETTINGS = "VencordSetSettings",
OPEN_EXTERNAL = "VencordOpenExternal",
- OPEN_THEMES_FOLDER = "VencordOpenThemesFolder",
- OPEN_SETTINGS_FOLDER = "VencordOpenSettingsFolder",
-
+ OPEN_QUICKCSS = "VencordOpenQuickCss",
GET_UPDATES = "VencordGetUpdates",
GET_REPO = "VencordGetRepo",
UPDATE = "VencordUpdate",
BUILD = "VencordBuild",
-
OPEN_MONACO_EDITOR = "VencordOpenMonacoEditor",
GET_PLUGIN_IPC_METHOD_MAP = "VencordGetPluginIpcMethodMap",
@@ -51,4 +46,7 @@ export const enum IpcEvents {
CSP_IS_DOMAIN_ALLOWED = "VencordCspIsDomainAllowed",
CSP_REMOVE_OVERRIDE = "VencordCspRemoveOverride",
CSP_REQUEST_ADD_OVERRIDE = "VencordCspRequestAddOverride",
+
+ OPEN_THEMES_FOLDER = "VencordOpenThemesFolder",
+ OPEN_SETTINGS_FOLDER = "VencordOpenSettingsFolder",
}
From 7989e81e6cb02974c55a5c4dd4ca29eda84be996 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Mon, 16 Jun 2025 16:17:59 -0400
Subject: [PATCH 036/845] Revert "Remove ThemeLibrary Download Button Temp"
This reverts commit e49f3de2aa6ac1b446480d24a4af2ca108507286.
---
.../components/ThemeInfoModal.tsx | 78 ++++++++++++++++++-
1 file changed, 76 insertions(+), 2 deletions(-)
diff --git a/src/equicordplugins/themeLibrary/components/ThemeInfoModal.tsx b/src/equicordplugins/themeLibrary/components/ThemeInfoModal.tsx
index 1d8fb233a..5954c06ed 100644
--- a/src/equicordplugins/themeLibrary/components/ThemeInfoModal.tsx
+++ b/src/equicordplugins/themeLibrary/components/ThemeInfoModal.tsx
@@ -9,17 +9,29 @@ import { Heart } from "@components/Heart";
import { copyToClipboard } from "@utils/clipboard";
import { openInviteModal } from "@utils/discord";
import { Margins } from "@utils/margins";
+import { classes } from "@utils/misc";
import { ModalContent, ModalFooter, ModalHeader, ModalRoot, ModalSize, openModal } from "@utils/modal";
import type { PluginNative } from "@utils/types";
import { findComponentByCodeLazy } from "@webpack";
import { Button, Forms, Parser, React, showToast, Toasts } from "@webpack/common";
-import { ThemeInfoModalProps } from "../types";
-import { ClockIcon, WarningIcon } from "../utils/Icons";
+import { Theme, ThemeInfoModalProps } from "../types";
+import { ClockIcon, DownloadIcon, WarningIcon } from "../utils/Icons";
+import { logger } from "./ThemeTab";
const Native = VencordNative.pluginHelpers.ThemeLibrary as PluginNative;
const UserSummaryItem = findComponentByCodeLazy("defaultRenderUser", "showDefaultAvatarsForNullUsers");
+async function downloadTheme(themesDir: string, theme: Theme) {
+ try {
+ await Native.downloadTheme(themesDir, theme);
+ showToast(`Downloaded ${theme.name}!`, Toasts.Type.SUCCESS);
+ } catch (err: unknown) {
+ logger.error(err);
+ showToast(`Failed to download ${theme.name}! (check console)`, Toasts.Type.FAILURE);
+ }
+}
+
export const ThemeInfoModal: React.FC = ({ author, theme, ...props }) => {
const { type, content, likes, guild, tags, last_updated, requiresThemeAttributes } = theme;
@@ -177,6 +189,68 @@ export const ThemeInfoModal: React.FC = ({ author, theme, .
>
Close
+ {
+ const themesDir = await VencordNative.themes.getThemesDir();
+ const exists = await Native.themeExists(themesDir, theme);
+ // using another function so we get the proper file path instead of just guessing
+ // which slash to use (im looking at you windows)
+ const validThemesDir = await Native.getThemesDir(themesDir, theme);
+ // check if theme exists, and ask if they want to overwrite
+ if (exists) {
+ openModal(modalProps => (
+
+
+ Conflict!
+
+
+
+
+
A theme with the same name already exist in your themes directory! Do you want to overwrite it?
+
+
+ {validThemesDir}
+
+
+
+
+
+
+ {
+ await downloadTheme(themesDir, theme);
+ modalProps.onClose();
+ }}
+ >
+ Overwrite
+
+ modalProps.onClose()}
+ >
+ Keep my file
+
+
+
+ ));
+ } else {
+ await downloadTheme(themesDir, theme);
+ }
+ }}
+ >
+
+ Download
+
+
);
From 71e80b7a7a7d551951e5e6179252cc223b5400c1 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Mon, 16 Jun 2025 16:59:13 -0400
Subject: [PATCH 037/845] Fix Failing Themes Links
---
src/components/ThemeSettings/ThemesTab.tsx | 19 ++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/src/components/ThemeSettings/ThemesTab.tsx b/src/components/ThemeSettings/ThemesTab.tsx
index 4743d38d7..e711ab2fe 100644
--- a/src/components/ThemeSettings/ThemesTab.tsx
+++ b/src/components/ThemeSettings/ThemesTab.tsx
@@ -415,11 +415,20 @@ function ThemesTab() {
}
async function refreshOnlineThemes() {
- const themes = await Promise.all(settings.themeLinks.map(async link => {
- const css = await fetch(link).then(res => res.text());
- return { ...getThemeInfo(css, link), link };
- }));
- setOnlineThemes(themes);
+ const themes = await Promise.all(
+ settings.themeLinks.map(async link => {
+ try {
+ const res = await fetch(link);
+ if (!res.ok) throw new Error(`Failed to fetch ${link}`);
+ const css = await res.text();
+ return { ...getThemeInfo(css, link), link };
+ } catch (err) {
+ console.warn(`Theme fetch failed for ${link}:`, err);
+ return null;
+ }
+ })
+ );
+ setOnlineThemes(themes.filter(theme => theme !== null));
}
function onThemeLinkEnabledChange(link: string, enabled: boolean) {
From 6264da3649817902d95791c5c38ac9ce8ab718cb Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Mon, 16 Jun 2025 19:40:08 -0400
Subject: [PATCH 038/845] FriendCloud Plugin
---
README.md | 3 +-
src/equicordplugins/friendCloud/index.ts | 302 +++++++++++++++++++++++
2 files changed, 304 insertions(+), 1 deletion(-)
create mode 100644 src/equicordplugins/friendCloud/index.ts
diff --git a/README.md b/README.md
index d241c9e78..40cc0b6d8 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,7 @@ You can join our [discord server](https://discord.gg/5Xh2W87egW) for commits, ch
### Extra included plugins
-187 additional plugins
+188 additional plugins
### All Platforms
@@ -68,6 +68,7 @@ You can join our [discord server](https://discord.gg/5Xh2W87egW) for commits, ch
- ForwardAnywhere by thororen
- Freaky by nyx
- FrequentQuickSwitcher by Samwich
+- FriendCloud by Fafa
- FriendCodes by HypedDomi
- FriendshipRanks by Samwich
- FriendTags by Samwich
diff --git a/src/equicordplugins/friendCloud/index.ts b/src/equicordplugins/friendCloud/index.ts
new file mode 100644
index 000000000..4972f6d1a
--- /dev/null
+++ b/src/equicordplugins/friendCloud/index.ts
@@ -0,0 +1,302 @@
+/*
+ * Vencord, a modification for Discord's desktop app
+ * Copyright (c) 2025 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 .
+*/
+
+import { ApplicationCommandInputType, ApplicationCommandOptionType, findOption, sendBotMessage } from "@api/Commands";
+import { EquicordDevs } from "@utils/constants";
+import { Logger } from "@utils/Logger";
+import definePlugin from "@utils/types";
+import { findStore } from "@webpack";
+import { DraftType, UploadHandler, UserStore } from "@webpack/common";
+import { User } from "discord-types/general";
+
+const logger = new Logger("FriendCloud");
+
+interface AffinitiesV2 {
+ otherUserId: User["id"];
+ userSegment: "NON_MAU" | "NON_HFU_MAU" | "HFU_MAU";
+ otherUserSegment: "NON_MAU" | "NON_HFU_MAU" | "HFU_MAU";
+ isFriend: boolean;
+ dmProbability: number;
+ dmRank: number;
+ vcProbability: number;
+ vcRank: number;
+ serverMessageProbability: number;
+ serverMessageRank: number;
+ communicationProbability: number;
+ communicationRank: number;
+}
+
+interface UserPosition {
+ member: User;
+ affinity: number;
+ x: number;
+ y: number;
+ size: number;
+}
+
+export default definePlugin({
+ name: "FriendCloud",
+ description: "Adds a /friendcloud command to visualize the users you most interact with",
+ authors: [EquicordDevs.Fafa],
+ commands: [
+ {
+ inputType: ApplicationCommandInputType.BUILT_IN,
+ name: "friendcloud",
+ description: "Display user you most interact with in a cloud",
+ options: [
+ {
+ name: "count",
+ description: "Number of users to display",
+ type: ApplicationCommandOptionType.NUMBER,
+ required: false
+ },
+ {
+ name: "algorithm",
+ description: "Use the old algorithm (v1) to calculate affinity",
+ type: ApplicationCommandOptionType.BOOLEAN,
+ required: false
+ }
+ ],
+ execute: async (opts, cmdCtx) => {
+ const count = findOption(opts, "count", 25);
+ const useV1 = findOption(opts, "algorithm", false);
+
+ if (!count) return sendBotMessage(cmdCtx.channel.id, { content: "The count must be 1 or higher!" });
+
+ try {
+ const affinities: AffinitiesV2[] = findStore("UserAffinitiesV2Store").getUserAffinities();
+
+ if (!affinities?.length) {
+ return sendBotMessage(cmdCtx.channel.id, {
+ content: "No affinities found. Check your [privacy settings]()."
+ });
+ }
+
+ const users = affinities
+ .map(e => ({
+ member: UserStore.getUser(e.otherUserId),
+ affinity: calculateAffinityScore(e as AffinitiesV2)
+ }))
+ .filter(x => x.member?.id)
+ .sort((a, b) => b.affinity - a.affinity)
+ .slice(0, count);
+
+ if (!users.length) {
+ return sendBotMessage(cmdCtx.channel.id, {
+ content: "No valid users found in affinities. Check your [privacy settings]()."
+ });
+ }
+
+ const minAffinity = Math.min(...users.map(u => u.affinity));
+ const maxAffinity = Math.max(...users.map(u => u.affinity));
+ const minSize = 120;
+ const maxSize = 240;
+
+ const getSize = (affinity: number): number => {
+ if (maxAffinity === minAffinity) return (minSize + maxSize) / 2;
+ return minSize + ((affinity - minAffinity) / (maxAffinity - minAffinity)) * (maxSize - minSize);
+ };
+
+ const avgSize = (minSize + maxSize) / 2;
+ const { width: canvasWidth, height: canvasHeight } = calculateCanvasSize(users.length, avgSize);
+
+ const canvas = document.createElement("canvas");
+ canvas.width = canvasWidth;
+ canvas.height = canvasHeight;
+ const ctx = canvas.getContext("2d")!;
+
+ const positions: Array<{ x: number, y: number, size: number; }> = [];
+ const userPositions = users.map(user => {
+ const size = getSize(user.affinity);
+ const pos = generatePoissonDiskPosition(positions, canvasWidth, canvasHeight, size);
+ positions.push({ x: pos.x, y: pos.y, size });
+ return { ...user, x: pos.x, y: pos.y, size };
+ });
+
+ let loadedImages = 0;
+ const totalImages = userPositions.length;
+
+ const drawImage = async (user: UserPosition) => {
+ try {
+ const avatarUrl = user.member?.avatar
+ ? `https://cdn.discordapp.com/avatars/${user.member.id}/${user.member?.avatar}.webp?size=256`
+ : `https://cdn.discordapp.com/embed/avatars/${user.member.id as any as number % 5}.png`;
+
+ const img = await loadImage(avatarUrl);
+ const centerX = user.x + user.size / 2;
+ const centerY = user.y + user.size / 2;
+
+ ctx.save();
+ ctx.beginPath();
+ ctx.arc(centerX, centerY, user.size / 2, 0, Math.PI * 2);
+ ctx.clip();
+ ctx.drawImage(img, user.x, user.y, user.size, user.size);
+ ctx.restore();
+
+ ctx.strokeStyle = "#808080";
+ ctx.lineWidth = 3;
+ ctx.beginPath();
+ ctx.arc(centerX, centerY, user.size / 2 + 1, 0, Math.PI * 2);
+ ctx.stroke();
+ } catch {
+ // we ignore
+ } finally {
+ loadedImages++;
+ if (loadedImages === totalImages) {
+ canvas.toBlob(blob => {
+ if (!blob) {
+ sendBotMessage(cmdCtx.channel.id, { content: "Couldn't generate the image :c" });
+ return;
+ }
+ const file = new File([blob], "affinities-cloud.png", { type: "image/png" });
+ UploadHandler.promptToUpload([file], cmdCtx.channel, DraftType.ChannelMessage);
+ }, "image/png");
+ }
+ }
+ };
+
+ userPositions.forEach(drawImage);
+ } catch (e: unknown) {
+ if (e instanceof Error)
+ sendBotMessage(cmdCtx.channel.id, { content: e.message });
+ else logger.error(e);
+ }
+ },
+ },
+ ]
+});
+
+function calculateAffinityScore(affinity: AffinitiesV2): number {
+ const weights = {
+ friend: 0.15,
+ dm: 0.30,
+ vc: 0.25,
+ serverMsg: 0.20,
+ communication: 0.10
+ };
+
+ let score = 0;
+ if (affinity.isFriend) score += weights.friend * 100;
+ score += affinity.dmProbability * weights.dm * 100;
+ score += affinity.vcProbability * weights.vc * 100;
+ score += affinity.serverMessageProbability * weights.serverMsg * 100;
+ score += affinity.communicationProbability * weights.communication * 100;
+
+ return Math.round(Math.min(100, Math.max(0, score)) * 100) / 100;
+}
+
+// stolen from petpet thanks vee
+function loadImage(source: File | string): Promise {
+ const isFile = source instanceof File;
+ const url = isFile ? URL.createObjectURL(source) : source;
+
+ return new Promise((resolve, reject) => {
+ const img = new Image();
+ img.onload = () => {
+ if (isFile) URL.revokeObjectURL(url);
+ resolve(img);
+ };
+ img.onerror = (event, _source, _lineno, _colno, err) => reject(err || event);
+ img.crossOrigin = "anonymous";
+ img.src = url;
+ });
+}
+
+function generatePoissonDiskPosition(
+ existingPositions: Array<{ x: number, y: number, size: number; }>,
+ canvasWidth: number,
+ canvasHeight: number,
+ size: number
+): { x: number, y: number; } {
+ const edgePadding = 10;
+ const minDist = size * 1.5;
+ const textSpace = 60;
+ const k = 30;
+
+ function isValid(x: number, y: number) {
+ if (
+ x < edgePadding ||
+ x + size > canvasWidth - edgePadding ||
+ y < edgePadding ||
+ y + size > canvasHeight - textSpace - edgePadding
+ ) return false;
+
+ return !existingPositions.some(pos => {
+ const dx = pos.x - x;
+ const dy = pos.y - y;
+ const dist = Math.hypot(dx, dy);
+ const minAllowed = (pos.size + size) / 2 + (minDist - size);
+ return dist < minAllowed;
+ });
+ }
+
+ if (existingPositions.length === 0) {
+ return {
+ x: canvasWidth / 2 - size / 2,
+ y: canvasHeight / 2 - size / 2
+ };
+ }
+
+ for (let tries = 0; tries < 100; tries++) {
+ const base = existingPositions[Math.floor(Math.random() * existingPositions.length)];
+ for (let i = 0; i < k; i++) {
+ const angle = Math.random() * Math.PI * 2;
+ const radius = minDist + Math.random() * minDist;
+ const x = base.x + Math.cos(angle) * radius;
+ const y = base.y + Math.sin(angle) * radius;
+ if (isValid(x, y)) {
+ return {
+ x: Math.max(edgePadding, Math.min(x, canvasWidth - size - edgePadding)),
+ y: Math.max(edgePadding, Math.min(y, canvasHeight - size - textSpace - edgePadding))
+ };
+ }
+ }
+ }
+
+ for (let tries = 0; tries < 100; tries++) {
+ const x = Math.random() * (canvasWidth - size - edgePadding * 2) + edgePadding;
+ const y = Math.random() * (canvasHeight - size - textSpace - edgePadding * 2) + edgePadding;
+ if (isValid(x, y)) {
+ return {
+ x: Math.max(edgePadding, Math.min(x, canvasWidth - size - edgePadding)),
+ y: Math.max(edgePadding, Math.min(y, canvasHeight - size - textSpace - edgePadding))
+ };
+ }
+ }
+
+ return {
+ x: edgePadding,
+ y: edgePadding
+ };
+}
+
+
+function calculateCanvasSize(userCount: number, avatarSize: number): { width: number, height: number; } {
+ const padding = 50;
+ const textSpace = 60;
+ const itemWidth = avatarSize + padding;
+ const itemHeight = avatarSize + textSpace + padding;
+ const aspectRatio = 16 / 9;
+ const cols = Math.ceil(Math.sqrt(userCount * aspectRatio));
+ const rows = Math.ceil(userCount / cols);
+
+ return {
+ width: Math.max(1000, cols * itemWidth + padding),
+ height: Math.max(700, rows * itemHeight + padding)
+ };
+}
From e2be554848a1d1b1919c543531c1a2e2b54d90f1 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Mon, 16 Jun 2025 20:20:26 -0400
Subject: [PATCH 039/845] FriendCloud: Fully Remove V1
---
src/equicordplugins/friendCloud/index.ts | 7 -------
1 file changed, 7 deletions(-)
diff --git a/src/equicordplugins/friendCloud/index.ts b/src/equicordplugins/friendCloud/index.ts
index 4972f6d1a..b40e87879 100644
--- a/src/equicordplugins/friendCloud/index.ts
+++ b/src/equicordplugins/friendCloud/index.ts
@@ -64,17 +64,10 @@ export default definePlugin({
description: "Number of users to display",
type: ApplicationCommandOptionType.NUMBER,
required: false
- },
- {
- name: "algorithm",
- description: "Use the old algorithm (v1) to calculate affinity",
- type: ApplicationCommandOptionType.BOOLEAN,
- required: false
}
],
execute: async (opts, cmdCtx) => {
const count = findOption(opts, "count", 25);
- const useV1 = findOption(opts, "algorithm", false);
if (!count) return sendBotMessage(cmdCtx.channel.id, { content: "The count must be 1 or higher!" });
From 522e2b5b8ff3026edecebf11e9c09a73a431b4fd Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Tue, 17 Jun 2025 00:04:19 -0400
Subject: [PATCH 040/845] Patch Fixes
---
.../customUserColors/index.tsx | 2 +-
src/equicordplugins/equicordHelper/index.tsx | 9 +++++++
.../fixFileExtensions/index.tsx | 6 +----
src/equicordplugins/moreStickers/upload.ts | 26 +++----------------
src/equicordplugins/vencordRPC/index.ts | 10 ++++---
src/plugins/anonymiseFileNames/index.tsx | 6 +----
src/plugins/ircColors/index.ts | 2 +-
src/plugins/noBlockedMessages/index.ts | 2 +-
src/plugins/quickReply/index.ts | 3 ---
src/webpack/common/stores.ts | 1 +
10 files changed, 24 insertions(+), 43 deletions(-)
diff --git a/src/equicordplugins/customUserColors/index.tsx b/src/equicordplugins/customUserColors/index.tsx
index f77749e5b..c9dae89e5 100644
--- a/src/equicordplugins/customUserColors/index.tsx
+++ b/src/equicordplugins/customUserColors/index.tsx
@@ -96,7 +96,7 @@ export default definePlugin({
find: '="SYSTEM_TAG"',
replacement: {
// Override colorString with our custom color and disable gradients if applying the custom color.
- match: /&&null!=\i\.secondaryColor,(?<=colorString:(\i).+?(\i)=.+?)/,
+ match: /useContext\(\i\.\i\),(?<=colorString:(\i).+?(\i)=.+?)/,
replace: (m, colorString, hasGradientColors) => `${m}` +
`vcCustomUserColorsDummy=[${colorString},${hasGradientColors}]=$self.getMessageColorsVariables(arguments[0],${hasGradientColors}),`
},
diff --git a/src/equicordplugins/equicordHelper/index.tsx b/src/equicordplugins/equicordHelper/index.tsx
index 7b50c43aa..0fe811ad0 100644
--- a/src/equicordplugins/equicordHelper/index.tsx
+++ b/src/equicordplugins/equicordHelper/index.tsx
@@ -50,6 +50,7 @@ export default definePlugin({
settings,
required: true,
patches: [
+ // Fixes Unknown Resolution/FPS Crashing
{
find: "Unknown resolution:",
replacement: [
@@ -62,6 +63,14 @@ export default definePlugin({
replace: "return $1;"
}
]
+ },
+ // Adds getRelationships Back To The RelationshipStore
+ {
+ find: "getRelationshipCount(){",
+ replacement: {
+ match: /(?<=getRelationshipCount\(\)\{.{0,25}\})(?=.*?getFriendIDs\(\)\{.{0,25}.keys\((\i)\))/,
+ replace: "getRelationships(){return $1}"
+ }
}
],
start() {
diff --git a/src/equicordplugins/fixFileExtensions/index.tsx b/src/equicordplugins/fixFileExtensions/index.tsx
index e4664a7e3..705093163 100644
--- a/src/equicordplugins/fixFileExtensions/index.tsx
+++ b/src/equicordplugins/fixFileExtensions/index.tsx
@@ -32,12 +32,8 @@ export default definePlugin({
patches: [
// Taken from AnonymiseFileNames
{
- find: "async uploadFiles(",
+ find: "async uploadFilesSimple(",
replacement: [
- {
- match: /async uploadFiles\((\i),\i\){/,
- replace: "$&$1.forEach($self.fixExt);"
- },
{
match: /async uploadFilesSimple\((\i)\){/,
replace: "$&$1.forEach($self.fixExt);"
diff --git a/src/equicordplugins/moreStickers/upload.ts b/src/equicordplugins/moreStickers/upload.ts
index 59ad2d095..6b924197d 100644
--- a/src/equicordplugins/moreStickers/upload.ts
+++ b/src/equicordplugins/moreStickers/upload.ts
@@ -6,13 +6,11 @@
import { FFmpeg } from "@ffmpeg/ffmpeg";
import { fetchFile } from "@ffmpeg/util";
-import { findByPropsLazy, findLazy } from "@webpack";
+import { findByPropsLazy } from "@webpack";
import { ChannelStore, UploadHandler } from "@webpack/common";
import { FFmpegState, Sticker } from "./types";
-const MessageUpload = findByPropsLazy("uploadFiles");
-const CloudUpload = findLazy(m => m.prototype?.trackUploadFinished);
const PendingReplyStore = findByPropsLazy("getPendingReply");
const MessageUtils = findByPropsLazy("sendMessage");
const DraftStore = findByPropsLazy("getDraft", "getState");
@@ -159,26 +157,8 @@ export async function sendSticker({
file = new File([processedImage], filename!, { type: mimeType });
}
- if (ctrlKey) {
- UploadHandler.promptToUpload([file], ChannelStore.getChannel(channelId), 0);
- return;
- }
-
- MessageUpload.uploadFiles({
- channelId,
- draftType: 0,
- hasSpoiler: false,
- options: messageOptions || {},
- parsedMessage: {
- content: messageContent
- },
- uploads: [
- new CloudUpload({
- file,
- platform: 1
- }, channelId, false, 0)
- ]
- });
+ UploadHandler.promptToUpload([file], ChannelStore.getChannel(channelId), 0);
+ return;
} else if (shiftKey) {
if (!messageContent.endsWith(" ") || !messageContent.endsWith("\n")) messageContent += " ";
messageContent += sticker.image;
diff --git a/src/equicordplugins/vencordRPC/index.ts b/src/equicordplugins/vencordRPC/index.ts
index d1900df0b..ed6ec655b 100644
--- a/src/equicordplugins/vencordRPC/index.ts
+++ b/src/equicordplugins/vencordRPC/index.ts
@@ -192,15 +192,17 @@ function isTimestampDisabled() {
function onlineFriendCount(): number {
let onlineFriends = 0;
- const relationships = RelationshipStore.getRelationships();
- for (const id in relationships) {
- if (relationships[id] === 1 && PresenceStore.getStatus(id) !== "offline") onlineFriends++;
+ const relationships = RelationshipStore.getFriendIDs();
+ for (const id of relationships) {
+ if (PresenceStore.getStatus(id) !== "offline") {
+ onlineFriends++;
+ }
}
return onlineFriends;
}
function totalFriendCount(): number {
- return Object.values(RelationshipStore.getRelationships()).filter(r => r === 1).length;
+ return RelationshipStore.getFriendCount();
}
function memberCount(): string {
diff --git a/src/plugins/anonymiseFileNames/index.tsx b/src/plugins/anonymiseFileNames/index.tsx
index 51e3e5caa..e0372b9c4 100644
--- a/src/plugins/anonymiseFileNames/index.tsx
+++ b/src/plugins/anonymiseFileNames/index.tsx
@@ -79,12 +79,8 @@ export default definePlugin({
patches: [
{
- find: "async uploadFiles(",
+ find: "async uploadFilesSimple(",
replacement: [
- {
- match: /async uploadFiles\((\i),\i\){/,
- replace: "$&$1.forEach($self.anonymise);"
- },
{
match: /async uploadFilesSimple\((\i)\){/,
replace: "$&$1.forEach($self.anonymise);"
diff --git a/src/plugins/ircColors/index.ts b/src/plugins/ircColors/index.ts
index 4f71e2286..c9d2c6133 100644
--- a/src/plugins/ircColors/index.ts
+++ b/src/plugins/ircColors/index.ts
@@ -68,7 +68,7 @@ export default definePlugin({
find: '="SYSTEM_TAG"',
replacement: {
// Override colorString with our custom color and disable gradients if applying the custom color.
- match: /&&null!=\i\.secondaryColor,(?<=colorString:(\i).+?(\i)=.+?)/,
+ match: /useContext\(\i\.\i\),(?<=colorString:(\i).+?(\i)=.+?)/,
replace: (m, colorString, hasGradientColors) => `${m}` +
`vcIrcColorsDummy=[${colorString},${hasGradientColors}]=$self.getMessageColorsVariables(arguments[0],${hasGradientColors}),`
}
diff --git a/src/plugins/noBlockedMessages/index.ts b/src/plugins/noBlockedMessages/index.ts
index d4d7b3f95..81265d411 100644
--- a/src/plugins/noBlockedMessages/index.ts
+++ b/src/plugins/noBlockedMessages/index.ts
@@ -25,7 +25,7 @@ import { findByPropsLazy } from "@webpack";
import { i18n, MessageStore } from "@webpack/common";
import { Message } from "discord-types/general";
-const RelationshipStore = findByPropsLazy("getRelationships", "isBlocked");
+const RelationshipStore = findByPropsLazy("getFriendIDs", "isBlocked");
interface MessageDeleteProps {
// Internal intl message for BLOCKED_MESSAGE_COUNT
diff --git a/src/plugins/quickReply/index.ts b/src/plugins/quickReply/index.ts
index 5a6b45f91..e5d52085d 100644
--- a/src/plugins/quickReply/index.ts
+++ b/src/plugins/quickReply/index.ts
@@ -19,14 +19,11 @@
import { definePluginSettings } from "@api/Settings";
import { Devs } from "@utils/constants";
import definePlugin, { OptionType } from "@utils/types";
-import { findByPropsLazy } from "@webpack";
import { ChannelStore, ComponentDispatch, FluxDispatcher as Dispatcher, MessageActions, MessageStore, PermissionsBits, PermissionStore, SelectedChannelStore, UserStore } from "@webpack/common";
import { Message } from "discord-types/general";
import NoBlockedMessagesPlugin from "plugins/noBlockedMessages";
import NoReplyMentionPlugin from "plugins/noReplyMention";
-const RelationshipStore = findByPropsLazy("getRelationships", "isBlocked");
-
const isMac = navigator.platform.includes("Mac"); // bruh
let currentlyReplyingId: string | null = null;
let currentlyEditingId: string | null = null;
diff --git a/src/webpack/common/stores.ts b/src/webpack/common/stores.ts
index 94484f5cf..8fd93bdee 100644
--- a/src/webpack/common/stores.ts
+++ b/src/webpack/common/stores.ts
@@ -49,6 +49,7 @@ export let TypingStore: GenericStore;
export let GuildMemberStore: Stores.GuildMemberStore & t.FluxStore;
export let RelationshipStore: Stores.RelationshipStore & t.FluxStore & {
/** Get the date (as a string) that the relationship was created */
+ getFriendCount(): number;
getSince(userId: string): string;
isIgnored(userId: string): boolean;
};
From b835d07fb19fad359b24d589fc0c8b48c932e58d Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Tue, 17 Jun 2025 00:25:03 -0400
Subject: [PATCH 041/845] Type The RelationshipStore & Fixes
---
src/equicordplugins/equicordHelper/index.tsx | 8 ------
src/plugins/implicitRelationships/index.ts | 2 +-
src/plugins/relationshipNotifier/utils.ts | 2 +-
src/plugins/serverInfo/GuildInfoModal.tsx | 4 +--
src/webpack/common/stores.ts | 7 +----
src/webpack/common/types/stores.d.ts | 28 ++++++++++++++++++++
6 files changed, 33 insertions(+), 18 deletions(-)
diff --git a/src/equicordplugins/equicordHelper/index.tsx b/src/equicordplugins/equicordHelper/index.tsx
index 0fe811ad0..08db2e993 100644
--- a/src/equicordplugins/equicordHelper/index.tsx
+++ b/src/equicordplugins/equicordHelper/index.tsx
@@ -63,14 +63,6 @@ export default definePlugin({
replace: "return $1;"
}
]
- },
- // Adds getRelationships Back To The RelationshipStore
- {
- find: "getRelationshipCount(){",
- replacement: {
- match: /(?<=getRelationshipCount\(\)\{.{0,25}\})(?=.*?getFriendIDs\(\)\{.{0,25}.keys\((\i)\))/,
- replace: "getRelationships(){return $1}"
- }
}
],
start() {
diff --git a/src/plugins/implicitRelationships/index.ts b/src/plugins/implicitRelationships/index.ts
index 9bd428e02..d332fc6c1 100644
--- a/src/plugins/implicitRelationships/index.ts
+++ b/src/plugins/implicitRelationships/index.ts
@@ -140,7 +140,7 @@ export default definePlugin({
// 2. Do not have a relationship with
await this.refreshUserAffinities();
const userAffinities: Set = UserAffinitiesStore.getUserAffinitiesUserIds();
- const relationships = RelationshipStore.getRelationships();
+ const relationships = RelationshipStore.getMutableRelationships();
const nonFriendAffinities = Array.from(userAffinities).filter(
id => !RelationshipStore.getRelationshipType(id)
);
diff --git a/src/plugins/relationshipNotifier/utils.ts b/src/plugins/relationshipNotifier/utils.ts
index 84e812a75..75cf2d3ae 100644
--- a/src/plugins/relationshipNotifier/utils.ts
+++ b/src/plugins/relationshipNotifier/utils.ts
@@ -172,7 +172,7 @@ export async function syncFriends() {
friends.friends = [];
friends.requests = [];
- const relationShips = RelationshipStore.getRelationships();
+ const relationShips = RelationshipStore.getMutableRelationships();
for (const id in relationShips) {
switch (relationShips[id]) {
case RelationshipType.FRIEND:
diff --git a/src/plugins/serverInfo/GuildInfoModal.tsx b/src/plugins/serverInfo/GuildInfoModal.tsx
index 3acb96b88..40a0a1ab3 100644
--- a/src/plugins/serverInfo/GuildInfoModal.tsx
+++ b/src/plugins/serverInfo/GuildInfoModal.tsx
@@ -255,12 +255,12 @@ function FriendsTab({ guild, setCount }: RelationshipProps) {
}
function BlockedUsersTab({ guild, setCount }: RelationshipProps) {
- const blockedIds = Object.keys(RelationshipStore.getRelationships()).filter(id => RelationshipStore.isBlocked(id));
+ const blockedIds = RelationshipStore.getBlockedIDs();
return UserList("blocked", guild, blockedIds, setCount);
}
function IgnoredUserTab({ guild, setCount }: RelationshipProps) {
- const ignoredIds = Object.keys(RelationshipStore.getRelationships()).filter(id => RelationshipStore.isIgnored(id));
+ const ignoredIds = RelationshipStore.getIgnoredIDs();
return UserList("ignored", guild, ignoredIds, setCount);
}
diff --git a/src/webpack/common/stores.ts b/src/webpack/common/stores.ts
index 8fd93bdee..b554f7acd 100644
--- a/src/webpack/common/stores.ts
+++ b/src/webpack/common/stores.ts
@@ -47,12 +47,7 @@ export let SelectedGuildStore: t.FluxStore & Record;
export let ChannelStore: Stores.ChannelStore & t.FluxStore;
export let TypingStore: GenericStore;
export let GuildMemberStore: Stores.GuildMemberStore & t.FluxStore;
-export let RelationshipStore: Stores.RelationshipStore & t.FluxStore & {
- /** Get the date (as a string) that the relationship was created */
- getFriendCount(): number;
- getSince(userId: string): string;
- isIgnored(userId: string): boolean;
-};
+export let RelationshipStore: t.RelationshipStore;
export let EmojiStore: t.EmojiStore;
export let StickersStore: t.StickersStore;
diff --git a/src/webpack/common/types/stores.d.ts b/src/webpack/common/types/stores.d.ts
index c54811b01..9c7583e26 100644
--- a/src/webpack/common/types/stores.d.ts
+++ b/src/webpack/common/types/stores.d.ts
@@ -188,6 +188,34 @@ export class StickersStore extends FluxStore {
getStickersByGuildId(id: string): Sticker[] | undefined;
}
+export class RelationshipStore extends RelationshipStore {
+ isFriend(userId: string): boolean;
+ isBlockedOrIgnored(userId: string): boolean;
+ isBlockedOrIgnoredForMessage(userId: string): boolean;
+ isBlocked(userId: string): boolean;
+ isBlockedForMessage(userId: string): boolean;
+ isIgnored(userId: string): boolean;
+ isIgnoredForMessage(userId: string): boolean;
+ isUnfilteredPendingIncoming(userId: string): boolean;
+ getPendingCount(): number;
+ getSpamCount(): number;
+ getPendingIgnoredCount(): number;
+ getOutgoingCount(): number;
+ getFriendCount(): number;
+ getRelationshipCount(): number;
+ getMutableRelationships(): Record;
+ getVersion(): number;
+ isSpam(userId): boolean;
+ getRelationshipType(userId: string): number;
+ getNickname(userId: string): string;
+ getSince(userId: string): string;
+ getSinces(): Record;
+ getFriendIDs(): string[];
+ getBlockedIDs(): string[];
+ getIgnoredIDs(): string[];
+ getBlockedOrIgnoredIDs(): string[];
+}
+
export interface DraftObject {
channelId: string;
timestamp: number;
From 8d2984442cfac9d413d5b2571bf4e47bfcb4870b Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Tue, 17 Jun 2025 00:27:14 -0400
Subject: [PATCH 042/845] Fix Lint
---
src/webpack/common/types/stores.d.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/webpack/common/types/stores.d.ts b/src/webpack/common/types/stores.d.ts
index 9c7583e26..98e230f68 100644
--- a/src/webpack/common/types/stores.d.ts
+++ b/src/webpack/common/types/stores.d.ts
@@ -188,7 +188,7 @@ export class StickersStore extends FluxStore {
getStickersByGuildId(id: string): Sticker[] | undefined;
}
-export class RelationshipStore extends RelationshipStore {
+export class RelationshipStore extends FluxStore {
isFriend(userId: string): boolean;
isBlockedOrIgnored(userId: string): boolean;
isBlockedOrIgnoredForMessage(userId: string): boolean;
From 727abb429eaff25ec3d9dc5d7d86060299f5ce61 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Tue, 17 Jun 2025 00:34:25 -0400
Subject: [PATCH 043/845] PrivateChannelsStore -> ChannelActionCreators
---
src/equicordplugins/bypassStatus/index.tsx | 4 ++--
src/equicordplugins/encryptcord/index.tsx | 8 ++++----
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/equicordplugins/bypassStatus/index.tsx b/src/equicordplugins/bypassStatus/index.tsx
index 8d5c22bc0..f9bec6e3d 100644
--- a/src/equicordplugins/bypassStatus/index.tsx
+++ b/src/equicordplugins/bypassStatus/index.tsx
@@ -11,7 +11,7 @@ import { Devs } from "@utils/constants";
import { getCurrentChannel } from "@utils/discord";
import { Logger } from "@utils/Logger";
import definePlugin, { OptionType } from "@utils/types";
-import { ChannelStore, Menu, MessageStore, NavigationRouter, PresenceStore, PrivateChannelsStore, UserStore, WindowStore } from "@webpack/common";
+import { ChannelActionCreators, ChannelStore, Menu, MessageStore, NavigationRouter, PresenceStore, UserStore, WindowStore } from "@webpack/common";
import type { Message } from "discord-types/general";
import { JSX } from "react";
@@ -163,7 +163,7 @@ export default definePlugin({
if ((settings.store.guilds.split(", ").includes(guildId) || settings.store.channels.split(", ").includes(channelId)) && mentioned) {
await showNotification(message, guildId);
} else if (settings.store.users.split(", ").includes(message.author.id)) {
- const userChannelId = await PrivateChannelsStore.getOrEnsurePrivateChannel(message.author.id);
+ const userChannelId = await ChannelActionCreators.getOrEnsurePrivateChannel(message.author.id);
if (channelId === userChannelId || (mentioned && settings.store.allowOutsideOfDms === true)) {
await showNotification(message, guildId);
}
diff --git a/src/equicordplugins/encryptcord/index.tsx b/src/equicordplugins/encryptcord/index.tsx
index 1f260ca49..a8d760ea8 100644
--- a/src/equicordplugins/encryptcord/index.tsx
+++ b/src/equicordplugins/encryptcord/index.tsx
@@ -16,8 +16,8 @@ import { Devs, EquicordDevs } from "@utils/constants";
import { sleep } from "@utils/misc";
import definePlugin from "@utils/types";
import {
- FluxDispatcher, MessageActions,
- PrivateChannelsStore, RestAPI,
+ ChannelActionCreators,
+ FluxDispatcher, MessageActions, RestAPI,
SnowflakeUtils,
useEffect, UserStore,
UserUtils, useState,
@@ -201,7 +201,7 @@ export default definePlugin({
}
return;
}
- const dmChannelId = await PrivateChannelsStore.getOrEnsurePrivateChannel(message.author.id);
+ const dmChannelId = await ChannelActionCreators.getOrEnsurePrivateChannel(message.author.id);
if (channelId !== dmChannelId) return;
const sender = await UserUtils.getUser(message.author.id).catch(() => null);
if (!sender) return;
@@ -282,7 +282,7 @@ export default definePlugin({
// Send Temporary Message
async function sendTempMessage(recipientId: string, attachment: string, content: string, dm: boolean = true) {
if (recipientId === UserStore.getCurrentUser().id) return;
- const channelId = dm ? await PrivateChannelsStore.getOrEnsurePrivateChannel(recipientId) : recipientId;
+ const channelId = dm ? await ChannelActionCreators.getOrEnsurePrivateChannel(recipientId) : recipientId;
if (attachment && attachment !== "") {
const upload = await new CloudUpload({
file: new File([new Blob([attachment])], "file.text", { type: "text/plain; charset=utf-8" }),
From 9e588eeb779f722dc2b015e60a517c31e0356755 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Tue, 17 Jun 2025 09:08:35 -0400
Subject: [PATCH 044/845] Fix Patches AGAIN!!!!
---
src/equicordplugins/fixFileExtensions/index.tsx | 4 ++--
src/plugins/anonymiseFileNames/index.tsx | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/equicordplugins/fixFileExtensions/index.tsx b/src/equicordplugins/fixFileExtensions/index.tsx
index 705093163..b570d8287 100644
--- a/src/equicordplugins/fixFileExtensions/index.tsx
+++ b/src/equicordplugins/fixFileExtensions/index.tsx
@@ -32,10 +32,10 @@ export default definePlugin({
patches: [
// Taken from AnonymiseFileNames
{
- find: "async uploadFilesSimple(",
+ find: "async uploadFiles(",
replacement: [
{
- match: /async uploadFilesSimple\((\i)\){/,
+ match: /async uploadFiles\((\i)\){/,
replace: "$&$1.forEach($self.fixExt);"
}
],
diff --git a/src/plugins/anonymiseFileNames/index.tsx b/src/plugins/anonymiseFileNames/index.tsx
index e0372b9c4..fae1a2e11 100644
--- a/src/plugins/anonymiseFileNames/index.tsx
+++ b/src/plugins/anonymiseFileNames/index.tsx
@@ -79,10 +79,10 @@ export default definePlugin({
patches: [
{
- find: "async uploadFilesSimple(",
+ find: "async uploadFiles(",
replacement: [
{
- match: /async uploadFilesSimple\((\i)\){/,
+ match: /async uploadFiles\((\i)\){/,
replace: "$&$1.forEach($self.anonymise);"
}
],
From 24787d33ce77825d0269863d6796c5934864bf79 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Tue, 17 Jun 2025 15:52:19 -0400
Subject: [PATCH 045/845] ShowMeYourName: ShowGradient Setting
---
src/plugins/showMeYourName/index.tsx | 13 ++++++++++---
src/plugins/showMeYourName/styles.css | 5 +++++
2 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/src/plugins/showMeYourName/index.tsx b/src/plugins/showMeYourName/index.tsx
index 7011b06b4..6241bdcf5 100644
--- a/src/plugins/showMeYourName/index.tsx
+++ b/src/plugins/showMeYourName/index.tsx
@@ -66,6 +66,11 @@ const settings = definePluginSettings({
description: "Show usernames in emoji reactions",
restartNeeded: true
},
+ showGradient: {
+ type: OptionType.BOOLEAN,
+ default: true,
+ description: "Whether to show gradient for suffix",
+ },
});
function getUsername(user: any, guildId: string): string {
@@ -81,7 +86,7 @@ function getUsername(user: any, guildId: string): string {
export default definePlugin({
name: "ShowMeYourName",
description: "Display usernames next to nicks, or no nicks at all",
- authors: [Devs.Rini, Devs.TheKodeToad],
+ authors: [Devs.Rini, Devs.TheKodeToad, Devs.nyx],
patches: [
{
find: '"BaseUsername"',
@@ -130,14 +135,16 @@ export default definePlugin({
const { nick } = author;
const prefix = withMentionPrefix ? "@" : "";
+ const classes = settings.store.showGradient ? "vc-smyn-suffix" : "vc-smyn-suffix vc-smyn-hide-gradient";
+
if (isRepliedMessage && !settings.store.inReplies || username.toLowerCase() === nick.toLowerCase())
return <>{prefix}{nick}>;
if (settings.store.mode === "user-nick")
- return <>{prefix}{username} {nick} >;
+ return <>{prefix}{username} {nick} >;
if (settings.store.mode === "nick-user")
- return <>{prefix}{nick} {username} >;
+ return <>{prefix}{nick} {username} >;
return <>{prefix}{username}>;
} catch {
diff --git a/src/plugins/showMeYourName/styles.css b/src/plugins/showMeYourName/styles.css
index 7a1455d90..7cf5acca5 100644
--- a/src/plugins/showMeYourName/styles.css
+++ b/src/plugins/showMeYourName/styles.css
@@ -9,3 +9,8 @@
.vc-smyn-suffix::after {
content: ")";
}
+
+.vc-smyn-hide-gradient {
+ -webkit-text-fill-color: initial;
+ isolation: isolate;
+}
From d100c6c7862784d0605a480f6c0e2575542efe95 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Tue, 17 Jun 2025 15:54:19 -0400
Subject: [PATCH 046/845] Make ShowGradient's Default False
---
src/plugins/showMeYourName/index.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/plugins/showMeYourName/index.tsx b/src/plugins/showMeYourName/index.tsx
index 6241bdcf5..c86289673 100644
--- a/src/plugins/showMeYourName/index.tsx
+++ b/src/plugins/showMeYourName/index.tsx
@@ -68,7 +68,7 @@ const settings = definePluginSettings({
},
showGradient: {
type: OptionType.BOOLEAN,
- default: true,
+ default: false,
description: "Whether to show gradient for suffix",
},
});
From 8d97863db6d1c6e628a057e3cb66ea1634d0a3f9 Mon Sep 17 00:00:00 2001
From: Vendicated
Date: Tue, 17 Jun 2025 21:58:12 +0200
Subject: [PATCH 047/845] Fix ImplicitRelationships, RelationshipNotifier &
ServerInfo
---
src/plugins/implicitRelationships/index.ts | 18 ++++++++----------
src/plugins/noBlockedMessages/index.ts | 5 +----
src/plugins/quickReply/index.ts | 4 ----
src/plugins/relationshipNotifier/utils.ts | 2 +-
src/plugins/serverInfo/GuildInfoModal.tsx | 4 ++--
src/webpack/common/stores.ts | 6 +-----
src/webpack/common/types/stores.d.ts | 17 +++++++++++++++++
7 files changed, 30 insertions(+), 26 deletions(-)
diff --git a/src/plugins/implicitRelationships/index.ts b/src/plugins/implicitRelationships/index.ts
index 13c12ed94..edaf4be95 100644
--- a/src/plugins/implicitRelationships/index.ts
+++ b/src/plugins/implicitRelationships/index.ts
@@ -23,7 +23,7 @@ import { findStoreLazy } from "@webpack";
import { Constants, FluxDispatcher, GuildStore, RelationshipStore, RestAPI, SnowflakeUtils, UserStore } from "@webpack/common";
import { Settings } from "Vencord";
-const UserAffinitiesStore = findStoreLazy("UserAffinitiesStore");
+const UserAffinitiesStore = findStoreLazy("UserAffinitiesV2Store");
export default definePlugin({
name: "ImplicitRelationships",
@@ -117,7 +117,7 @@ export default definePlugin({
wrapSort(comparator: Function, row: any) {
return row.type === 5
- ? -(UserAffinitiesStore.getUserAffinity(row.user.id)?.affinity ?? 0)
+ ? (UserAffinitiesStore.getUserAffinity(row.user.id)?.communicationRank ?? 0)
: comparator(row);
},
@@ -139,17 +139,15 @@ export default definePlugin({
// 1. Have an affinity for
// 2. Do not have a relationship with
await this.refreshUserAffinities();
- const userAffinities: Set = UserAffinitiesStore.getUserAffinitiesUserIds();
- const relationships = RelationshipStore.getRelationships();
- const nonFriendAffinities = Array.from(userAffinities).filter(
- id => !RelationshipStore.getRelationshipType(id)
- );
- nonFriendAffinities.forEach(id => {
- relationships[id] = 5;
+ const userAffinities: Record[] = UserAffinitiesStore.getUserAffinities();
+ const relationships = RelationshipStore.getMutableRelationships();
+ const nonFriendAffinities = userAffinities.filter(a => !RelationshipStore.getRelationshipType(a.otherUserId));
+ nonFriendAffinities.forEach(a => {
+ relationships[a.otherUserId] = 5;
});
RelationshipStore.emitChange();
- const toRequest = nonFriendAffinities.filter(id => !UserStore.getUser(id));
+ const toRequest = nonFriendAffinities.filter(a => !UserStore.getUser(a.otherUserId));
const allGuildIds = Object.keys(GuildStore.getGuilds());
const sentNonce = SnowflakeUtils.fromTimestamp(Date.now());
let count = allGuildIds.length * Math.ceil(toRequest.length / 100);
diff --git a/src/plugins/noBlockedMessages/index.ts b/src/plugins/noBlockedMessages/index.ts
index efa4ed082..973e3796e 100644
--- a/src/plugins/noBlockedMessages/index.ts
+++ b/src/plugins/noBlockedMessages/index.ts
@@ -21,12 +21,9 @@ import { Devs } from "@utils/constants";
import { runtimeHashMessageKey } from "@utils/intlHash";
import { Logger } from "@utils/Logger";
import definePlugin, { OptionType } from "@utils/types";
-import { findByPropsLazy } from "@webpack";
-import { i18n } from "@webpack/common";
+import { i18n, RelationshipStore } from "@webpack/common";
import { Message } from "discord-types/general";
-const RelationshipStore = findByPropsLazy("getRelationships", "isBlocked");
-
interface MessageDeleteProps {
// Internal intl message for BLOCKED_MESSAGE_COUNT
collapsedReason: () => any;
diff --git a/src/plugins/quickReply/index.ts b/src/plugins/quickReply/index.ts
index 5a6b45f91..dcd2038c3 100644
--- a/src/plugins/quickReply/index.ts
+++ b/src/plugins/quickReply/index.ts
@@ -19,19 +19,15 @@
import { definePluginSettings } from "@api/Settings";
import { Devs } from "@utils/constants";
import definePlugin, { OptionType } from "@utils/types";
-import { findByPropsLazy } from "@webpack";
import { ChannelStore, ComponentDispatch, FluxDispatcher as Dispatcher, MessageActions, MessageStore, PermissionsBits, PermissionStore, SelectedChannelStore, UserStore } from "@webpack/common";
import { Message } from "discord-types/general";
import NoBlockedMessagesPlugin from "plugins/noBlockedMessages";
import NoReplyMentionPlugin from "plugins/noReplyMention";
-const RelationshipStore = findByPropsLazy("getRelationships", "isBlocked");
-
const isMac = navigator.platform.includes("Mac"); // bruh
let currentlyReplyingId: string | null = null;
let currentlyEditingId: string | null = null;
-
const enum MentionOptions {
DISABLED,
ENABLED,
diff --git a/src/plugins/relationshipNotifier/utils.ts b/src/plugins/relationshipNotifier/utils.ts
index 84e812a75..75cf2d3ae 100644
--- a/src/plugins/relationshipNotifier/utils.ts
+++ b/src/plugins/relationshipNotifier/utils.ts
@@ -172,7 +172,7 @@ export async function syncFriends() {
friends.friends = [];
friends.requests = [];
- const relationShips = RelationshipStore.getRelationships();
+ const relationShips = RelationshipStore.getMutableRelationships();
for (const id in relationShips) {
switch (relationShips[id]) {
case RelationshipType.FRIEND:
diff --git a/src/plugins/serverInfo/GuildInfoModal.tsx b/src/plugins/serverInfo/GuildInfoModal.tsx
index 60401b716..8300380d3 100644
--- a/src/plugins/serverInfo/GuildInfoModal.tsx
+++ b/src/plugins/serverInfo/GuildInfoModal.tsx
@@ -220,12 +220,12 @@ function FriendsTab({ guild, setCount }: RelationshipProps) {
}
function BlockedUsersTab({ guild, setCount }: RelationshipProps) {
- const blockedIds = Object.keys(RelationshipStore.getRelationships()).filter(id => RelationshipStore.isBlocked(id));
+ const blockedIds = Object.keys(RelationshipStore.getMutableRelationships()).filter(id => RelationshipStore.isBlocked(id));
return UserList("blocked", guild, blockedIds, setCount);
}
function IgnoredUserTab({ guild, setCount }: RelationshipProps) {
- const ignoredIds = Object.keys(RelationshipStore.getRelationships()).filter(id => RelationshipStore.isIgnored(id));
+ const ignoredIds = Object.keys(RelationshipStore.getMutableRelationships()).filter(id => RelationshipStore.isIgnored(id));
return UserList("ignored", guild, ignoredIds, setCount);
}
diff --git a/src/webpack/common/stores.ts b/src/webpack/common/stores.ts
index 1dcda1870..e0c00f6de 100644
--- a/src/webpack/common/stores.ts
+++ b/src/webpack/common/stores.ts
@@ -46,11 +46,7 @@ export let SelectedChannelStore: Stores.SelectedChannelStore & t.FluxStore;
export let SelectedGuildStore: t.FluxStore & Record;
export let ChannelStore: Stores.ChannelStore & t.FluxStore;
export let GuildMemberStore: Stores.GuildMemberStore & t.FluxStore;
-export let RelationshipStore: Stores.RelationshipStore & t.FluxStore & {
- /** Get the date (as a string) that the relationship was created */
- getSince(userId: string): string;
- isIgnored(userId: string): boolean;
-};
+export let RelationshipStore: t.RelationshipStore;
export let EmojiStore: t.EmojiStore;
export let ThemeStore: t.ThemeStore;
diff --git a/src/webpack/common/types/stores.d.ts b/src/webpack/common/types/stores.d.ts
index 67148303b..497de739f 100644
--- a/src/webpack/common/types/stores.d.ts
+++ b/src/webpack/common/types/stores.d.ts
@@ -233,3 +233,20 @@ export type useStateFromStores = (
dependencies?: any,
isEqual?: (old: T, newer: T) => boolean
) => T;
+
+export class RelationshipStore extends FluxStore {
+ getFriendIDs(): string[];
+ /** Related to friend nicknames experiment. */
+ getNickname(userId: string): string;
+ getPendingCount(): number;
+ getRelationshipCount(): number;
+ /** @returns Enum value from constants.RelationshipTypes */
+ getRelationshipType(userId: string): number;
+ /** @returns Format: [userId: Enum value from constants.RelationshipTypes] */
+ getMutableRelationships(): Record;
+ isBlocked(userId: string): boolean;
+ isFriend(userId: string): boolean;
+
+ getSince(userId: string): string;
+ isIgnored(userId: string): boolean;
+}
From a6c1f97d12311a7379ffa39fb07db030a20a226d Mon Sep 17 00:00:00 2001
From: Vendicated
Date: Tue, 17 Jun 2025 22:03:13 +0200
Subject: [PATCH 048/845] Fix AnonymiseFileNames
---
src/plugins/anonymiseFileNames/index.tsx | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/src/plugins/anonymiseFileNames/index.tsx b/src/plugins/anonymiseFileNames/index.tsx
index d24de222f..8237be8b2 100644
--- a/src/plugins/anonymiseFileNames/index.tsx
+++ b/src/plugins/anonymiseFileNames/index.tsx
@@ -75,11 +75,7 @@ export default definePlugin({
find: "async uploadFiles(",
replacement: [
{
- match: /async uploadFiles\((\i),\i\){/,
- replace: "$&$1.forEach($self.anonymise);"
- },
- {
- match: /async uploadFilesSimple\((\i)\){/,
+ match: /async uploadFiles\((\i)\){/,
replace: "$&$1.forEach($self.anonymise);"
}
],
From 0444831073d9a6d9b165dbdfb9e220c79642ee9b Mon Sep 17 00:00:00 2001
From: Vendicated
Date: Tue, 17 Jun 2025 22:15:11 +0200
Subject: [PATCH 049/845] RoleColorEverywhere: fix chat mentions
---
src/plugins/roleColorEverywhere/index.tsx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/plugins/roleColorEverywhere/index.tsx b/src/plugins/roleColorEverywhere/index.tsx
index dc60bb645..61ea7868c 100644
--- a/src/plugins/roleColorEverywhere/index.tsx
+++ b/src/plugins/roleColorEverywhere/index.tsx
@@ -84,8 +84,8 @@ export default definePlugin({
find: ".USER_MENTION)",
replacement: [
{
- match: /(?<=onContextMenu:\i,color:)\i(?<=\.getNickname\((\i),\i,(\i).+?)/,
- replace: "$self.getColorInt($2?.id,$1)",
+ match: /(?<=user:(\i),guildId:([^,]+?),.{0,100}?children:\i=>\i)\((\i)\)/,
+ replace: "({...$3,color:$self.getColorInt($1?.id,$2)})",
}
],
predicate: () => settings.store.chatMentions
From 7779e5a1ecf24b74eb2171e2483f2d3826c18ea6 Mon Sep 17 00:00:00 2001
From: Vendicated
Date: Tue, 17 Jun 2025 22:37:56 +0200
Subject: [PATCH 050/845] fix IrcColors
---
src/plugins/ircColors/index.ts | 50 +++++++++++++++++++++++-----------
1 file changed, 34 insertions(+), 16 deletions(-)
diff --git a/src/plugins/ircColors/index.ts b/src/plugins/ircColors/index.ts
index d543c9950..d0d020af3 100644
--- a/src/plugins/ircColors/index.ts
+++ b/src/plugins/ircColors/index.ts
@@ -67,9 +67,8 @@ export default definePlugin({
find: '="SYSTEM_TAG"',
replacement: {
// Override colorString with our custom color and disable gradients if applying the custom color.
- match: /&&null!=\i\.secondaryColor,(?<=colorString:(\i).+?(\i)=.+?)/,
- replace: (m, colorString, hasGradientColors) => `${m}` +
- `vcIrcColorsDummy=[${colorString},${hasGradientColors}]=$self.getMessageColorsVariables(arguments[0],${hasGradientColors}),`
+ match: /(?<=colorString:\i,colorStrings:\i,colorRoleName:\i}=)(\i),/,
+ replace: "$self.wrapMessageColorProps($1, arguments[0]),"
}
},
{
@@ -82,11 +81,26 @@ export default definePlugin({
}
],
- getMessageColorsVariables(context: any, hasGradientColors: boolean) {
- const colorString = this.calculateNameColorForMessageContext(context);
- const originalColorString = context?.author?.colorString;
+ wrapMessageColorProps(colorProps: { colorString: string, colorStrings?: Record<"primaryColor" | "secondaryColor" | "tertiaryColor", string>; }, context: any) {
+ try {
+ const colorString = this.calculateNameColorForMessageContext(context);
+ if (colorString === colorProps.colorString) {
+ return colorProps;
+ }
- return [colorString, hasGradientColors && colorString === originalColorString];
+ return {
+ ...colorProps,
+ colorString,
+ colorStrings: colorProps.colorStrings && {
+ primaryColor: colorString,
+ secondaryColor: undefined,
+ tertiaryColor: undefined
+ }
+ };
+ } catch (e) {
+ console.error("Failed to calculate message color strings:", e);
+ return colorProps;
+ }
},
calculateNameColorForMessageContext(context: any) {
@@ -108,16 +122,20 @@ export default definePlugin({
},
calculateNameColorForListContext(context: any) {
- const id = context?.user?.id;
- const colorString = context?.colorString;
- const color = calculateNameColorForUser(id);
+ try {
+ const id = context?.user?.id;
+ const colorString = context?.colorString;
+ const color = calculateNameColorForUser(id);
- if (settings.store.applyColorOnlyInDms && !context?.channel?.isPrivate()) {
- return colorString;
+ if (settings.store.applyColorOnlyInDms && !context?.channel?.isPrivate()) {
+ return colorString;
+ }
+
+ return (!settings.store.applyColorOnlyToUsersWithoutColor || !colorString)
+ ? color
+ : colorString;
+ } catch (e) {
+ console.error("Failed to calculate name color for list context:", e);
}
-
- return (!settings.store.applyColorOnlyToUsersWithoutColor || !colorString)
- ? color
- : colorString;
}
});
From ee16f4b8d861a3c20a0a080758161ff04a388d56 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Tue, 17 Jun 2025 17:09:14 -0400
Subject: [PATCH 051/845] Fix CustomUserColors
---
.../customUserColors/index.tsx | 32 ++++++++++++++-----
1 file changed, 24 insertions(+), 8 deletions(-)
diff --git a/src/equicordplugins/customUserColors/index.tsx b/src/equicordplugins/customUserColors/index.tsx
index c9dae89e5..6ee2074b3 100644
--- a/src/equicordplugins/customUserColors/index.tsx
+++ b/src/equicordplugins/customUserColors/index.tsx
@@ -61,7 +61,7 @@ const userContextMenuPatch: NavContextMenuPatchCallback = (children, { user }: {
};
-export function getCustomColorString(userId: string, withHash?: boolean): string | undefined {
+export function getCustomColorString(userId: string | undefined, withHash?: boolean): string | undefined {
if (!userId) return;
if (!colors[userId] || !Settings.plugins.CustomUserColors.enabled) return;
if (withHash) return `#${colors[userId]}`;
@@ -96,9 +96,8 @@ export default definePlugin({
find: '="SYSTEM_TAG"',
replacement: {
// Override colorString with our custom color and disable gradients if applying the custom color.
- match: /useContext\(\i\.\i\),(?<=colorString:(\i).+?(\i)=.+?)/,
- replace: (m, colorString, hasGradientColors) => `${m}` +
- `vcCustomUserColorsDummy=[${colorString},${hasGradientColors}]=$self.getMessageColorsVariables(arguments[0],${hasGradientColors}),`
+ match: /(?<=colorString:\i,colorStrings:\i,colorRoleName:\i}=)(\i),/,
+ replace: "$self.wrapMessageColorProps($1, arguments[0]),"
},
predicate: () => !Settings.plugins.IrcColors.enabled
},
@@ -133,11 +132,26 @@ export default definePlugin({
},
],
- getMessageColorsVariables(context: any, hasGradientColors: boolean) {
- const colorString = this.colorIfServer(context);
- const originalColorString = context?.author?.colorString;
+ wrapMessageColorProps(colorProps: { colorString: string, colorStrings?: Record<"primaryColor" | "secondaryColor" | "tertiaryColor", string>; }, context: any) {
+ try {
+ const colorString = this.colorIfServer(context);
+ if (colorString === colorProps.colorString) {
+ return colorProps;
+ }
- return [colorString, hasGradientColors && colorString === originalColorString];
+ return {
+ ...colorProps,
+ colorString,
+ colorStrings: colorProps.colorStrings && {
+ primaryColor: colorString,
+ secondaryColor: undefined,
+ tertiaryColor: undefined
+ }
+ };
+ } catch (e) {
+ console.error("Failed to calculate message color strings:", e);
+ return colorProps;
+ }
},
colorDMList(context: any): string | undefined {
@@ -150,6 +164,8 @@ export default definePlugin({
const userId = context?.message?.author?.id;
const colorString = context?.author?.colorString;
+ if (context?.message?.channel_id === "1337" && userId === "313337") return colorString;
+
if (context?.channel?.guild_id && !settings.store.colorInServers) return colorString;
const color = getCustomColorString(userId, true);
From 4b01569bc56ea29004988bce5d460d54ce067cc5 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Tue, 17 Jun 2025 17:24:34 -0400
Subject: [PATCH 052/845] CustomUserColors: No Warn
---
src/equicordplugins/customUserColors/index.tsx | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/equicordplugins/customUserColors/index.tsx b/src/equicordplugins/customUserColors/index.tsx
index 6ee2074b3..90342cc3d 100644
--- a/src/equicordplugins/customUserColors/index.tsx
+++ b/src/equicordplugins/customUserColors/index.tsx
@@ -99,7 +99,8 @@ export default definePlugin({
match: /(?<=colorString:\i,colorStrings:\i,colorRoleName:\i}=)(\i),/,
replace: "$self.wrapMessageColorProps($1, arguments[0]),"
},
- predicate: () => !Settings.plugins.IrcColors.enabled
+ predicate: () => !Settings.plugins.IrcColors.enabled,
+ noWarn: true
},
{
find: "PrivateChannel.renderAvatar",
From e4b1a196ae685a490baf561224107952c610c1f5 Mon Sep 17 00:00:00 2001
From: Etorix <92535668+EtorixDev@users.noreply.github.com>
Date: Tue, 17 Jun 2025 18:55:10 -0700
Subject: [PATCH 053/845] fix Settings::onChange being fired twice (#3496)
---
src/shared/SettingsStore.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/shared/SettingsStore.ts b/src/shared/SettingsStore.ts
index 0b6aa25b6..1d7dc7f6e 100644
--- a/src/shared/SettingsStore.ts
+++ b/src/shared/SettingsStore.ts
@@ -160,7 +160,7 @@ export class SettingsStore {
// So, we need to extract the top-level setting path (plugins.pluginName.settingName),
// to be able to notify globalListeners and top-level setting name listeners (let { settingName } = settings.use(["settingName"]),
// with the new value
- if (paths.length > 2 && paths[0] === "plugins") {
+ if (paths.length > 3 && paths[0] === "plugins") {
const settingPath = paths.slice(0, 3);
const settingPathStr = settingPath.join(".");
const settingValue = settingPath.reduce((acc, curr) => acc[curr], root);
From 04a6472e0a6d1a144978e01289645785fd6216f1 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Tue, 17 Jun 2025 22:16:16 -0400
Subject: [PATCH 054/845] Fix Patch
---
src/equicordplugins/clientSideBlock/index.tsx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/equicordplugins/clientSideBlock/index.tsx b/src/equicordplugins/clientSideBlock/index.tsx
index 722701def..6141a4c7c 100644
--- a/src/equicordplugins/clientSideBlock/index.tsx
+++ b/src/equicordplugins/clientSideBlock/index.tsx
@@ -200,8 +200,8 @@ export default definePlugin({
{
find: "getFriendIDs(){",
replacement: {
- match: /\i.FRIEND\)/,
- replace: "$&.filter(id => !$self.shouldHideUser(id))"
+ match: /getFriendIDs.{0,75}\i\.FRIEND\}\)/,
+ replace: "$&.filter(([id]) => !$self.shouldHideUser(id))"
}
},
// active now list
From 96516f113ae4c8699cdd2a362d23135968f95ede Mon Sep 17 00:00:00 2001
From: Vendicated
Date: Wed, 18 Jun 2025 15:47:55 +0200
Subject: [PATCH 055/845] ReplaceGoogleSearch: fix broken icons
---
src/plugins/implicitRelationships/index.ts | 15 +--------------
src/plugins/replaceGoogleSearch/index.tsx | 2 +-
2 files changed, 2 insertions(+), 15 deletions(-)
diff --git a/src/plugins/implicitRelationships/index.ts b/src/plugins/implicitRelationships/index.ts
index edaf4be95..4a8cf5fb9 100644
--- a/src/plugins/implicitRelationships/index.ts
+++ b/src/plugins/implicitRelationships/index.ts
@@ -20,7 +20,7 @@ import { definePluginSettings } from "@api/Settings";
import { Devs } from "@utils/constants";
import definePlugin, { OptionType } from "@utils/types";
import { findStoreLazy } from "@webpack";
-import { Constants, FluxDispatcher, GuildStore, RelationshipStore, RestAPI, SnowflakeUtils, UserStore } from "@webpack/common";
+import { Constants, FluxDispatcher, GuildStore, RelationshipStore, SnowflakeUtils, UserStore } from "@webpack/common";
import { Settings } from "Vencord";
const UserAffinitiesStore = findStoreLazy("UserAffinitiesV2Store");
@@ -121,19 +121,6 @@ export default definePlugin({
: comparator(row);
},
- async refreshUserAffinities() {
- try {
- await RestAPI.get({ url: "/users/@me/affinities/users", retries: 3 }).then(({ body }) => {
- FluxDispatcher.dispatch({
- type: "LOAD_USER_AFFINITIES_SUCCESS",
- affinities: body,
- });
- });
- } catch (e) {
- // Not a critical error if this fails for some reason
- }
- },
-
async fetchImplicitRelationships() {
// Implicit relationships are defined as users that you:
// 1. Have an affinity for
diff --git a/src/plugins/replaceGoogleSearch/index.tsx b/src/plugins/replaceGoogleSearch/index.tsx
index 593c98632..47952610f 100644
--- a/src/plugins/replaceGoogleSearch/index.tsx
+++ b/src/plugins/replaceGoogleSearch/index.tsx
@@ -69,7 +69,7 @@ function makeSearchItem(src: string) {
aria-hidden="true"
height={16}
width={16}
- src={`https://www.google.com/s2/favicons?domain=${Engines[engine]}&sz=64`}
+ src={`https://icons.duckduckgo.com/ip3/${new URL(Engines[engine]).hostname}.ico`}
/>
{engine}
From 4cd4e443788f0e097e5f5032af5f78fe6997d5b8 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Wed, 18 Jun 2025 11:53:57 -0400
Subject: [PATCH 056/845] Fix HolyNotes
---
src/components/PluginSettings/PluginModal.tsx | 2 +-
src/equicordplugins/holyNotes/NoteHandler.ts | 4 ++--
.../holyNotes/components/modals/RenderMessage.tsx | 10 ++++++----
src/equicordplugins/holyNotes/index.tsx | 5 +----
4 files changed, 10 insertions(+), 11 deletions(-)
diff --git a/src/components/PluginSettings/PluginModal.tsx b/src/components/PluginSettings/PluginModal.tsx
index 39c1f18c5..bb3528f1e 100644
--- a/src/components/PluginSettings/PluginModal.tsx
+++ b/src/components/PluginSettings/PluginModal.tsx
@@ -60,7 +60,7 @@ interface PluginModalProps extends ModalProps {
onRestartNeeded(): void;
}
-function makeDummyUser(user: { username: string; id?: string; avatar?: string; }) {
+export function makeDummyUser(user: { username: string; id?: string; avatar?: string; }) {
const newUser = new UserRecord({
username: user.username,
id: user.id ?? generateId(),
diff --git a/src/equicordplugins/holyNotes/NoteHandler.ts b/src/equicordplugins/holyNotes/NoteHandler.ts
index 2235528ea..654186db2 100644
--- a/src/equicordplugins/holyNotes/NoteHandler.ts
+++ b/src/equicordplugins/holyNotes/NoteHandler.ts
@@ -4,10 +4,10 @@
* SPDX-License-Identifier: GPL-3.0-or-later
*/
+import { makeDummyUser } from "@components/PluginSettings/PluginModal";
import { ChannelStore, lodash, Toasts, UserStore } from "@webpack/common";
import { Channel, Message } from "discord-types/general";
-import { User } from ".";
import { Discord, HolyNotes } from "./types";
import { deleteCacheFromDataStore, DeleteEntireStore, saveCacheToDataStore } from "./utils";
@@ -145,7 +145,7 @@ export default new (class NoteHandler {
for (const notebook in notebooks)
for (const noteId in notebooks[notebook]) {
const note = notebooks[notebook][noteId];
- const user = UserStore.getUser(note.author.id) ?? new User({ ...note.author });
+ const user = UserStore.getUser(note.author.id) ?? makeDummyUser(note.author);
Object.assign(notebooks[notebook][noteId].author, {
avatar: user.avatar,
diff --git a/src/equicordplugins/holyNotes/components/modals/RenderMessage.tsx b/src/equicordplugins/holyNotes/components/modals/RenderMessage.tsx
index feb8fe9e4..d27e23721 100644
--- a/src/equicordplugins/holyNotes/components/modals/RenderMessage.tsx
+++ b/src/equicordplugins/holyNotes/components/modals/RenderMessage.tsx
@@ -4,17 +4,17 @@
* SPDX-License-Identifier: GPL-3.0-or-later
*/
-import { Channel, cozyMessage, groupStart, message, MessageType, User } from "@equicordplugins/holyNotes";
+import { makeDummyUser } from "@components/PluginSettings/PluginModal";
+import { MessageType } from "@equicordplugins/holyNotes";
import { copyToClipboard } from "@utils/clipboard";
import { classes } from "@utils/misc";
import { ModalProps } from "@utils/modal";
-import { findComponentByCodeLazy } from "@webpack";
+import { findByCodeLazy, findByProps, findComponentByCodeLazy } from "@webpack";
import { ContextMenuApi, FluxDispatcher, Menu, NavigationRouter, React } from "@webpack/common";
import noteHandler from "../../NoteHandler";
import { HolyNotes } from "../../types";
-
export const RenderMessage = ({
note,
notebook,
@@ -28,6 +28,8 @@ export const RenderMessage = ({
fromDeleteModal: boolean;
closeModal?: () => void;
}) => {
+ const { message, groupStart, cozyMessage } = findByProps("cozyMessage");
+ const Channel = findByCodeLazy("computeLurkerPermissionsAllowList(){");
const ChannelMessage = findComponentByCodeLazy("Message must not be a thread");
const [isHoldingDelete, setHoldingDelete] = React.useState(false);
@@ -91,7 +93,7 @@ export const RenderMessage = ({
Object.assign(
{ ...note },
{
- author: new User({ ...note?.author }),
+ author: makeDummyUser(note?.author),
timestamp: new Date(note?.timestamp),
// @ts-ignore
embeds: note?.embeds?.map((embed: { timestamp: string | number | Date; }) =>
diff --git a/src/equicordplugins/holyNotes/index.tsx b/src/equicordplugins/holyNotes/index.tsx
index d01ba040e..71f9ed698 100644
--- a/src/equicordplugins/holyNotes/index.tsx
+++ b/src/equicordplugins/holyNotes/index.tsx
@@ -26,7 +26,7 @@ import { EquicordDevs } from "@utils/constants";
import { classes } from "@utils/misc";
import { openModal } from "@utils/modal";
import definePlugin from "@utils/types";
-import { findByCodeLazy, findByProps, findByPropsLazy, findComponentByCodeLazy } from "@webpack";
+import { findByCodeLazy, findByProps, findComponentByCodeLazy } from "@webpack";
import { ChannelStore, Menu } from "@webpack/common";
import { Message } from "discord-types/general";
@@ -35,10 +35,7 @@ import { NoteModal } from "./components/modals/Notebook";
import noteHandler, { noteHandlerCache } from "./NoteHandler";
import { DataStoreToCache, HolyNoteStore } from "./utils";
-export const User = findByCodeLazy("isSystemUser(){");
-export const { message, groupStart, cozyMessage } = findByPropsLazy("cozyMessage");
export const MessageType = findByCodeLazy("isEdited(){");
-export const Channel = findByCodeLazy("computeLurkerPermissionsAllowList(){");
const HeaderBarIcon = findComponentByCodeLazy(".HEADER_BAR_BADGE_TOP:", '.iconBadge,"top"');
From ecb8fa1b96c2104f78e129ecc2fe8cd7610cdf56 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Wed, 18 Jun 2025 16:42:23 -0400
Subject: [PATCH 057/845] Fix Patches
---
src/equicordplugins/clientSideBlock/index.tsx | 4 ++--
src/plugins/betterFolders/index.tsx | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/equicordplugins/clientSideBlock/index.tsx b/src/equicordplugins/clientSideBlock/index.tsx
index 6141a4c7c..bd5cb4a5a 100644
--- a/src/equicordplugins/clientSideBlock/index.tsx
+++ b/src/equicordplugins/clientSideBlock/index.tsx
@@ -200,8 +200,8 @@ export default definePlugin({
{
find: "getFriendIDs(){",
replacement: {
- match: /getFriendIDs.{0,75}\i\.FRIEND\}\)/,
- replace: "$&.filter(([id]) => !$self.shouldHideUser(id))"
+ match: /return \i\.friends/,
+ replace: "$&.filter(id => !$self.shouldHideUser(id))"
}
},
// active now list
diff --git a/src/plugins/betterFolders/index.tsx b/src/plugins/betterFolders/index.tsx
index 3e671ae8d..206614a5a 100644
--- a/src/plugins/betterFolders/index.tsx
+++ b/src/plugins/betterFolders/index.tsx
@@ -183,7 +183,7 @@ export default definePlugin({
},
// If we are rendering the Better Folders sidebar, we filter out everything but the Guild List from the Sidebar children
{
- match: /unreadMentionsFixedFooter\].+?\]/,
+ match: /unreadMentionsFixedFooter\].+?unreadMentionsBar\}\)\]/,
replace: "$&.filter($self.makeGuildsBarSidebarFilter(!!arguments[0]?.isBetterFolders))"
}
]
From 89be4cd54b1a9dd0cc62a08bbc880268994074e9 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Wed, 18 Jun 2025 18:13:27 -0400
Subject: [PATCH 058/845] QuestCompleter: NavBar Option
---
.../questCompleter.discordDesktop/index.tsx | 57 ++++++++++++++++++-
1 file changed, 55 insertions(+), 2 deletions(-)
diff --git a/src/equicordplugins/questCompleter.discordDesktop/index.tsx b/src/equicordplugins/questCompleter.discordDesktop/index.tsx
index 549ea700b..716391100 100644
--- a/src/equicordplugins/questCompleter.discordDesktop/index.tsx
+++ b/src/equicordplugins/questCompleter.discordDesktop/index.tsx
@@ -20,13 +20,33 @@ import "@equicordplugins/_misc/styles.css";
import "./style.css";
import { showNotification } from "@api/Notifications";
+import { definePluginSettings } from "@api/Settings";
+import { ErrorBoundary } from "@components/index";
import { Devs } from "@utils/constants";
import { getTheme, Theme } from "@utils/discord";
-import definePlugin from "@utils/types";
+import definePlugin, { OptionType } from "@utils/types";
import { findByProps, findComponentByCodeLazy } from "@webpack";
import { Button, ChannelStore, FluxDispatcher, GuildChannelStore, NavigationRouter, RestAPI, Tooltip, UserStore } from "@webpack/common";
const QuestIcon = findComponentByCodeLazy("10.47a.76.76");
+const HeaderBarIcon = findComponentByCodeLazy(".HEADER_BAR_BADGE_TOP:", '.iconBadge,"top"');
+
+
+function ToolBarHeader() {
+ return (
+
+
+
+
+ );
+}
+
async function openCompleteQuestUI() {
const ApplicationStreamingStore = findByProps("getStreamerActiveStreamMetadata");
@@ -213,17 +233,35 @@ async function openCompleteQuestUI() {
}
}
+const settings = definePluginSettings({
+ useNavBar: {
+ description: "Move quest button down to the server nav bar",
+ type: OptionType.BOOLEAN,
+ default: false,
+ }
+});
+
export default definePlugin({
name: "QuestCompleter",
description: "A plugin to complete quests without having the game installed.",
authors: [Devs.amia],
+ settings,
patches: [
{
find: "AppTitleBar",
replacement: {
match: /(?<=trailing:.{0,70}\(\i\.Fragment,{children:\[)/,
replace: "$self.renderQuestButton(),"
- }
+ },
+ predicate: () => !settings.store.useNavBar
+ },
+ {
+ find: "toolbar:function",
+ replacement: {
+ match: /(function \i\(\i\){)(.{1,200}toolbar.{1,200}mobileToolbar)/,
+ replace: "$1$self.toolbarAction(arguments[0]);$2"
+ },
+ predicate: () => settings.store.useNavBar
}
],
renderQuestButton() {
@@ -242,4 +280,19 @@ export default definePlugin({
);
},
+ toolbarAction(e) {
+ if (Array.isArray(e.toolbar))
+ return e.toolbar.push(
+
+
+
+ );
+
+ e.toolbar = [
+
+
+ ,
+ e.toolbar,
+ ];
+ }
});
From 02506b77dd0a3dab1022620cc38e9a8b88d41469 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Wed, 18 Jun 2025 19:00:30 -0400
Subject: [PATCH 059/845] Fix RelationshipNotifier?
---
src/plugins/relationshipNotifier/index.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/plugins/relationshipNotifier/index.ts b/src/plugins/relationshipNotifier/index.ts
index d913dde48..0e1aa0778 100644
--- a/src/plugins/relationshipNotifier/index.ts
+++ b/src/plugins/relationshipNotifier/index.ts
@@ -34,7 +34,7 @@ export default definePlugin({
find: "removeRelationship:(",
replacement: {
match: /(removeRelationship:\((\i),\i,\i\)=>)/,
- replace: "$1($self.removeFriend($2),0)||"
+ replace: "$1($self.removeFriend($2))||"
}
},
{
From bec0112bee0ed61840612e1f098847e30b3b2f6a Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Wed, 18 Jun 2025 22:18:45 -0400
Subject: [PATCH 060/845] Revert "Fix RelationshipNotifier?"
This reverts commit 02506b77dd0a3dab1022620cc38e9a8b88d41469.
---
src/plugins/relationshipNotifier/index.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/plugins/relationshipNotifier/index.ts b/src/plugins/relationshipNotifier/index.ts
index 0e1aa0778..d913dde48 100644
--- a/src/plugins/relationshipNotifier/index.ts
+++ b/src/plugins/relationshipNotifier/index.ts
@@ -34,7 +34,7 @@ export default definePlugin({
find: "removeRelationship:(",
replacement: {
match: /(removeRelationship:\((\i),\i,\i\)=>)/,
- replace: "$1($self.removeFriend($2))||"
+ replace: "$1($self.removeFriend($2),0)||"
}
},
{
From ba76c43a265957a70171a3ddf98beb0aafc0954e Mon Sep 17 00:00:00 2001
From: Vendicated
Date: Thu, 19 Jun 2025 22:50:53 +0200
Subject: [PATCH 061/845] ServerInfo: fix Blocked & Ignored tabs
---
src/plugins/serverInfo/GuildInfoModal.tsx | 4 ++--
src/webpack/common/types/stores.d.ts | 18 +++++++++++-------
2 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/src/plugins/serverInfo/GuildInfoModal.tsx b/src/plugins/serverInfo/GuildInfoModal.tsx
index 8300380d3..44f10afa8 100644
--- a/src/plugins/serverInfo/GuildInfoModal.tsx
+++ b/src/plugins/serverInfo/GuildInfoModal.tsx
@@ -220,12 +220,12 @@ function FriendsTab({ guild, setCount }: RelationshipProps) {
}
function BlockedUsersTab({ guild, setCount }: RelationshipProps) {
- const blockedIds = Object.keys(RelationshipStore.getMutableRelationships()).filter(id => RelationshipStore.isBlocked(id));
+ const blockedIds = RelationshipStore.getBlockedIDs();
return UserList("blocked", guild, blockedIds, setCount);
}
function IgnoredUserTab({ guild, setCount }: RelationshipProps) {
- const ignoredIds = Object.keys(RelationshipStore.getMutableRelationships()).filter(id => RelationshipStore.isIgnored(id));
+ const ignoredIds = RelationshipStore.getIgnoredIDs();
return UserList("ignored", guild, ignoredIds, setCount);
}
diff --git a/src/webpack/common/types/stores.d.ts b/src/webpack/common/types/stores.d.ts
index 497de739f..cb06ca4b3 100644
--- a/src/webpack/common/types/stores.d.ts
+++ b/src/webpack/common/types/stores.d.ts
@@ -236,17 +236,21 @@ export type useStateFromStores = (
export class RelationshipStore extends FluxStore {
getFriendIDs(): string[];
- /** Related to friend nicknames experiment. */
- getNickname(userId: string): string;
+ getIgnoredIDs(): string[];
+ getBlockedIDs(): string[];
+
getPendingCount(): number;
getRelationshipCount(): number;
+
+ /** Related to friend nicknames. */
+ getNickname(userId: string): string;
/** @returns Enum value from constants.RelationshipTypes */
getRelationshipType(userId: string): number;
+ isFriend(userId: string): boolean;
+ isBlocked(userId: string): boolean;
+ isIgnored(userId: string): boolean;
+ getSince(userId: string): string;
+
/** @returns Format: [userId: Enum value from constants.RelationshipTypes] */
getMutableRelationships(): Record;
- isBlocked(userId: string): boolean;
- isFriend(userId: string): boolean;
-
- getSince(userId: string): string;
- isIgnored(userId: string): boolean;
}
From f6bfd18816de45c6fd9a903b7595cb19d59266c4 Mon Sep 17 00:00:00 2001
From: Vendicated
Date: Thu, 19 Jun 2025 23:03:15 +0200
Subject: [PATCH 062/845] ViewIcons: fix viewing animated icons/banners
---
src/plugins/viewIcons/index.tsx | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/src/plugins/viewIcons/index.tsx b/src/plugins/viewIcons/index.tsx
index 07630a002..2afdb2d52 100644
--- a/src/plugins/viewIcons/index.tsx
+++ b/src/plugins/viewIcons/index.tsx
@@ -71,9 +71,14 @@ const openAvatar = (url: string) => openImage(url, 512, 512);
const openBanner = (url: string) => openImage(url, 1024);
function openImage(url: string, width: number, height?: number) {
- const format = url.startsWith("/") ? "png" : settings.store.format;
-
const u = new URL(url, window.location.href);
+
+ const format = url.startsWith("/")
+ ? "png"
+ : u.searchParams.get("animated") === "true"
+ ? "gif"
+ : settings.store.format;
+
u.searchParams.set("size", settings.store.imgSize);
u.pathname = u.pathname.replace(/\.(png|jpe?g|webp)$/, `.${format}`);
url = u.toString();
From b59e829c5df8ddc8e9633c50ed7a088871e4eb91 Mon Sep 17 00:00:00 2001
From: zyqunix <117040076+zyqunix@users.noreply.github.com>
Date: Fri, 20 Jun 2025 00:19:55 +0200
Subject: [PATCH 063/845] morecommands update (#291)
* add MessageActions plugin
* remove slnx
* add to morecommands instead of making it a new plugin
* bleh
---------
Co-authored-by: thororen1234 <78185467+thororen1234@users.noreply.github.com>
---
.../mediaDownloader.desktop/index.tsx | 83 ++---
src/equicordplugins/moreCommands/index.ts | 313 +++++++++++++++++-
src/plugins/betterFolders/index.tsx | 3 +-
3 files changed, 354 insertions(+), 45 deletions(-)
diff --git a/src/equicordplugins/mediaDownloader.desktop/index.tsx b/src/equicordplugins/mediaDownloader.desktop/index.tsx
index f7bce69f7..7f74361b6 100644
--- a/src/equicordplugins/mediaDownloader.desktop/index.tsx
+++ b/src/equicordplugins/mediaDownloader.desktop/index.tsx
@@ -200,45 +200,50 @@ export default definePlugin({
inputType: ApplicationCommandInputType.BUILT_IN,
name: "download",
description: "Download and send videos, audio or gifs.",
- options: [{
- name: "url",
- description: "The URL of any video supported by yt-dlp.",
- required: true,
- type: ApplicationCommandOptionType.STRING
- }, {
- name: "format",
- description: "Whether to download a video or audio.",
- type: ApplicationCommandOptionType.STRING,
- choices: [
- { name: "Video", value: "video", label: "Video" },
- { name: "Audio", value: "audio", label: "Audio" },
- { name: "GIF", value: "gif", label: "GIF" }
- ],
- required: false,
- }, {
- name: "gif_quality",
- type: ApplicationCommandOptionType.INTEGER,
- description: "The quality level when using GIF. Try lowering this number if the GIF is too large.",
- required: false,
- choices: [
- { name: "5", value: "5", label: "5" },
- { name: "4", value: "4", label: "4" },
- { name: "3", value: "3", label: "3" },
- { name: "2", value: "2", label: "2" },
- { name: "1", value: "1", label: "1" }
- ]
- }, {
- name: "yt-dlp_args",
- description: "Additional arguments to pass to yt-dlp. These will take precedence over arguments set in the settings. This may overwrite default plugin arguments such format selection. Note: if modifying the output, ensure the filename starts with `download`.",
- required: false,
- type: ApplicationCommandOptionType.STRING
- }, {
- name: "ffmpeg_args",
- description: "Additional arguments to pass to ffmpeg. These will take precedence over arguments set in the settings. This may overwrite default plugin arguments such as auto-scaling. Note: if modifying the output, ensure the filename starts with `remux`.",
- required: false,
- type: ApplicationCommandOptionType.STRING
- }],
-
+ options: [
+ {
+ name: "url",
+ description: "The URL of any video supported by yt-dlp.",
+ required: true,
+ type: ApplicationCommandOptionType.STRING
+ },
+ {
+ name: "format",
+ description: "Whether to download a video or audio.",
+ type: ApplicationCommandOptionType.STRING,
+ choices: [
+ { name: "Video", value: "video", label: "Video" },
+ { name: "Audio", value: "audio", label: "Audio" },
+ { name: "GIF", value: "gif", label: "GIF" }
+ ],
+ required: false,
+ },
+ {
+ name: "gif_quality",
+ type: ApplicationCommandOptionType.INTEGER,
+ description: "The quality level when using GIF. Try lowering this number if the GIF is too large.",
+ required: false,
+ choices: [
+ { name: "5", value: "5", label: "5" },
+ { name: "4", value: "4", label: "4" },
+ { name: "3", value: "3", label: "3" },
+ { name: "2", value: "2", label: "2" },
+ { name: "1", value: "1", label: "1" }
+ ]
+ },
+ {
+ name: "yt-dlp_args",
+ description: "Additional arguments to pass to yt-dlp. These will take precedence over arguments set in the settings. This may overwrite default plugin arguments such format selection. Note: if modifying the output, ensure the filename starts with `download`.",
+ required: false,
+ type: ApplicationCommandOptionType.STRING
+ },
+ {
+ name: "ffmpeg_args",
+ description: "Additional arguments to pass to ffmpeg. These will take precedence over arguments set in the settings. This may overwrite default plugin arguments such as auto-scaling. Note: if modifying the output, ensure the filename starts with `remux`.",
+ required: false,
+ type: ApplicationCommandOptionType.STRING
+ }
+ ],
execute: async (args, ctx) => {
if (!await Native.isYtdlpAvailable()) return openDependencyModal();
if (!await Native.isFfmpegAvailable() && settings.store.showFfmpegWarning) sendFfmpegWarning(ctx.channel.id);
diff --git a/src/equicordplugins/moreCommands/index.ts b/src/equicordplugins/moreCommands/index.ts
index 02f3c3738..251ec23e6 100644
--- a/src/equicordplugins/moreCommands/index.ts
+++ b/src/equicordplugins/moreCommands/index.ts
@@ -16,8 +16,8 @@
* along with this program. If not, see .
*/
-import { ApplicationCommandInputType, findOption, OptionalMessageOption, RequiredMessageOption, sendBotMessage } from "@api/Commands";
-import { Devs } from "@utils/constants";
+import { ApplicationCommandInputType, ApplicationCommandOptionType, findOption, OptionalMessageOption, RequiredMessageOption, sendBotMessage } from "@api/Commands";
+import { Devs, EquicordDevs } from "@utils/constants";
import definePlugin from "@utils/types";
@@ -31,8 +31,8 @@ function mock(input: string): string {
export default definePlugin({
name: "MoreCommands",
- description: "echo, lenny, mock",
- authors: [Devs.Arjix, Devs.echo, Devs.Samu],
+ description: "Echo, Lenny, Mock, and More",
+ authors: [Devs.Arjix, Devs.echo, Devs.Samu, EquicordDevs.zyqunix],
commands: [
{
name: "echo",
@@ -61,5 +61,310 @@ export default definePlugin({
content: mock(findOption(opts, "message", ""))
}),
},
+ {
+ name: "wordcount",
+ description: "Counts the number of words in a message",
+ options: [RequiredMessageOption],
+ inputType: ApplicationCommandInputType.BOT,
+ execute: (opts, ctx) => {
+ const message = findOption(opts, "message", "");
+ const wordCount = message.trim().split(/\s+/).length;
+ sendBotMessage(ctx.channel.id, {
+ content: `The message contains ${wordCount} words.`
+ });
+ },
+ },
+ {
+ name: "ping",
+ description: "Pings the bot to check if it's responding",
+ options: [],
+ inputType: ApplicationCommandInputType.BOT,
+ execute: (opts, ctx) => {
+ sendBotMessage(ctx.channel.id, {
+ content: "Pong!"
+ });
+ },
+ },
+ {
+ name: "rolldice",
+ description: "Roll a die with the specified number of sides",
+ options: [RequiredMessageOption],
+ execute: opts => {
+ const sides = parseInt(findOption(opts, "message", "6"));
+ const roll = Math.floor(Math.random() * sides) + 1;
+ return {
+ content: `You rolled a ${roll}!`
+ };
+ },
+ },
+ {
+ name: "flipcoin",
+ description: "Flips a coin and returns heads or tails",
+ options: [],
+ execute: (opts, ctx) => {
+ const flip = Math.random() < 0.5 ? "Heads" : "Tails";
+ return {
+ content: `The coin landed on: ${flip}`
+ };
+ },
+ },
+ {
+ name: "ask",
+ description: "Ask a yes/no question and get an answer",
+ options: [RequiredMessageOption],
+ execute: opts => {
+ const question = findOption(opts, "message", "");
+ const responses = ["Yes", "No", "Maybe", "Ask again later", "Definitely not", "It is certain"];
+ const response = responses[Math.floor(Math.random() * responses.length)];
+ return {
+ content: `${question} - ${response}`
+ };
+ },
+ },
+ {
+ name: "randomanimal",
+ description: "Get a random cat picture",
+ options: [
+ {
+ name: "animal",
+ description: "pick your animal",
+ type: ApplicationCommandOptionType.STRING,
+ required: true,
+ choices: [
+ { name: "cat", value: "cat", label: "cat" },
+ { name: "dog", value: "dog", label: "dog" },
+ ]
+ }
+ ],
+ execute: (opts, ctx) => {
+ return (async () => {
+ const animal = findOption(opts, "animal") as string;
+ let url;
+ if (animal === "cat") {
+ url = "https://api.thecatapi.com/v1/images/search";
+ } else if (animal === "dog") {
+ url = "https://api.thedogapi.com/v1/images/search";
+ }
+ try {
+ const response = await fetch(url);
+ if (!response.ok) throw new Error(`Failed to fetch ${animal} image`);
+ const data = await response.json();
+ return {
+ content: data[0].url
+ };
+ } catch (err) {
+ sendBotMessage(ctx.channel.id, {
+ content: "Sorry, couldn't fetch a cat picture right now 😿"
+ });
+ }
+ })();
+ },
+ },
+ {
+ name: "randomnumber",
+ description: "Generates a random number between two values",
+ options: [
+ {
+ name: "min",
+ description: "Minimum value",
+ type: ApplicationCommandOptionType.INTEGER,
+ required: true
+ },
+ {
+ name: "max",
+ description: "Maximum value",
+ type: ApplicationCommandOptionType.INTEGER,
+ required: true
+ }
+ ],
+ execute: opts => {
+ const min = parseInt(findOption(opts, "min", "0"));
+ const max = parseInt(findOption(opts, "max", "100"));
+ const number = Math.floor(Math.random() * (max - min + 1)) + min;
+ return {
+ content: `Random number between ${min} and ${max}: ${number}`
+ };
+ }
+ },
+ {
+ name: "countdown",
+ description: "Starts a countdown from a specified number",
+ options: [
+ {
+ name: "number",
+ description: "Number to countdown from (max 10)",
+ type: ApplicationCommandOptionType.INTEGER,
+ required: true
+ }
+ ],
+ inputType: ApplicationCommandInputType.BOT,
+ execute: async (opts, ctx) => {
+ const number = Math.min(parseInt(findOption(opts, "number", "5")), 10);
+ if (isNaN(number) || number < 1) {
+ sendBotMessage(ctx.channel.id, {
+ content: "Please provide a valid number between 1 and 10!"
+ });
+ return;
+ }
+ sendBotMessage(ctx.channel.id, {
+ content: `Starting countdown from ${number}...`
+ });
+ for (let i = number; i >= 0; i--) {
+ await new Promise(resolve => setTimeout(resolve, 1000));
+ sendBotMessage(ctx.channel.id, {
+ content: i === 0 ? "🎉 Go! 🎉" : `${i}...`
+ });
+ }
+ },
+ },
+ {
+ name: "choose",
+ description: "Randomly chooses from provided options",
+ options: [
+ {
+ name: "choices",
+ description: "Comma-separated list of choices",
+ type: ApplicationCommandOptionType.STRING,
+ required: true
+ }
+ ],
+ execute: opts => {
+ const choices = findOption(opts, "choices", "").split(",").map(c => c.trim());
+ const choice = choices[Math.floor(Math.random() * choices.length)];
+ return {
+ content: `I choose: ${choice}`
+ };
+ }
+ },
+ {
+ name: "systeminfo",
+ description: "Shows system information",
+ options: [],
+ execute: async (opts, ctx) => {
+ try {
+ const { userAgent, hardwareConcurrency, onLine, languages } = navigator;
+ const { width, height, colorDepth } = window.screen;
+ const { deviceMemory, connection }: { deviceMemory: any, connection: any; } = navigator as any;
+ const platform = userAgent.includes("Windows") ? "Windows" :
+ userAgent.includes("Mac") ? "MacOS" :
+ userAgent.includes("Linux") ? "Linux" : "Unknown";
+ const isMobile = /Mobile|Android|iPhone/i.test(userAgent);
+ const deviceType = isMobile ? "Mobile" : "Desktop";
+ const browserInfo = userAgent.match(/(?:chrome|firefox|safari|edge|opr)\/?\s*(\d+)/i)?.[0] || "Unknown";
+ const networkInfo = connection ? `${connection.effectiveType || "Unknown"}` : "Unknown";
+ const info = [
+ `> **Platform**: ${platform}`,
+ `> **Device Type**: ${deviceType}`,
+ `> **Browser**: ${browserInfo}`,
+ `> **CPU Cores**: ${hardwareConcurrency || "N/A"}`,
+ `> **Memory**: ${deviceMemory ? `${deviceMemory}GB` : "N/A"}`,
+ `> **Screen**: ${width}x${height} (${colorDepth}bit)`,
+ `> **Languages**: ${languages?.join(", ")}`,
+ `> **Network**: ${networkInfo} (${onLine ? "Online" : "Offline"})`
+ ].join("\n");
+ return { content: info };
+ } catch (err) {
+ sendBotMessage(ctx.channel.id, { content: "Failed to fetch system information" });
+ }
+ },
+ },
+ {
+ name: "getUptime",
+ description: "Returns the system uptime",
+ execute: async (opts, ctx) => {
+ const uptime = performance.now() / 1000;
+ const uptimeInfo = `> **System Uptime**: ${Math.floor(uptime / 60)} minutes`;
+ return { content: uptimeInfo };
+ },
+ },
+ {
+ name: "getTime",
+ description: "Returns the current server time",
+ execute: async (opts, ctx) => {
+ const currentTime = new Date().toLocaleString();
+ return { content: `> **Current Time**: ${currentTime}` };
+ },
+ },
+ {
+ name: "getLocation",
+ description: "Returns the user's approximate location based on IP",
+ execute: async (opts, ctx) => {
+ try {
+ const response = await fetch("https://ipapi.co/json/");
+ const data = await response.json();
+ const locationInfo = `> **Country**: ${data.country_name}\n> **Region**: ${data.region}\n> **City**: ${data.city}`;
+ return { content: locationInfo };
+ } catch (err) {
+ sendBotMessage(ctx.channel.id, { content: "Failed to fetch location information" });
+ }
+ },
+ },
+ {
+ name: "transform",
+ description: "Transform your text with the specified option",
+ options: [
+ {
+ name: "text",
+ description: "TEXT TO UPPERCASE",
+ type: ApplicationCommandOptionType.STRING,
+ required: true
+ },
+ {
+ name: "transformation",
+ description: "transformation to apply to your text",
+ type: ApplicationCommandOptionType.STRING,
+ required: true,
+ choices: [
+ { name: "toLowerCase", value: "toLowerCase", label: "toLowerCase" },
+ { name: "toUpperCase", value: "toUpperCase", label: "toUpperCase" },
+ { name: "toLocaleLowerCase", value: "toLocaleLowerCase", label: "toLocaleLowerCase" },
+ { name: "toLocaleUpperCase", value: "toLocaleUpperCase", label: "toLocaleUpperCase" },
+ { name: "reverse", value: "reverse", label: "reverse" },
+ { name: "stay the same", value: "same", label: "stay the same" }
+ ]
+ },
+ {
+ name: "repeat",
+ description: "how many times to repeat",
+ type: ApplicationCommandOptionType.INTEGER,
+ required: false
+ },
+ {
+ name: "normalize",
+ description: "which normailze option to use",
+ type: ApplicationCommandOptionType.INTEGER,
+ required: false,
+ choices: [
+ { name: "NFC", value: "NFC", label: "NFC" },
+ { name: "NFD", value: "NFD", label: "NFD" },
+ { name: "NFKC", value: "NFKC", label: "NFKC" },
+ { name: "NFKD", value: "NFKD", label: "NFKD" }
+ ]
+ },
+ ],
+ execute: opts => {
+ const transform = findOption(opts, "transformation") as string;
+ const repeat = findOption(opts, "repeat") as number | undefined;
+ const normalize = findOption(opts, "normalize") as string | undefined;
+ let text = findOption(opts, "text") as string;
+
+ if (transform && text) {
+ if (transform === "same") {
+ if (normalize) text = text.normalize(normalize);
+ return {
+ content: text.repeat(repeat ?? 1)
+ };
+ } else {
+ const method = (text as any)[transform];
+ const transformed = method.call(text);
+ if (normalize) text = text.normalize(normalize);
+ if (transform === "reverse") text = text.split("").reverse().join("");
+ return {
+ content: transformed.repeat(repeat ?? 1)
+ };
+ }
+ }
+ },
+ },
]
});
diff --git a/src/plugins/betterFolders/index.tsx b/src/plugins/betterFolders/index.tsx
index 206614a5a..c589824cf 100644
--- a/src/plugins/betterFolders/index.tsx
+++ b/src/plugins/betterFolders/index.tsx
@@ -21,7 +21,7 @@ import "./style.css";
import { definePluginSettings } from "@api/Settings";
import { Devs } from "@utils/constants";
import definePlugin, { OptionType } from "@utils/types";
-import { findByPropsLazy, findLazy, findStoreLazy } from "@webpack";
+import { findByPropsLazy, findStoreLazy } from "@webpack";
import { FluxDispatcher } from "@webpack/common";
import { ReactNode } from "react";
@@ -35,7 +35,6 @@ enum FolderIconDisplay {
export const ExpandedGuildFolderStore = findStoreLazy("ExpandedGuildFolderStore");
const SortedGuildStore = findStoreLazy("SortedGuildStore");
-const GuildsTree = findLazy(m => m.prototype?.moveNextTo);
const FolderUtils = findByPropsLazy("move", "toggleGuildFolderExpand");
let lastGuildId = null as string | null;
From 4f25affbda7043c25593055309366949647ca718 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Thu, 19 Jun 2025 18:30:58 -0400
Subject: [PATCH 064/845] Fix Up PR More
---
src/equicordplugins/moreCommands/index.ts | 43 ++++++++++++-----------
1 file changed, 22 insertions(+), 21 deletions(-)
diff --git a/src/equicordplugins/moreCommands/index.ts b/src/equicordplugins/moreCommands/index.ts
index 251ec23e6..bc35d4d24 100644
--- a/src/equicordplugins/moreCommands/index.ts
+++ b/src/equicordplugins/moreCommands/index.ts
@@ -319,7 +319,6 @@ export default definePlugin({
{ name: "toUpperCase", value: "toUpperCase", label: "toUpperCase" },
{ name: "toLocaleLowerCase", value: "toLocaleLowerCase", label: "toLocaleLowerCase" },
{ name: "toLocaleUpperCase", value: "toLocaleUpperCase", label: "toLocaleUpperCase" },
- { name: "reverse", value: "reverse", label: "reverse" },
{ name: "stay the same", value: "same", label: "stay the same" }
]
},
@@ -329,10 +328,16 @@ export default definePlugin({
type: ApplicationCommandOptionType.INTEGER,
required: false
},
+ {
+ name: "reverse",
+ description: "reverse your text",
+ type: ApplicationCommandOptionType.BOOLEAN,
+ required: false
+ },
{
name: "normalize",
description: "which normailze option to use",
- type: ApplicationCommandOptionType.INTEGER,
+ type: ApplicationCommandOptionType.STRING,
required: false,
choices: [
{ name: "NFC", value: "NFC", label: "NFC" },
@@ -343,28 +348,24 @@ export default definePlugin({
},
],
execute: opts => {
- const transform = findOption(opts, "transformation") as string;
- const repeat = findOption(opts, "repeat") as number | undefined;
- const normalize = findOption(opts, "normalize") as string | undefined;
let text = findOption(opts, "text") as string;
+ const transform = findOption(opts, "transformation") as string;
+ const repeat = findOption(opts, "repeat") as number | undefined ?? 1;
+ const normalize = findOption(opts, "normalize") as string | undefined;
+ const reverse = findOption(opts, "reverse") as string | undefined;
- if (transform && text) {
- if (transform === "same") {
- if (normalize) text = text.normalize(normalize);
- return {
- content: text.repeat(repeat ?? 1)
- };
- } else {
- const method = (text as any)[transform];
- const transformed = method.call(text);
- if (normalize) text = text.normalize(normalize);
- if (transform === "reverse") text = text.split("").reverse().join("");
- return {
- content: transformed.repeat(repeat ?? 1)
- };
- }
+ if (!transform || !text) return;
+
+ if (transform !== "same") {
+ text = (text as any)[transform]?.call(text) ?? text;
}
- },
+
+ if (normalize) text = text.normalize(normalize);
+ if (reverse) text = text.split("").reverse().join("");
+
+ return { content: text.repeat(repeat) };
+ }
+ ,
},
]
});
From b91ad6ef1d567b0eb7ccea1349c9cd4892ef2111 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Thu, 19 Jun 2025 18:34:24 -0400
Subject: [PATCH 065/845] Remove Unused return
---
src/equicordplugins/moreCommands/index.ts | 2 --
1 file changed, 2 deletions(-)
diff --git a/src/equicordplugins/moreCommands/index.ts b/src/equicordplugins/moreCommands/index.ts
index bc35d4d24..c3b791b47 100644
--- a/src/equicordplugins/moreCommands/index.ts
+++ b/src/equicordplugins/moreCommands/index.ts
@@ -354,8 +354,6 @@ export default definePlugin({
const normalize = findOption(opts, "normalize") as string | undefined;
const reverse = findOption(opts, "reverse") as string | undefined;
- if (!transform || !text) return;
-
if (transform !== "same") {
text = (text as any)[transform]?.call(text) ?? text;
}
From 5cb40dd2f5e1528fb1edfd9524b7ee657052c32d Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Thu, 19 Jun 2025 22:08:31 -0400
Subject: [PATCH 066/845] Moyai: Fix CSP
---
src/equicordplugins/equicordHelper/native.ts | 4 ++--
src/main/csp/index.ts | 3 ++-
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/equicordplugins/equicordHelper/native.ts b/src/equicordplugins/equicordHelper/native.ts
index d46407089..9b72dc271 100644
--- a/src/equicordplugins/equicordHelper/native.ts
+++ b/src/equicordplugins/equicordHelper/native.ts
@@ -4,6 +4,6 @@
* SPDX-License-Identifier: GPL-3.0-or-later
*/
-import { CspPolicies, ImageScriptsAndCssSrc } from "@main/csp";
+import { CspPolicies, Src } from "@main/csp";
-CspPolicies["*"] = ImageScriptsAndCssSrc;
+CspPolicies["*"] = Src;
diff --git a/src/main/csp/index.ts b/src/main/csp/index.ts
index 0f7ab34ba..21949e0af 100644
--- a/src/main/csp/index.ts
+++ b/src/main/csp/index.ts
@@ -13,7 +13,8 @@ export const ConnectSrc = ["connect-src"];
export const ImageSrc = [...ConnectSrc, "img-src"];
export const CssSrc = ["style-src", "font-src"];
export const ImageAndCssSrc = [...ImageSrc, ...CssSrc];
-export const ImageScriptsAndCssSrc = [...ImageAndCssSrc, "script-src", "worker-src", "frame-src"];
+export const ImageScriptsAndCssSrc = [...ImageAndCssSrc, "script-src", "worker-src"];
+export const Src = ["style-src", "connect-src", "img-src", "frame-src", "font-src", "media-src", "worker-src"];
// Plugins can whitelist their own domains by importing this object in their native.ts
// script and just adding to it. But generally, you should just edit this file instead
From 658a62860e40f9411c26f30b8327f61431d3a92e Mon Sep 17 00:00:00 2001
From: sadan4 <117494111+sadan4@users.noreply.github.com>
Date: Fri, 20 Jun 2025 12:45:52 -0400
Subject: [PATCH 067/845] BetterFolders: Fix sidebar filter patch (#3498)
---
src/plugins/betterFolders/index.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/plugins/betterFolders/index.tsx b/src/plugins/betterFolders/index.tsx
index 3dc812a4d..62567f51d 100644
--- a/src/plugins/betterFolders/index.tsx
+++ b/src/plugins/betterFolders/index.tsx
@@ -179,7 +179,7 @@ export default definePlugin({
},
// If we are rendering the Better Folders sidebar, we filter out everything but the Guild List from the Sidebar children
{
- match: /unreadMentionsFixedFooter\].+?\]/,
+ match: /unreadMentionsFixedFooter\].+?\}\)\]/,
replace: "$&.filter($self.makeGuildsBarSidebarFilter(!!arguments[0]?.isBetterFolders))"
}
]
From fbc444df8af0395732cdeb07565d7dd5c3ef0969 Mon Sep 17 00:00:00 2001
From: "Indiana Jone (Indi)" <150982280+KrstlSkll69@users.noreply.github.com>
Date: Sat, 21 Jun 2025 12:10:07 -0400
Subject: [PATCH 068/845] Update googleThat (#292)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Update googleThat
* remove extra space??
* remove periods
* Make devs one line
* THOROREN 😭😭😭😭😭😭
---
.../googleThat/{index.ts => index.tsx} | 26 +++++++++++++------
1 file changed, 18 insertions(+), 8 deletions(-)
rename src/equicordplugins/googleThat/{index.ts => index.tsx} (72%)
diff --git a/src/equicordplugins/googleThat/index.ts b/src/equicordplugins/googleThat/index.tsx
similarity index 72%
rename from src/equicordplugins/googleThat/index.ts
rename to src/equicordplugins/googleThat/index.tsx
index fedf8acf2..5e9c7b598 100644
--- a/src/equicordplugins/googleThat/index.ts
+++ b/src/equicordplugins/googleThat/index.tsx
@@ -6,12 +6,17 @@
import { ApplicationCommandOptionType, findOption } from "@api/Commands";
import { definePluginSettings } from "@api/Settings";
-import { Devs } from "@utils/constants";
+import { Devs, EquicordDevs } from "@utils/constants";
import definePlugin, { OptionType } from "@utils/types";
+
function getMessage(opts) {
const inputOption = findOption(opts, "input", "");
- const queryURL = "" + searchEngines[settings.store.defaultEngine] + encodeURIComponent(inputOption);
+ let queryURL = "" + searchEngines[settings.store.defaultEngine] + encodeURIComponent(inputOption);
+
+ if (settings.store.customEngineURL) {
+ queryURL = "" + [settings.store.customEngineURL] + encodeURIComponent(inputOption);
+ }
if (settings.store.hyperlink) {
return `[${inputOption}](${queryURL})`;
@@ -30,6 +35,7 @@ const searchEngines = {
"Yandex": "https://yandex.com/search/?text=",
"Ecosia": "https://www.ecosia.org/search?q=",
"Ask": "https://www.ask.com/web?q=",
+ "AOL": "https://search.aol.com/aol/search?q=",
"LetMeGoogleThatForYou": "https://letmegooglethat.com/?q="
};
@@ -37,10 +43,9 @@ const settings = definePluginSettings({
hyperlink: {
type: OptionType.BOOLEAN,
description: "If the sent link should hyperlink with the query as the label",
- default: true
+ default: false
},
- defaultEngine:
- {
+ defaultEngine: {
type: OptionType.SELECT,
description: "The search engine to use",
options: Object.keys(searchEngines).map((key, index) => ({
@@ -48,19 +53,24 @@ const settings = definePluginSettings({
value: key,
default: index === 0
}))
+ },
+ customEngineURL: {
+ description: "The URL of the Engine you wish to use",
+ type: OptionType.STRING,
+ placeholder: "https://search.vmohammad.dev/?q="
}
});
export default definePlugin({
name: "GoogleThat",
- description: "Adds a command to send a google search link to a query",
- authors: [Devs.Samwich],
+ description: "Adds a command to send a internet search link",
+ authors: [Devs.Samwich, EquicordDevs.KrystalSkull],
tags: ["search", "google", "query", "duckduckgo", "command"],
settings,
commands: [
{
name: "googlethat",
- description: "send a search engine link to a query",
+ description: "send a search engine link",
options: [
{
name: "input",
From 30ce325377e914b613a5b88793a34afc43dd6f5c Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Sun, 22 Jun 2025 00:29:08 -0400
Subject: [PATCH 069/845] QuestCompleter: Add Mobile Support
---
.../questCompleter.discordDesktop/index.tsx | 22 +++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)
diff --git a/src/equicordplugins/questCompleter.discordDesktop/index.tsx b/src/equicordplugins/questCompleter.discordDesktop/index.tsx
index 716391100..b4494f7dc 100644
--- a/src/equicordplugins/questCompleter.discordDesktop/index.tsx
+++ b/src/equicordplugins/questCompleter.discordDesktop/index.tsx
@@ -31,6 +31,7 @@ import { Button, ChannelStore, FluxDispatcher, GuildChannelStore, NavigationRout
const QuestIcon = findComponentByCodeLazy("10.47a.76.76");
const HeaderBarIcon = findComponentByCodeLazy(".HEADER_BAR_BADGE_TOP:", '.iconBadge,"top"');
+let questIdCheck = 0;
function ToolBarHeader() {
return (
@@ -70,13 +71,13 @@ async function openCompleteQuestUI() {
const applicationId = quest.config.application.id;
const applicationName = quest.config.application.name;
- const taskName = ["WATCH_VIDEO", "PLAY_ON_DESKTOP", "STREAM_ON_DESKTOP", "PLAY_ACTIVITY"].find(x => quest.config.taskConfig.tasks[x] != null);
+ const taskName = ["WATCH_VIDEO", "PLAY_ON_DESKTOP", "STREAM_ON_DESKTOP", "PLAY_ACTIVITY", "WATCH_VIDEO_ON_MOBILE"].find(x => quest.config.taskConfig.tasks[x] != null);
const icon = `https://cdn.discordapp.com/quests/${quest.id}/${theme}/${quest.config.assets.gameTile}`;
// @ts-ignore
const secondsNeeded = quest.config.taskConfig.tasks[taskName].target;
// @ts-ignore
let secondsDone = quest.userStatus?.progress?.[taskName]?.value ?? 0;
- if (taskName === "WATCH_VIDEO") {
+ if (taskName === "WATCH_VIDEO" || taskName === "WATCH_VIDEO_ON_MOBILE") {
const maxFuture = 10, speed = 7, interval = 1;
const enrolledAt = new Date(quest.userStatus.enrolledAt).getTime();
const fn = async () => {
@@ -247,6 +248,13 @@ export default definePlugin({
authors: [Devs.amia],
settings,
patches: [
+ {
+ find: "BkZhUF)}",
+ replacement: {
+ match: /(?<=questId:(\i\.id).*?\.PRIMARY,)disabled:!0/,
+ replace: "onClick: () => $self.mobileQuestPatch($1)"
+ },
+ },
{
find: "AppTitleBar",
replacement: {
@@ -264,6 +272,16 @@ export default definePlugin({
predicate: () => settings.store.useNavBar
}
],
+ mobileQuestPatch(questId) {
+ if (questId === questIdCheck) return;
+ questIdCheck = questId;
+ Vencord.Webpack.Common.RestAPI.post({
+ url: `/quests/${questId}/enroll`,
+ body: {
+ location: 11
+ }
+ });
+ },
renderQuestButton() {
return (
From c81aa8aada2646dfb69bf70a8d5bc2251169d047 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Mon, 23 Jun 2025 17:27:19 -0400
Subject: [PATCH 070/845] Fix Color Picker
---
.../ThemeSettings/components/SettingColorComponent.tsx | 2 +-
src/equicordplugins/customUserColors/SetColorModal.tsx | 2 +-
src/equicordplugins/glide/index.tsx | 2 +-
.../remix/editor/components/SettingColorComponent.tsx | 2 +-
src/plugins/clientTheme/components/Settings.tsx | 2 +-
src/plugins/fakeProfileThemes/index.tsx | 2 +-
src/plugins/pinDms/components/CreateCategoryModal.tsx | 2 +-
7 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/src/components/ThemeSettings/components/SettingColorComponent.tsx b/src/components/ThemeSettings/components/SettingColorComponent.tsx
index f8d779f27..a23be1e74 100644
--- a/src/components/ThemeSettings/components/SettingColorComponent.tsx
+++ b/src/components/ThemeSettings/components/SettingColorComponent.tsx
@@ -15,7 +15,7 @@ interface ColorPickerProps {
showEyeDropper?: boolean;
onChange(value: number | null): void;
}
-const ColorPicker = findComponentByCodeLazy("#{intl::USER_SETTINGS_PROFILE_COLOR_SELECT_COLOR}", ".BACKGROUND_PRIMARY)");
+const ColorPicker = findComponentByCodeLazy(".BACKGROUND_ACCENT.css");
// TinyColor is completely unmangled and it's duplicated in two modules! Fun!
const TinyColor: tinycolor.Constructor = findByCodeLazy("this._gradientType=");
diff --git a/src/equicordplugins/customUserColors/SetColorModal.tsx b/src/equicordplugins/customUserColors/SetColorModal.tsx
index b532d64b0..dcbeef069 100644
--- a/src/equicordplugins/customUserColors/SetColorModal.tsx
+++ b/src/equicordplugins/customUserColors/SetColorModal.tsx
@@ -19,7 +19,7 @@ interface ColorPickerProps {
suggestedColors?: string[];
onChange(value: number | null): void;
}
-const ColorPicker = findComponentByCodeLazy("#{intl::USER_SETTINGS_PROFILE_COLOR_SELECT_COLOR}", ".BACKGROUND_PRIMARY)");
+const ColorPicker = findComponentByCodeLazy(".BACKGROUND_ACCENT.css");
const cl = classNameFactory("vc-customColors-");
diff --git a/src/equicordplugins/glide/index.tsx b/src/equicordplugins/glide/index.tsx
index 70ca5d4ce..7e6a6976f 100644
--- a/src/equicordplugins/glide/index.tsx
+++ b/src/equicordplugins/glide/index.tsx
@@ -86,7 +86,7 @@ function CopyPresetComponent() {
);
}
-const ColorPicker = findComponentByCodeLazy("#{intl::USER_SETTINGS_PROFILE_COLOR_SELECT_COLOR}", ".BACKGROUND_PRIMARY)");
+const ColorPicker = findComponentByCodeLazy(".BACKGROUND_ACCENT.css");
export function generateAndApplyProceduralTheme() {
diff --git a/src/equicordplugins/remix/editor/components/SettingColorComponent.tsx b/src/equicordplugins/remix/editor/components/SettingColorComponent.tsx
index fbda3e41b..457fcce7e 100644
--- a/src/equicordplugins/remix/editor/components/SettingColorComponent.tsx
+++ b/src/equicordplugins/remix/editor/components/SettingColorComponent.tsx
@@ -19,7 +19,7 @@ interface ColorPickerProps {
onChange(value: number | null): void;
}
-const ColorPicker = findComponentByCodeLazy(".BACKGROUND_PRIMARY).hex");
+const ColorPicker = findComponentByCodeLazy(".BACKGROUND_ACCENT.css");
const cl = classNameFactory("vc-remix-settings-color-");
diff --git a/src/plugins/clientTheme/components/Settings.tsx b/src/plugins/clientTheme/components/Settings.tsx
index f38380fa7..59a7da789 100644
--- a/src/plugins/clientTheme/components/Settings.tsx
+++ b/src/plugins/clientTheme/components/Settings.tsx
@@ -14,7 +14,7 @@ import { settings } from "..";
import { relativeLuminance } from "../utils/colorUtils";
import { createOrUpdateThemeColorVars } from "../utils/styleUtils";
-const ColorPicker = findComponentByCodeLazy("#{intl::USER_SETTINGS_PROFILE_COLOR_SELECT_COLOR}", ".BACKGROUND_PRIMARY)");
+const ColorPicker = findComponentByCodeLazy(".BACKGROUND_ACCENT.css");
const saveClientTheme = findByCodeLazy('type:"UNSYNCED_USER_SETTINGS_UPDATE', '"system"===');
const NitroThemeStore = findStoreLazy("ClientThemesBackgroundStore");
diff --git a/src/plugins/fakeProfileThemes/index.tsx b/src/plugins/fakeProfileThemes/index.tsx
index 052d2f734..0e8b1d21c 100644
--- a/src/plugins/fakeProfileThemes/index.tsx
+++ b/src/plugins/fakeProfileThemes/index.tsx
@@ -109,7 +109,7 @@ interface ProfileModalProps {
isTryItOutFlow: boolean;
}
-const ColorPicker = findComponentByCodeLazy("#{intl::USER_SETTINGS_PROFILE_COLOR_SELECT_COLOR}", ".BACKGROUND_PRIMARY)");
+const ColorPicker = findComponentByCodeLazy(".BACKGROUND_ACCENT.css");
const ProfileModal = findComponentByCodeLazy("isTryItOutFlow:", "pendingThemeColors:", "pendingAvatarDecoration:", "EDIT_PROFILE_BANNER");
const requireColorPicker = extractAndLoadChunksLazy(["#{intl::USER_SETTINGS_PROFILE_COLOR_DEFAULT_BUTTON}"], /createPromise:\(\)=>\i\.\i(\("?.+?"?\)).then\(\i\.bind\(\i,"?(.+?)"?\)\)/);
diff --git a/src/plugins/pinDms/components/CreateCategoryModal.tsx b/src/plugins/pinDms/components/CreateCategoryModal.tsx
index ac022aad1..187ad9381 100644
--- a/src/plugins/pinDms/components/CreateCategoryModal.tsx
+++ b/src/plugins/pinDms/components/CreateCategoryModal.tsx
@@ -29,7 +29,7 @@ interface ColorPickerWithSwatchesProps {
renderCustomButton?: () => React.ReactNode;
}
-const ColorPicker = findComponentByCodeLazy("#{intl::USER_SETTINGS_PROFILE_COLOR_SELECT_COLOR}", ".BACKGROUND_PRIMARY)");
+const ColorPicker = findComponentByCodeLazy(".BACKGROUND_ACCENT.css");
const ColorPickerWithSwatches = findComponentByCodeLazy('id:"color-picker"');
export const requireSettingsMenu = extractAndLoadChunksLazy(['name:"UserSettings"'], /createPromise:.{0,20}(\i\.\i\("?.+?"?\).*?).then\(\i\.bind\(\i,"?(.+?)"?\)\).{0,50}"UserSettings"/);
From 82f1b9a0f22d09c17e4276811bb733eeb5babbc7 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Tue, 24 Jun 2025 00:51:52 -0400
Subject: [PATCH 071/845] Fix Patches
---
src/equicordplugins/channelTabs/index.tsx | 4 ++--
src/equicordplugins/fastDeleteChannels/index.tsx | 2 +-
src/equicordplugins/moreStickers/index.tsx | 2 +-
src/equicordplugins/unreadBadgeCount/index.tsx | 2 +-
src/plugins/callTimer/index.tsx | 2 +-
src/plugins/fakeNitro/index.tsx | 2 +-
src/plugins/typingIndicator/index.tsx | 2 +-
7 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/src/equicordplugins/channelTabs/index.tsx b/src/equicordplugins/channelTabs/index.tsx
index 43c41cf14..3b4ec88b7 100644
--- a/src/equicordplugins/channelTabs/index.tsx
+++ b/src/equicordplugins/channelTabs/index.tsx
@@ -48,8 +48,8 @@ export default definePlugin({
{
find: ".COLLECTIBLES_SHOP_FULLSCREEN))",
replacement: {
- match: /(\?void 0:(\i)\.channelId.{0,500}return)((.{0,15})"div",{.*?\])(\}\)\}\})/,
- replace: "$1$4$self.render,{currentChannel:$2,children:$3})$5"
+ match: /(?<=\?void 0:(\i)\.channelId.{0,500}return)((.{0,15})"div",{.*?\])(?=\}\)\}\)\}\)\})/,
+ replace: "$3$self.render,{currentChannel:$1,children:$2})"
}
},
// intercept channel navigation to switch/create tabs
diff --git a/src/equicordplugins/fastDeleteChannels/index.tsx b/src/equicordplugins/fastDeleteChannels/index.tsx
index 1facee669..01e2d5e5e 100644
--- a/src/equicordplugins/fastDeleteChannels/index.tsx
+++ b/src/equicordplugins/fastDeleteChannels/index.tsx
@@ -43,7 +43,7 @@ export default definePlugin({
}
},
{
- find: "M11 9H4C2.89543 9 2 8.10457 2 7V1C2 0.447715 1.55228 0 1 0C0.447715 0 0 0.447715 0 1V7C0 9.20914 1.79086 11 4 11H11C11.5523 11 12 10.5523 12 10C12 9.44771 11.5523 9 11 9Z",
+ find: "spineWithGuildIcon]:",
replacement: {
match: /mentionsCount:\i.+?null(?<=channel:(\i).+?)/,
replace: "$&,$self.TrashIcon($1)"
diff --git a/src/equicordplugins/moreStickers/index.tsx b/src/equicordplugins/moreStickers/index.tsx
index 5eada01b9..3194c19d6 100644
--- a/src/equicordplugins/moreStickers/index.tsx
+++ b/src/equicordplugins/moreStickers/index.tsx
@@ -32,7 +32,7 @@ export default definePlugin({
patches: [
{
- find: "ChannelStickerPickerButton",
+ find: ".stickerButton)},",
replacement: [{
match: /(children:\(0,\i\.jsx\)\()(.{0,10})({innerClassName.{10,30}\.stickerButton)/,
replace: "$1arguments[0]?.stickersType?$self.stickerButton:$2$3"
diff --git a/src/equicordplugins/unreadBadgeCount/index.tsx b/src/equicordplugins/unreadBadgeCount/index.tsx
index d2dd9fcd1..c8d014ba0 100644
--- a/src/equicordplugins/unreadBadgeCount/index.tsx
+++ b/src/equicordplugins/unreadBadgeCount/index.tsx
@@ -75,7 +75,7 @@ export default definePlugin({
// Threads
{
// This is the thread "spine" that shows in the left
- find: "M11 9H4C2.89543 9 2 8.10457 2 7V1C2 0.447715 1.55228 0 1 0C0.447715 0 0 0.447715 0 1V7C0 9.20914 1.79086 11 4 11H11C11.5523 11 12 10.5523 12 10C12 9.44771 11.5523 9 11 9Z",
+ find: "spineWithGuildIcon]:",
replacement: [
{
match: /mentionsCount:\i.{0,50}?null/,
diff --git a/src/plugins/callTimer/index.tsx b/src/plugins/callTimer/index.tsx
index 7b74bc231..e27084c3f 100644
--- a/src/plugins/callTimer/index.tsx
+++ b/src/plugins/callTimer/index.tsx
@@ -53,7 +53,7 @@ export default definePlugin({
patches: [{
find: "renderConnectionStatus(){",
replacement: {
- match: /(renderConnectionStatus\(\){.+\.channel,children:)(.+?}\):\i)(?=}\))/,
+ match: /(renderConnectionStatus\(\){.+\.channel,children:)(.+?}\))(?=}\))/,
replace: "$1[$2,$self.renderTimer(this.props.channel.id)]"
}
}],
diff --git a/src/plugins/fakeNitro/index.tsx b/src/plugins/fakeNitro/index.tsx
index f560211da..150598c05 100644
--- a/src/plugins/fakeNitro/index.tsx
+++ b/src/plugins/fakeNitro/index.tsx
@@ -396,7 +396,7 @@ export default definePlugin({
},
// Separate patch for allowing using custom app icons
{
- find: "?24:30,",
+ find: "getCurrentDesktopIcon(),",
replacement: {
match: /\i\.\i\.isPremium\(\i\.\i\.getCurrentUser\(\)\)/,
replace: "true"
diff --git a/src/plugins/typingIndicator/index.tsx b/src/plugins/typingIndicator/index.tsx
index 435b302a5..8e62a1b1b 100644
--- a/src/plugins/typingIndicator/index.tsx
+++ b/src/plugins/typingIndicator/index.tsx
@@ -178,7 +178,7 @@ export default definePlugin({
// Theads
{
// This is the thread "spine" that shows in the left
- find: "M11 9H4C2.89543 9 2 8.10457 2 7V1C2 0.447715 1.55228 0 1 0C0.447715 0 0 0.447715 0 1V7C0 9.20914 1.79086 11 4 11H11C11.5523 11 12 10.5523 12 10C12 9.44771 11.5523 9 11 9Z",
+ find: "spineWithGuildIcon]:",
replacement: {
match: /mentionsCount:\i.+?null(?<=channel:(\i).+?)/,
replace: "$&,$self.TypingIndicator($1.id,$1.getGuildId())"
From 167d48d3ac2f1878924e8bc9b921cc2ad1ae0ee4 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Tue, 24 Jun 2025 20:21:39 -0400
Subject: [PATCH 072/845] BetterBanReasons: Fix Patch
---
src/equicordplugins/betterBanReasons/index.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/equicordplugins/betterBanReasons/index.tsx b/src/equicordplugins/betterBanReasons/index.tsx
index 48a7e83ec..dc9ee5bdc 100644
--- a/src/equicordplugins/betterBanReasons/index.tsx
+++ b/src/equicordplugins/betterBanReasons/index.tsx
@@ -82,7 +82,7 @@ export default definePlugin({
replace: "$self.getReasons()"
},
{
- match: /useState\((null|0)\)(?=.{0,200}targetUserId:)/,
+ match: /useState\(null\)(?=.{0,300}targetUserId:)/,
replace: "useState($self.getDefaultState())"
}]
}
From 9b24535d44f314b052227f015b1a55942c604df6 Mon Sep 17 00:00:00 2001
From: sadan4 <117494111+sadan4@users.noreply.github.com>
Date: Tue, 24 Jun 2025 20:44:11 -0400
Subject: [PATCH 073/845] FakeNitro: fix crash when embed.url is undefined
(#3510)
---
src/plugins/fakeNitro/index.tsx | 48 ++++++++++++++++++---------------
1 file changed, 27 insertions(+), 21 deletions(-)
diff --git a/src/plugins/fakeNitro/index.tsx b/src/plugins/fakeNitro/index.tsx
index 4bdf194ce..a4da103e0 100644
--- a/src/plugins/fakeNitro/index.tsx
+++ b/src/plugins/fakeNitro/index.tsx
@@ -671,32 +671,38 @@ export default definePlugin({
},
shouldIgnoreEmbed(embed: Message["embeds"][number], message: Message) {
- const contentItems = message.content.split(/\s/);
- if (contentItems.length > 1 && !settings.store.transformCompoundSentence) return false;
+ try {
+ const contentItems = message.content.split(/\s/);
+ if (contentItems.length > 1 && !settings.store.transformCompoundSentence) return false;
- switch (embed.type) {
- case "image": {
- if (
- !settings.store.transformCompoundSentence
- && !contentItems.some(item => item === embed.url! || item.match(hyperLinkRegex)?.[1] === embed.url!)
- ) return false;
+ switch (embed.type) {
+ case "image": {
+ const url = embed.url ?? embed.image?.url;
+ if (!url) return false;
+ if (
+ !settings.store.transformCompoundSentence
+ && !contentItems.some(item => item === url || item.match(hyperLinkRegex)?.[1] === url)
+ ) return false;
- if (settings.store.transformEmojis) {
- if (fakeNitroEmojiRegex.test(embed.url!)) return true;
- }
-
- if (settings.store.transformStickers) {
- if (fakeNitroStickerRegex.test(embed.url!)) return true;
-
- const gifMatch = embed.url!.match(fakeNitroGifStickerRegex);
- if (gifMatch) {
- // There is no way to differentiate a regular gif attachment from a fake nitro animated sticker, so we check if the StickerStore contains the id of the fake sticker
- if (StickerStore.getStickerById(gifMatch[1])) return true;
+ if (settings.store.transformEmojis) {
+ if (fakeNitroEmojiRegex.test(url)) return true;
}
- }
- break;
+ if (settings.store.transformStickers) {
+ if (fakeNitroStickerRegex.test(url)) return true;
+
+ const gifMatch = url.match(fakeNitroGifStickerRegex);
+ if (gifMatch) {
+ // There is no way to differentiate a regular gif attachment from a fake nitro animated sticker, so we check if the StickerStore contains the id of the fake sticker
+ if (StickerStore.getStickerById(gifMatch[1])) return true;
+ }
+ }
+
+ break;
+ }
}
+ } catch (e) {
+ new Logger("FakeNitro").error("Error in shouldIgnoreEmbed:", e);
}
return false;
From b6ffb33adca2e26e728ee89becae3202d4caf65f Mon Sep 17 00:00:00 2001
From: sadan4 <117494111+sadan4@users.noreply.github.com>
Date: Tue, 24 Jun 2025 21:25:36 -0400
Subject: [PATCH 074/845] Fix plugins for latest discord update (#3509)
Co-authored-by: Etorix <92535668+EtorixDev@users.noreply.github.com>
Co-authored-by: V
---
src/plugins/callTimer/index.tsx | 3 +-
.../clientTheme/components/Settings.tsx | 5 +-
src/plugins/fakeNitro/index.tsx | 2 +-
src/plugins/fakeProfileThemes/index.tsx | 95 +++++++++----------
.../pinDms/components/CreateCategoryModal.tsx | 10 +-
src/plugins/typingIndicator/index.tsx | 2 +-
src/webpack/common/components.ts | 3 +
src/webpack/common/types/components.d.ts | 7 ++
8 files changed, 61 insertions(+), 66 deletions(-)
diff --git a/src/plugins/callTimer/index.tsx b/src/plugins/callTimer/index.tsx
index bdcca7772..dcab05516 100644
--- a/src/plugins/callTimer/index.tsx
+++ b/src/plugins/callTimer/index.tsx
@@ -75,7 +75,8 @@ export default definePlugin({
patches: [{
find: "renderConnectionStatus(){",
replacement: {
- match: /(renderConnectionStatus\(\){.+\.channel,children:)(.+?}\):\i)(?=}\))/,
+ // in renderConnectionStatus()
+ match: /(lineClamp:1,children:)(\i)(?=,|}\))/,
replace: "$1[$2,$self.renderTimer(this.props.channel.id)]"
}
}],
diff --git a/src/plugins/clientTheme/components/Settings.tsx b/src/plugins/clientTheme/components/Settings.tsx
index f38380fa7..9e7f867e1 100644
--- a/src/plugins/clientTheme/components/Settings.tsx
+++ b/src/plugins/clientTheme/components/Settings.tsx
@@ -7,14 +7,13 @@
import { classNameFactory } from "@api/Styles";
import { ErrorCard } from "@components/ErrorCard";
import { Margins } from "@utils/margins";
-import { findByCodeLazy, findComponentByCodeLazy, findStoreLazy } from "@webpack";
-import { Button, Forms, ThemeStore, useStateFromStores } from "@webpack/common";
+import { findByCodeLazy, findStoreLazy } from "@webpack";
+import { Button, ColorPicker, Forms, ThemeStore, useStateFromStores } from "@webpack/common";
import { settings } from "..";
import { relativeLuminance } from "../utils/colorUtils";
import { createOrUpdateThemeColorVars } from "../utils/styleUtils";
-const ColorPicker = findComponentByCodeLazy("#{intl::USER_SETTINGS_PROFILE_COLOR_SELECT_COLOR}", ".BACKGROUND_PRIMARY)");
const saveClientTheme = findByCodeLazy('type:"UNSYNCED_USER_SETTINGS_UPDATE', '"system"===');
const NitroThemeStore = findStoreLazy("ClientThemesBackgroundStore");
diff --git a/src/plugins/fakeNitro/index.tsx b/src/plugins/fakeNitro/index.tsx
index a4da103e0..f362a3557 100644
--- a/src/plugins/fakeNitro/index.tsx
+++ b/src/plugins/fakeNitro/index.tsx
@@ -394,7 +394,7 @@ export default definePlugin({
},
// Separate patch for allowing using custom app icons
{
- find: "?24:30,",
+ find: "getCurrentDesktopIcon(),",
replacement: {
match: /\i\.\i\.isPremium\(\i\.\i\.getCurrentUser\(\)\)/,
replace: "true"
diff --git a/src/plugins/fakeProfileThemes/index.tsx b/src/plugins/fakeProfileThemes/index.tsx
index 4c789b766..61ab1731d 100644
--- a/src/plugins/fakeProfileThemes/index.tsx
+++ b/src/plugins/fakeProfileThemes/index.tsx
@@ -24,10 +24,9 @@ import ErrorBoundary from "@components/ErrorBoundary";
import { Devs } from "@utils/constants";
import { Margins } from "@utils/margins";
import { classes, copyWithToast } from "@utils/misc";
-import { useAwaiter } from "@utils/react";
import definePlugin, { OptionType } from "@utils/types";
-import { extractAndLoadChunksLazy, findComponentByCodeLazy } from "@webpack";
-import { Button, Flex, Forms, React, Text, UserProfileStore, UserStore, useState } from "@webpack/common";
+import { findComponentByCodeLazy } from "@webpack";
+import { Button, ColorPicker, Flex, Forms, React, Text, UserProfileStore, UserStore, useState } from "@webpack/common";
import { User } from "discord-types/general";
import { ReactElement } from "react";
import virtualMerge from "virtual-merge";
@@ -109,10 +108,8 @@ interface ProfileModalProps {
isTryItOutFlow: boolean;
}
-const ColorPicker = findComponentByCodeLazy("#{intl::USER_SETTINGS_PROFILE_COLOR_SELECT_COLOR}", ".BACKGROUND_PRIMARY)");
const ProfileModal = findComponentByCodeLazy("isTryItOutFlow:", "pendingThemeColors:", "pendingAvatarDecoration:", "EDIT_PROFILE_BANNER");
-const requireColorPicker = extractAndLoadChunksLazy(["#{intl::USER_SETTINGS_PROFILE_COLOR_DEFAULT_BUTTON}"], /createPromise:\(\)=>\i\.\i(\("?.+?"?\)).then\(\i\.bind\(\i,"?(.+?)"?\)\)/);
export default definePlugin({
name: "FakeProfileThemes",
@@ -141,8 +138,6 @@ export default definePlugin({
const [color1, setColor1] = useState(existingColors[0]);
const [color2, setColor2] = useState(existingColors[1]);
- const [, , loadingColorPickerChunk] = useAwaiter(requireColorPicker);
-
return (
Usage
@@ -162,51 +157,49 @@ export default definePlugin({
className={classes(Margins.top8, Margins.bottom8)}
/>
Color pickers
- {!loadingColorPickerChunk && (
-
+
+ Primary
+
+ }
+ onChange={(color: number) => {
+ setColor1(color);
+ }}
+ />
+
+ Accent
+
+ }
+ onChange={(color: number) => {
+ setColor2(color);
+ }}
+ />
+ {
+ const colorString = encode(color1, color2);
+ copyWithToast(colorString);
+ }}
+ color={Button.Colors.PRIMARY}
+ size={Button.Sizes.XLARGE}
>
-
- Primary
-
- }
- onChange={(color: number) => {
- setColor1(color);
- }}
- />
-
- Accent
-
- }
- onChange={(color: number) => {
- setColor2(color);
- }}
- />
- {
- const colorString = encode(color1, color2);
- copyWithToast(colorString);
- }}
- color={Button.Colors.PRIMARY}
- size={Button.Sizes.XLARGE}
- >
- Copy 3y3
-
-
- )}
+ Copy 3y3
+
+
diff --git a/src/plugins/pinDms/components/CreateCategoryModal.tsx b/src/plugins/pinDms/components/CreateCategoryModal.tsx
index 8c0fc6599..e769f4b66 100644
--- a/src/plugins/pinDms/components/CreateCategoryModal.tsx
+++ b/src/plugins/pinDms/components/CreateCategoryModal.tsx
@@ -7,18 +7,11 @@
import { classNameFactory } from "@api/Styles";
import { ModalContent, ModalFooter, ModalHeader, ModalProps, ModalRoot, openModalLazy } from "@utils/modal";
import { extractAndLoadChunksLazy, findComponentByCodeLazy } from "@webpack";
-import { Button, Forms, Text, TextInput, Toasts, useMemo, useState } from "@webpack/common";
+import { Button, ColorPicker, Forms, Text, TextInput, Toasts, useMemo, useState } from "@webpack/common";
import { DEFAULT_COLOR, SWATCHES } from "../constants";
import { categoryLen, createCategory, getCategory } from "../data";
-interface ColorPickerProps {
- color: number | null;
- showEyeDropper?: boolean;
- suggestedColors?: string[];
- onChange(value: number | null): void;
-}
-
interface ColorPickerWithSwatchesProps {
defaultColor: number;
colors: number[];
@@ -29,7 +22,6 @@ interface ColorPickerWithSwatchesProps {
renderCustomButton?: () => React.ReactNode;
}
-const ColorPicker = findComponentByCodeLazy("#{intl::USER_SETTINGS_PROFILE_COLOR_SELECT_COLOR}", ".BACKGROUND_PRIMARY)");
const ColorPickerWithSwatches = findComponentByCodeLazy('id:"color-picker"');
export const requireSettingsMenu = extractAndLoadChunksLazy(['name:"UserSettings"'], /createPromise:.{0,20}(\i\.\i\("?.+?"?\).*?).then\(\i\.bind\(\i,"?(.+?)"?\)\).{0,50}"UserSettings"/);
diff --git a/src/plugins/typingIndicator/index.tsx b/src/plugins/typingIndicator/index.tsx
index e6903bcde..a5c9f49c4 100644
--- a/src/plugins/typingIndicator/index.tsx
+++ b/src/plugins/typingIndicator/index.tsx
@@ -178,7 +178,7 @@ export default definePlugin({
// Theads
{
// This is the thread "spine" that shows in the left
- find: "M11 9H4C2.89543 9 2 8.10457 2 7V1C2 0.447715 1.55228 0 1 0C0.447715 0 0 0.447715 0 1V7C0 9.20914 1.79086 11 4 11H11C11.5523 11 12 10.5523 12 10C12 9.44771 11.5523 9 11 9Z",
+ find: "M0 15H2c0 1.6569",
replacement: {
match: /mentionsCount:\i.+?null(?<=channel:(\i).+?)/,
replace: "$&,$self.TypingIndicator($1.id,$1.getGuildId())"
diff --git a/src/webpack/common/components.ts b/src/webpack/common/components.ts
index a772c98d5..bcce3cbb0 100644
--- a/src/webpack/common/components.ts
+++ b/src/webpack/common/components.ts
@@ -65,6 +65,9 @@ export const Paginator = waitForComponent("Paginator", filters.comp
export const Clickable = waitForComponent("Clickable", filters.componentByCode("this.context?this.renderNonInteractive():"));
export const Avatar = waitForComponent("Avatar", filters.componentByCode(".size-1.375*"));
+export const ColorPicker = waitForComponent("ColorPicker", filters.componentByCode("#{intl::USER_SETTINGS_PROFILE_COLOR_SELECT_COLOR}", "showEyeDropper"));
+
+
export let createScroller: (scrollbarClassName: string, fadeClassName: string, customThemeClassName: string) => t.ScrollerThin;
export let scrollerClasses: Record;
waitFor(filters.byCode('="ltr",orientation:', "customTheme:", "forwardRef"), m => createScroller = m);
diff --git a/src/webpack/common/types/components.d.ts b/src/webpack/common/types/components.d.ts
index 7a9e848b1..783663cb5 100644
--- a/src/webpack/common/types/components.d.ts
+++ b/src/webpack/common/types/components.d.ts
@@ -536,3 +536,10 @@ export type Icon = ComponentType>;
+export type ColorPicker = ComponentType<{
+ color: number | null;
+ showEyeDropper?: boolean;
+ suggestedColors?: string[];
+ label?: ReactNode;
+ onChange(value: number | null): void;
+}>;
From decb49fc0ab99f0cbf7f229738ddfcacbcf384ff Mon Sep 17 00:00:00 2001
From: Vendicated
Date: Wed, 25 Jun 2025 03:27:34 +0200
Subject: [PATCH 075/845] v1.12.4
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index f45d9f2f0..87c484a7d 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "vencord",
"private": "true",
- "version": "1.12.3",
+ "version": "1.12.4",
"description": "The cutest Discord client mod",
"homepage": "https://github.com/Vendicated/Vencord#readme",
"bugs": {
From 581a19606f9fd3ec8158cd447cbdea4261b4c18f Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Tue, 24 Jun 2025 21:48:47 -0400
Subject: [PATCH 076/845] Update StickerStore & ColorPicker
---
.../components/SettingColorComponent.tsx | 11 ++---------
.../channelTabs/components/ChannelTabsContainer.tsx | 2 +-
src/equicordplugins/channelTabs/util/constants.tsx | 2 +-
src/equicordplugins/channelTabs/util/tabs.tsx | 2 +-
src/equicordplugins/copyStickerLinks/index.tsx | 7 ++-----
.../customUserColors/SetColorModal.tsx | 11 +----------
src/equicordplugins/glide/index.tsx | 7 ++-----
src/equicordplugins/guildPickerDumper/index.tsx | 4 ++--
src/equicordplugins/imagePreview/index.ts | 4 ++--
.../remix/editor/components/SettingColorComponent.tsx | 5 +----
src/plugins/expressionCloner/index.tsx | 7 +++----
src/webpack/common/stores.ts | 4 ++--
src/webpack/common/types/stores.d.ts | 2 +-
13 files changed, 21 insertions(+), 47 deletions(-)
diff --git a/src/components/ThemeSettings/components/SettingColorComponent.tsx b/src/components/ThemeSettings/components/SettingColorComponent.tsx
index a23be1e74..5ebf86e50 100644
--- a/src/components/ThemeSettings/components/SettingColorComponent.tsx
+++ b/src/components/ThemeSettings/components/SettingColorComponent.tsx
@@ -7,15 +7,8 @@
import "./colorStyles.css";
import { classNameFactory } from "@api/Styles";
-import { findByCodeLazy, findComponentByCodeLazy } from "@webpack";
-import { Forms, useMemo } from "@webpack/common";
-
-interface ColorPickerProps {
- color: number | null;
- showEyeDropper?: boolean;
- onChange(value: number | null): void;
-}
-const ColorPicker = findComponentByCodeLazy(".BACKGROUND_ACCENT.css");
+import { findByCodeLazy } from "@webpack";
+import { ColorPicker, Forms, useMemo } from "@webpack/common";
// TinyColor is completely unmangled and it's duplicated in two modules! Fun!
const TinyColor: tinycolor.Constructor = findByCodeLazy("this._gradientType=");
diff --git a/src/equicordplugins/channelTabs/components/ChannelTabsContainer.tsx b/src/equicordplugins/channelTabs/components/ChannelTabsContainer.tsx
index 8ee35fc3a..531546c0d 100644
--- a/src/equicordplugins/channelTabs/components/ChannelTabsContainer.tsx
+++ b/src/equicordplugins/channelTabs/components/ChannelTabsContainer.tsx
@@ -130,4 +130,4 @@ export function ChannelTabsPreview(p) {
>
);
-}
\ No newline at end of file
+}
diff --git a/src/equicordplugins/channelTabs/util/constants.tsx b/src/equicordplugins/channelTabs/util/constants.tsx
index 7d72f16cc..2bb0db768 100644
--- a/src/equicordplugins/channelTabs/util/constants.tsx
+++ b/src/equicordplugins/channelTabs/util/constants.tsx
@@ -99,4 +99,4 @@ export const settings = definePluginSettings({
}
});
-export const CircleQuestionIcon = findComponentByCodeLazy("10.58l-3.3-3.3a1");
\ No newline at end of file
+export const CircleQuestionIcon = findComponentByCodeLazy("10.58l-3.3-3.3a1");
diff --git a/src/equicordplugins/channelTabs/util/tabs.tsx b/src/equicordplugins/channelTabs/util/tabs.tsx
index 747734950..fe8dcd329 100644
--- a/src/equicordplugins/channelTabs/util/tabs.tsx
+++ b/src/equicordplugins/channelTabs/util/tabs.tsx
@@ -306,4 +306,4 @@ export function useGhostTabs() {
setCount(0);
};
return new Array(count).fill(
);
-}
\ No newline at end of file
+}
diff --git a/src/equicordplugins/copyStickerLinks/index.tsx b/src/equicordplugins/copyStickerLinks/index.tsx
index d4d95841b..ac4a43d4c 100644
--- a/src/equicordplugins/copyStickerLinks/index.tsx
+++ b/src/equicordplugins/copyStickerLinks/index.tsx
@@ -8,12 +8,9 @@ import { findGroupChildrenByChildId, NavContextMenuPatchCallback } from "@api/Co
import { Devs } from "@utils/constants";
import { copyWithToast } from "@utils/misc";
import definePlugin from "@utils/types";
-import { findStoreLazy } from "@webpack";
-import { Menu, React } from "@webpack/common";
+import { Menu, React, StickerStore } from "@webpack/common";
import { Promisable } from "type-fest";
-const StickersStore = findStoreLazy("StickersStore");
-
interface Sticker {
t: "Sticker";
format_type: number;
@@ -117,7 +114,7 @@ const expressionPickerPatch: NavContextMenuPatchCallback = (children, props: { t
if (!id) return;
if (!props.target.className?.includes("lottieCanvas")) {
- const stickerCache = StickersStore.getStickerById(id);
+ const stickerCache = StickerStore.getStickerById(id);
if (stickerCache) {
children.push(buildMenuExpression("Sticker", () => stickerCache));
}
diff --git a/src/equicordplugins/customUserColors/SetColorModal.tsx b/src/equicordplugins/customUserColors/SetColorModal.tsx
index dcbeef069..ba979da67 100644
--- a/src/equicordplugins/customUserColors/SetColorModal.tsx
+++ b/src/equicordplugins/customUserColors/SetColorModal.tsx
@@ -8,19 +8,10 @@ import { set } from "@api/DataStore";
import { classNameFactory } from "@api/Styles";
import { Margins } from "@utils/margins";
import { ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalProps, ModalRoot } from "@utils/modal";
-import { findComponentByCodeLazy } from "@webpack";
-import { Button, Forms, useState } from "@webpack/common";
+import { Button, ColorPicker, Forms, useState } from "@webpack/common";
import { colors, DATASTORE_KEY } from "./index";
-interface ColorPickerProps {
- color: number;
- showEyeDropper?: boolean;
- suggestedColors?: string[];
- onChange(value: number | null): void;
-}
-const ColorPicker = findComponentByCodeLazy(".BACKGROUND_ACCENT.css");
-
const cl = classNameFactory("vc-customColors-");
export function SetColorModal({ userId, modalProps }: { userId: string, modalProps: ModalProps; }) {
diff --git a/src/equicordplugins/glide/index.tsx b/src/equicordplugins/glide/index.tsx
index 7e6a6976f..919b74e69 100644
--- a/src/equicordplugins/glide/index.tsx
+++ b/src/equicordplugins/glide/index.tsx
@@ -8,8 +8,7 @@ import { definePluginSettings, Settings } from "@api/Settings";
import { copyToClipboard } from "@utils/clipboard";
import { Devs } from "@utils/constants";
import definePlugin, { OptionType, StartAt } from "@utils/types";
-import { findComponentByCodeLazy } from "@webpack";
-import { Button, Forms, TextInput, Toasts, useState } from "@webpack/common";
+import { Button, ColorPicker, Forms, TextInput, Toasts, useState } from "@webpack/common";
import { darkenColorHex, generateRandomColorHex, saturateColorHex } from "./generateTheme";
import { themes } from "./themeDefinitions";
@@ -86,8 +85,6 @@ function CopyPresetComponent() {
);
}
-const ColorPicker = findComponentByCodeLazy(".BACKGROUND_ACCENT.css");
-
export function generateAndApplyProceduralTheme() {
const randomBackgroundColor = generateRandomColorHex();
@@ -214,7 +211,7 @@ export function ColorPick({ propertyname }: { propertyname: string; }) {
{
- const hexColor = color.toString(16).padStart(6, "0");
+ const hexColor = (color ?? 0).toString(16).padStart(6, "0");
settings.store[propertyname] = hexColor;
injectCSS();
}
diff --git a/src/equicordplugins/guildPickerDumper/index.tsx b/src/equicordplugins/guildPickerDumper/index.tsx
index 754ba8087..1499201b7 100644
--- a/src/equicordplugins/guildPickerDumper/index.tsx
+++ b/src/equicordplugins/guildPickerDumper/index.tsx
@@ -8,7 +8,7 @@ import { findGroupChildrenByChildId, NavContextMenuPatchCallback } from "@api/Co
import { migratePluginSettings } from "@api/Settings";
import { Devs, EquicordDevs } from "@utils/constants";
import definePlugin from "@utils/types";
-import { EmojiStore, Menu, StickersStore } from "@webpack/common";
+import { EmojiStore, Menu, StickerStore } from "@webpack/common";
import type { Guild } from "discord-types/general";
import { zipSync } from "fflate";
@@ -30,7 +30,7 @@ async function zipGuildAssets(guild: Guild, type: "emojis" | "stickers") {
const isEmojis = type === "emojis";
const items = isEmojis
? EmojiStore.getGuilds()[guild.id]?.emojis
- : StickersStore.getStickersByGuildId(guild.id);
+ : StickerStore.getStickersByGuildId(guild.id);
if (!items) {
return console.log("Server not found!");
diff --git a/src/equicordplugins/imagePreview/index.ts b/src/equicordplugins/imagePreview/index.ts
index 2d177f286..a3c8f6a46 100644
--- a/src/equicordplugins/imagePreview/index.ts
+++ b/src/equicordplugins/imagePreview/index.ts
@@ -9,7 +9,7 @@ import "./styles.css";
import { EquicordDevs } from "@utils/constants";
import { Logger } from "@utils/Logger";
import definePlugin from "@utils/types";
-import { StickersStore } from "@webpack/common";
+import { StickerStore } from "@webpack/common";
import { getMimeType, isLinkAnImage, settings, stripDiscordParams } from "./settings";
@@ -121,7 +121,7 @@ function loadImagePreview(url: string, sticker: boolean) {
if (sticker) {
const stickerId = url.split("/").pop()?.split(".")[0] ?? null;
- const stickerData = stickerId ? StickersStore.getStickerById(stickerId) : null;
+ const stickerData = stickerId ? StickerStore.getStickerById(stickerId) : null;
if (stickerData) {
switch (stickerData.type) {
diff --git a/src/equicordplugins/remix/editor/components/SettingColorComponent.tsx b/src/equicordplugins/remix/editor/components/SettingColorComponent.tsx
index 457fcce7e..f768d9ce9 100644
--- a/src/equicordplugins/remix/editor/components/SettingColorComponent.tsx
+++ b/src/equicordplugins/remix/editor/components/SettingColorComponent.tsx
@@ -10,8 +10,7 @@
import "./colorStyles.css";
import { classNameFactory } from "@api/Styles";
-import { findComponentByCodeLazy } from "@webpack";
-import { Forms } from "@webpack/common";
+import { ColorPicker, Forms } from "@webpack/common";
interface ColorPickerProps {
color: number | null;
@@ -19,8 +18,6 @@ interface ColorPickerProps {
onChange(value: number | null): void;
}
-const ColorPicker = findComponentByCodeLazy(".BACKGROUND_ACCENT.css");
-
const cl = classNameFactory("vc-remix-settings-color-");
interface Props {
diff --git a/src/plugins/expressionCloner/index.tsx b/src/plugins/expressionCloner/index.tsx
index 3a73489c5..b723c8184 100644
--- a/src/plugins/expressionCloner/index.tsx
+++ b/src/plugins/expressionCloner/index.tsx
@@ -24,12 +24,11 @@ import { Logger } from "@utils/Logger";
import { Margins } from "@utils/margins";
import { ModalContent, ModalHeader, ModalRoot, openModalLazy } from "@utils/modal";
import definePlugin from "@utils/types";
-import { findByCodeLazy, findStoreLazy } from "@webpack";
-import { Constants, EmojiStore, FluxDispatcher, Forms, GuildStore, Menu, PermissionsBits, PermissionStore, React, RestAPI, Toasts, Tooltip, UserStore } from "@webpack/common";
+import { findByCodeLazy } from "@webpack";
+import { Constants, EmojiStore, FluxDispatcher, Forms, GuildStore, Menu, PermissionsBits, PermissionStore, React, RestAPI, StickerStore, Toasts, Tooltip, UserStore } from "@webpack/common";
import { Guild } from "discord-types/general";
import { Promisable } from "type-fest";
-const StickersStore = findStoreLazy("StickersStore");
const uploadEmoji = findByCodeLazy(".GUILD_EMOJIS(", "EMOJI_UPLOAD_START");
const getGuildMaxEmojiSlots = findByCodeLazy(".additionalEmojiSlots") as (guild: Guild) => number;
@@ -64,7 +63,7 @@ function getUrl(data: Data) {
}
async function fetchSticker(id: string) {
- const cached = StickersStore.getStickerById(id);
+ const cached = StickerStore.getStickerById(id);
if (cached) return cached;
const { body } = await RestAPI.get({
diff --git a/src/webpack/common/stores.ts b/src/webpack/common/stores.ts
index b554f7acd..0d24ad93a 100644
--- a/src/webpack/common/stores.ts
+++ b/src/webpack/common/stores.ts
@@ -50,7 +50,7 @@ export let GuildMemberStore: Stores.GuildMemberStore & t.FluxStore;
export let RelationshipStore: t.RelationshipStore;
export let EmojiStore: t.EmojiStore;
-export let StickersStore: t.StickersStore;
+export let StickerStore: t.StickerStore;
export let ThemeStore: t.ThemeStore;
export let WindowStore: t.WindowStore;
export let DraftStore: t.DraftStore;
@@ -83,7 +83,7 @@ waitForStore("GuildChannelStore", m => GuildChannelStore = m);
waitForStore("MessageStore", m => MessageStore = m);
waitForStore("WindowStore", m => WindowStore = m);
waitForStore("EmojiStore", m => EmojiStore = m);
-waitForStore("StickersStore", m => StickersStore = m);
+waitForStore("StickersStore", m => StickerStore = m);
waitForStore("TypingStore", m => TypingStore = m);
waitForStore("ThemeStore", m => {
ThemeStore = m;
diff --git a/src/webpack/common/types/stores.d.ts b/src/webpack/common/types/stores.d.ts
index d83a75daf..f14a3fc1a 100644
--- a/src/webpack/common/types/stores.d.ts
+++ b/src/webpack/common/types/stores.d.ts
@@ -177,7 +177,7 @@ export class EmojiStore extends FluxStore {
};
}
-export class StickersStore extends FluxStore {
+export class StickerStore extends FluxStore {
getStickerById(id: string): Sticker | undefined;
getStickerPack(id: string): StickerPack | undefined;
getPremiumPacks(): StickerPack[];
From 38b53486a92c86c536f1935a799bf39dd6892ff7 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Thu, 26 Jun 2025 15:52:24 -0400
Subject: [PATCH 077/845] EquicordHelper: Better Description
---
src/equicordplugins/equicordHelper/index.tsx | 13 +++++++++++--
src/equicordplugins/equicordHelper/native.ts | 5 +++--
src/main/csp/index.ts | 2 +-
3 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/src/equicordplugins/equicordHelper/index.tsx b/src/equicordplugins/equicordHelper/index.tsx
index 08db2e993..93a814f68 100644
--- a/src/equicordplugins/equicordHelper/index.tsx
+++ b/src/equicordplugins/equicordHelper/index.tsx
@@ -43,8 +43,17 @@ export default definePlugin({
description: "Fixes some misc issues with discord",
authors: [EquicordDevs.thororen, EquicordDevs.nyx],
settingsAboutComponent: () => <>
-
- This Plugin is used for fixing misc issues with discord such as some crashes
+
+ 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
+
+ - Option to hide Clan Badges
>,
settings,
diff --git a/src/equicordplugins/equicordHelper/native.ts b/src/equicordplugins/equicordHelper/native.ts
index 9b72dc271..14a85ad50 100644
--- a/src/equicordplugins/equicordHelper/native.ts
+++ b/src/equicordplugins/equicordHelper/native.ts
@@ -4,6 +4,7 @@
* SPDX-License-Identifier: GPL-3.0-or-later
*/
-import { CspPolicies, Src } from "@main/csp";
+import { CspPolicies, CSPSrc } from "@main/csp";
-CspPolicies["*"] = Src;
+// Allow all domains to have the permissions from CSPSrc
+CspPolicies["*"] = CSPSrc;
diff --git a/src/main/csp/index.ts b/src/main/csp/index.ts
index 21949e0af..c3fb88698 100644
--- a/src/main/csp/index.ts
+++ b/src/main/csp/index.ts
@@ -14,7 +14,7 @@ export const ImageSrc = [...ConnectSrc, "img-src"];
export const CssSrc = ["style-src", "font-src"];
export const ImageAndCssSrc = [...ImageSrc, ...CssSrc];
export const ImageScriptsAndCssSrc = [...ImageAndCssSrc, "script-src", "worker-src"];
-export const Src = ["style-src", "connect-src", "img-src", "frame-src", "font-src", "media-src", "worker-src"];
+export const CSPSrc = ["style-src", "connect-src", "img-src", "frame-src", "font-src", "media-src", "worker-src"];
// Plugins can whitelist their own domains by importing this object in their native.ts
// script and just adding to it. But generally, you should just edit this file instead
From 0419110526059bf1d733ecf46c03b0b90340b009 Mon Sep 17 00:00:00 2001
From: panbread <93918332+Panniku@users.noreply.github.com>
Date: Fri, 27 Jun 2025 01:25:17 +0530
Subject: [PATCH 078/845] fix(serverListIndicators): var(--text-normal); (#295)
* fix(serverListIndicators): desktop refresh
* fix(githubRepos): refactor and compactify
* add styles
* fix(serverListIndicators): consistency
* fix(serverListIndicators): var(--text-normal);
---
src/plugins/serverListIndicators/styles.css | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/plugins/serverListIndicators/styles.css b/src/plugins/serverListIndicators/styles.css
index 09a309054..6ca57f9c0 100644
--- a/src/plugins/serverListIndicators/styles.css
+++ b/src/plugins/serverListIndicators/styles.css
@@ -62,7 +62,7 @@
font-size: 12px;
font-weight: 600;
width: 100%;
- color: var(--text-normal);
+ color: var(--text-default);
}
#vc-friendcount-icon,
From 2565f5e30bba3b5cbb43aca4cd11a0a12fbf3a95 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Thu, 26 Jun 2025 16:03:27 -0400
Subject: [PATCH 079/845] Fix Patches
---
src/plugins/blurNsfw/index.ts | 2 +-
src/plugins/showMeYourName/index.tsx | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/plugins/blurNsfw/index.ts b/src/plugins/blurNsfw/index.ts
index c4023f098..b1f8e0469 100644
--- a/src/plugins/blurNsfw/index.ts
+++ b/src/plugins/blurNsfw/index.ts
@@ -43,7 +43,7 @@ export default definePlugin({
patches: [
{
- find: ".embedWrapper,embed",
+ find: ".renderEmbedDescription,message",
replacement: [{
match: /\.container/,
replace: "$&+(this.props.channel.nsfw? ' vc-nsfw-img': '')"
diff --git a/src/plugins/showMeYourName/index.tsx b/src/plugins/showMeYourName/index.tsx
index c86289673..5023e7f39 100644
--- a/src/plugins/showMeYourName/index.tsx
+++ b/src/plugins/showMeYourName/index.tsx
@@ -89,7 +89,7 @@ export default definePlugin({
authors: [Devs.Rini, Devs.TheKodeToad, Devs.nyx],
patches: [
{
- find: '"BaseUsername"',
+ find: ".SYSTEM_TAG=0",
replacement: {
/* TODO: remove \i+\i once change makes it to stable */
match: /(?<=onContextMenu:\i,children:)(?:\i\+\i|\i)(?=.*?contextGuildId:(\i))/,
From 46be9be0a38a8ccb1e915c380e5e9e691cbd916b Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Thu, 26 Jun 2025 16:27:07 -0400
Subject: [PATCH 080/845] Fix Broken CSS On Canary
---
src/api/Notifications/styles.css | 4 ++--
src/components/ErrorCard.css | 4 ++--
src/components/PluginSettings/styles.css | 6 +++---
src/components/VencordSettings/UpdaterTab.tsx | 2 +-
src/components/VencordSettings/settingsStyles.css | 6 +++---
src/equicordplugins/_misc/styles.css | 4 ++--
src/equicordplugins/channelTabs/style.css | 8 ++++----
src/equicordplugins/gifCollections/style.css | 14 +++++++-------
src/equicordplugins/githubRepos/styles.css | 15 ++++++---------
src/equicordplugins/glide/index.tsx | 2 +-
src/equicordplugins/imagePreview/styles.css | 6 +++---
src/equicordplugins/moreStickers/style.css | 10 +++++-----
src/equicordplugins/serverSearch/styles.css | 4 ++--
src/equicordplugins/soundBoardLogger/styles.css | 4 ++--
.../themeLibrary/components/ThemeTab.tsx | 6 +++---
.../themeLibrary/components/styles.css | 2 +-
src/equicordplugins/timezones/styles.css | 6 +++---
.../toastNotifications/components/styles.css | 2 +-
.../components/VoiceChannelLogEntryComponent.css | 4 ++--
src/plugins/imageZoom/index.tsx | 2 +-
src/plugins/messageLogger/deleteStyleText.css | 2 +-
.../components/UserPermissions.tsx | 4 ++--
.../permissionsViewer/components/icons.tsx | 2 +-
src/plugins/reviewDB/style.css | 4 ++--
src/plugins/roleColorEverywhere/index.tsx | 2 +-
src/plugins/sendTimestamps/styles.css | 4 ++--
src/plugins/serverInfo/styles.css | 6 +++---
.../components/Highlighter.tsx | 2 +-
src/plugins/showHiddenChannels/style.css | 12 ++++++------
src/plugins/spotifyControls/spotifyStyles.css | 6 +++---
.../visualRefreshSpotifyStyles.css | 4 ++--
src/plugins/voiceMessages/styles.css | 4 ++--
32 files changed, 80 insertions(+), 83 deletions(-)
diff --git a/src/api/Notifications/styles.css b/src/api/Notifications/styles.css
index ba8a246af..e72656e8d 100644
--- a/src/api/Notifications/styles.css
+++ b/src/api/Notifications/styles.css
@@ -3,7 +3,7 @@
all: unset;
display: flex;
flex-direction: column;
- color: var(--text-normal);
+ color: var(--text-default);
background-color: var(--background-secondary-alt);
border-radius: 6px;
overflow: hidden;
@@ -123,4 +123,4 @@
.vc-notification-log-danger-btn {
color: var(--white-500);
background-color: var(--button-danger-background);
-}
+}
\ No newline at end of file
diff --git a/src/components/ErrorCard.css b/src/components/ErrorCard.css
index 6401c59c6..0d92dfa2e 100644
--- a/src/components/ErrorCard.css
+++ b/src/components/ErrorCard.css
@@ -3,9 +3,9 @@
background-color: #e7828430;
border: 1px solid #e78284;
border-radius: 5px;
- color: var(--text-normal, white);
+ color: var(--text-default, white);
& a:hover {
text-decoration: underline;
}
-}
+}
\ No newline at end of file
diff --git a/src/components/PluginSettings/styles.css b/src/components/PluginSettings/styles.css
index 488fd212c..a49f19cee 100644
--- a/src/components/PluginSettings/styles.css
+++ b/src/components/PluginSettings/styles.css
@@ -71,9 +71,9 @@
.vc-plugins-restart-card {
padding: 1em;
- background: var(--info-warning-background);
+ background: var(--background-feedback-warningd);
border: inherit !important;
- color: var(--info-warning-text);
+ color: var(--text-feedback-warning);
}
.vc-plugins-info-icon:not(:hover, :focus) {
@@ -158,7 +158,7 @@
}
.text-normal {
- color: var(--text-normal);
+ color: var(--text-default);
font-size: 1.2rem;
}
diff --git a/src/components/VencordSettings/UpdaterTab.tsx b/src/components/VencordSettings/UpdaterTab.tsx
index f500b720f..6f72e4ce6 100644
--- a/src/components/VencordSettings/UpdaterTab.tsx
+++ b/src/components/VencordSettings/UpdaterTab.tsx
@@ -94,7 +94,7 @@ function Changes({ updates, repo, repoPending }: CommonProps & { updates: typeof
{message} - {author}
))}
diff --git a/src/components/VencordSettings/settingsStyles.css b/src/components/VencordSettings/settingsStyles.css
index 7e4cf268d..9d287d20b 100644
--- a/src/components/VencordSettings/settingsStyles.css
+++ b/src/components/VencordSettings/settingsStyles.css
@@ -32,15 +32,15 @@
}
.vc-backup-restore-card {
- background-color: var(--info-warning-background) !important;
+ background-color: var(--background-feedback-warningd) !important;
border-color: var(--info-warning-foreground) !important;
- color: var(--info-warning-text) !important;
+ color: var(--text-feedback-warning) !important;
}
.vc-settings-theme-links {
/* Needed to fix bad themes that hide certain textarea elements for whatever eldritch reason */
display: inline-block !important;
- color: var(--text-normal) !important;
+ color: var(--text-default) !important;
padding: 0.5em;
border: 1px solid var(--background-modifier-accent);
max-height: unset;
diff --git a/src/equicordplugins/_misc/styles.css b/src/equicordplugins/_misc/styles.css
index e2e6a1f52..6e292066f 100644
--- a/src/equicordplugins/_misc/styles.css
+++ b/src/equicordplugins/_misc/styles.css
@@ -1,7 +1,7 @@
.plugin-warning {
font-size: 16px !important;
- background-color: var(--info-warning-background) !important;
- color: var(--info-warning-text) !important;
+ background-color: var(--background-feedback-warning) !important;
+ color: var(--text-feedback-warning) !important;
border: 1px solid var(--info-warning-foreground) !important;
border-radius: 5px !important;
font-weight: bold;
diff --git a/src/equicordplugins/channelTabs/style.css b/src/equicordplugins/channelTabs/style.css
index b99f4c2e0..e80d4616a 100644
--- a/src/equicordplugins/channelTabs/style.css
+++ b/src/equicordplugins/channelTabs/style.css
@@ -185,7 +185,7 @@
.vc-channeltabs-button {
background-color: transparent;
- color: var(--text-normal);
+ color: var(--text-default);
}
.vc-channeltabs-new-button {
@@ -254,8 +254,8 @@
}
.vc-channeltabs-preview-tab> :is(.vc-channeltabs-emoji-container,
-.vc-channeltabs-typing-indicator,
-[data-has-mention]) {
+ .vc-channeltabs-typing-indicator,
+ [data-has-mention]) {
display: none;
}
@@ -263,4 +263,4 @@
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
-}
+}
\ No newline at end of file
diff --git a/src/equicordplugins/gifCollections/style.css b/src/equicordplugins/gifCollections/style.css
index 041911946..9abe51c9a 100644
--- a/src/equicordplugins/gifCollections/style.css
+++ b/src/equicordplugins/gifCollections/style.css
@@ -21,7 +21,7 @@
.collections-sort-section-title {
font-size: 14px;
font-weight: 500;
- color: var(--text-normal);
+ color: var(--text-default);
margin-bottom: 8px;
}
@@ -38,7 +38,7 @@
.collections-sort-label {
font-size: 14px;
font-weight: 400;
- color: var(--text-normal);
+ color: var(--text-default);
cursor: pointer;
display: flex;
align-items: center;
@@ -95,7 +95,7 @@
.collection-info-title {
font-size: 14px;
font-weight: 500;
- color: var(--text-normal);
+ color: var(--text-default);
}
.collection-info-text {
@@ -137,7 +137,7 @@
.rename-collection-text {
font-size: 14px;
font-weight: 500;
- color: var(--text-normal);
+ color: var(--text-default);
margin: 16px 0 2px;
}
@@ -172,7 +172,7 @@
border: 1px solid var(--border-color);
border-radius: 4px;
background-color: var(--background-secondary);
- color: var(--text-normal);
+ color: var(--text-default);
outline: none;
}
@@ -180,9 +180,9 @@
text-align: center;
padding: 8px;
background-color: var(--background-tertiary);
- color: var(--text-normal);
+ color: var(--text-default);
border: none;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.2s;
-}
\ No newline at end of file
+}
diff --git a/src/equicordplugins/githubRepos/styles.css b/src/equicordplugins/githubRepos/styles.css
index 8a17a754f..12bc6c4d0 100644
--- a/src/equicordplugins/githubRepos/styles.css
+++ b/src/equicordplugins/githubRepos/styles.css
@@ -23,22 +23,19 @@
justify-content: center;
margin-top: 2px;
padding-top: 12px;
- border-top: 1px solid
- var(--profile-body-divider-color, var(--background-modifier-accent));
+ border-top: 1px solid var(--profile-body-divider-color, var(--background-modifier-accent));
}
.vc-github-repos-button,
.vc-github-repos-show-more {
width: 100%;
- border: 1px solid
- var(--profile-body-divider-color, var(--background-modifier-accent)) !important;
+ border: 1px solid var(--profile-body-divider-color, var(--background-modifier-accent)) !important;
}
.vc-github-repo-card {
padding: 8px;
border-radius: var(--radius-xs);
- border: 1px solid
- var(--profile-body-divider-color, var(--background-modifier-accent));
+ border: 1px solid var(--profile-body-divider-color, var(--background-modifier-accent));
}
.vc-github-repo-header {
@@ -92,7 +89,7 @@
.vc-github-repos-table {
width: 100%;
border-collapse: collapse;
- color: var(--text-normal);
+ color: var(--text-default);
font-size: 14px;
table-layout: fixed;
}
@@ -152,7 +149,7 @@
}
.vc-github-repos-table-description {
- color: var(--text-normal);
+ color: var(--text-default);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
@@ -184,4 +181,4 @@
.vc-github-repos-table-star-icon {
color: var(--text-warning);
-}
+}
\ No newline at end of file
diff --git a/src/equicordplugins/glide/index.tsx b/src/equicordplugins/glide/index.tsx
index 919b74e69..2ad17b53e 100644
--- a/src/equicordplugins/glide/index.tsx
+++ b/src/equicordplugins/glide/index.tsx
@@ -421,7 +421,7 @@ function getCSS(fontName) {
--header-primary: var(--text);
--header-secondary: var(--text);
--font-display: var(--text);
- --text-normal: var(--text);
+ --text-default: var(--text);
--text-muted: var(--mutedtext);
--channels-default: var(--mutedtext);
--interactive-normal: var(--text) !important;
diff --git a/src/equicordplugins/imagePreview/styles.css b/src/equicordplugins/imagePreview/styles.css
index 4167d0a3e..78c545576 100644
--- a/src/equicordplugins/imagePreview/styles.css
+++ b/src/equicordplugins/imagePreview/styles.css
@@ -40,7 +40,7 @@
transform: translateX(-50%);
text-align: center;
background-color: var(--background-primary);
- color: var(--text-normal);
+ color: var(--text-default);
padding: 2px 5px;
border-radius: 4px;
font-size: 12px;
@@ -51,7 +51,7 @@
.image-preview .file-info span {
background-color: var(--background-primary);
- color: var(--text-normal);
+ color: var(--text-default);
padding: 2px 5px;
border-radius: 4px;
font-size: 12px;
@@ -107,4 +107,4 @@
max-height: 90vh;
object-fit: contain;
display: none;
-}
+}
\ No newline at end of file
diff --git a/src/equicordplugins/moreStickers/style.css b/src/equicordplugins/moreStickers/style.css
index 16101bf4a..dd97858cc 100644
--- a/src/equicordplugins/moreStickers/style.css
+++ b/src/equicordplugins/moreStickers/style.css
@@ -49,7 +49,7 @@
text-indent: -9999px;
align-items: center;
background-color: var(--background-primary);
- color: var(--text-normal);
+ color: var(--text-default);
display: flex;
height: 100%;
justify-content: center;
@@ -258,7 +258,7 @@
-ms-flex-align: center;
align-items: center;
background-color: var(--background-primary);
- color: var(--text-normal);
+ color: var(--text-default);
display: flex;
height: 100%;
-webkit-box-pack: center;
@@ -382,7 +382,7 @@
font-size: 16px;
line-height: 20px;
font-weight: 600;
- color: var(--text-normal);
+ color: var(--text-default);
}
.vc-more-stickers-picker-content-inspector-title-secondary {
@@ -501,5 +501,5 @@
font-family: var(--font-primary);
font-size: 8pt;
font-weight: 600;
- color: var(--text-normal);
-}
+ color: var(--text-default);
+}
\ No newline at end of file
diff --git a/src/equicordplugins/serverSearch/styles.css b/src/equicordplugins/serverSearch/styles.css
index db2e745ac..545036734 100644
--- a/src/equicordplugins/serverSearch/styles.css
+++ b/src/equicordplugins/serverSearch/styles.css
@@ -19,7 +19,7 @@
}
#vc-searchbutton-icon {
- color: var(--text-normal);
+ color: var(--text-default);
}
#vc-searchbutton:hover {
@@ -30,4 +30,4 @@
#vc-searchbutton:hover #vc-searchbutton-icon {
color: var(--white-500);
-}
+}
\ No newline at end of file
diff --git a/src/equicordplugins/soundBoardLogger/styles.css b/src/equicordplugins/soundBoardLogger/styles.css
index 064f19ec6..43fad8452 100644
--- a/src/equicordplugins/soundBoardLogger/styles.css
+++ b/src/equicordplugins/soundBoardLogger/styles.css
@@ -111,7 +111,7 @@
/* input style from https://github.com/Vendicated/Vencord/blob/ea11f2244fde469ce308f8a4e7224430be62f8f1/src/plugins/sendTimestamps/styles.css#L1-L13 */
.vc-soundlog-clone-input {
background-color: var(--input-background);
- color: var(--text-normal);
+ color: var(--text-default);
width: 100%;
padding: 8px 8px 8px 12px;
outline: none;
@@ -122,4 +122,4 @@
font-size: 100%;
box-sizing: border-box;
height: 40px;
-}
\ No newline at end of file
+}
diff --git a/src/equicordplugins/themeLibrary/components/ThemeTab.tsx b/src/equicordplugins/themeLibrary/components/ThemeTab.tsx
index 9fb7fd0d9..b8244314e 100644
--- a/src/equicordplugins/themeLibrary/components/ThemeTab.tsx
+++ b/src/equicordplugins/themeLibrary/components/ThemeTab.tsx
@@ -150,7 +150,7 @@ function ThemeTab() {
alignItems: "center",
height: "70vh",
fontSize: "1.5em",
- color: "var(--text-normal)"
+ color: "var(--text-default)"
}}>
Getting the latest themes...
No theme found.