From 5ccb126decfdebe16db32a2df22d9e75e4949654 Mon Sep 17 00:00:00 2001 From: 1024x2 Date: Fri, 16 Feb 2024 22:04:43 +0000 Subject: Initial commit --- 0001-Remove-donator-badges.patch | 150 +++++++++++++++++++++ 0002-Small-rebrand.patch | 150 +++++++++++++++++++++ 0003-Experiments-Re-add-staging-banner.patch | 45 +++++++ ...-t-prompt-for-updates-when-on-a-local-bra.patch | 27 ++++ ...SP-bypass-on-stock-discord-desktop-client.patch | 29 ++++ README.md | 5 + 6 files changed, 406 insertions(+) create mode 100644 0001-Remove-donator-badges.patch create mode 100644 0002-Small-rebrand.patch create mode 100644 0003-Experiments-Re-add-staging-banner.patch create mode 100644 0004-Updater-don-t-prompt-for-updates-when-on-a-local-bra.patch create mode 100644 0005-Enable-CSP-bypass-on-stock-discord-desktop-client.patch create mode 100644 README.md diff --git a/0001-Remove-donator-badges.patch b/0001-Remove-donator-badges.patch new file mode 100644 index 0000000..1af5b96 --- /dev/null +++ b/0001-Remove-donator-badges.patch @@ -0,0 +1,150 @@ +From 191cf11a7bb70b3a213be50e85bbb0ccdbfbcf67 Mon Sep 17 00:00:00 2001 +From: 1024x2 <2pow11@gmail.com> +Date: Mon, 9 Oct 2023 17:46:41 +0100 +Subject: [PATCH 1/5] Remove donator badges + +It makes a request to an API hosted by the Vencord developer, without +any option to turn it off. This raises privacy concerns. +It's easiest to just get rid of the feature entirely. +--- + src/api/Badges.ts | 3 +- + src/plugins/_api/badges.tsx | 97 +------------------------------------ + 2 files changed, 2 insertions(+), 98 deletions(-) + +diff --git a/src/api/Badges.ts b/src/api/Badges.ts +index b50016c..3529693 100644 +--- a/src/api/Badges.ts ++++ b/src/api/Badges.ts +@@ -79,8 +79,7 @@ export function _getBadges(args: BadgeUserArgs) { + : badges.push({ ...badge, ...args }); + } + } +- const donorBadges = (Plugins.BadgeAPI as unknown as typeof import("../plugins/_api/badges").default).getDonorBadges(args.user.id); +- if (donorBadges) badges.unshift(...donorBadges); ++ void Plugins.BadgeAPI; // If I don't reference this everything breaks??? + + return badges; + } +diff --git a/src/plugins/_api/badges.tsx b/src/plugins/_api/badges.tsx +index 16b244a..4328925 100644 +--- a/src/plugins/_api/badges.tsx ++++ b/src/plugins/_api/badges.tsx +@@ -44,19 +44,6 @@ const ContributorBadge: ProfileBadge = { + link: "https://github.com/Vendicated/Vencord" + }; + +-let DonorBadges = {} as Record>>; +- +-async function loadBadges(noCache = false) { +- DonorBadges = {}; +- +- const init = {} as RequestInit; +- if (noCache) +- init.cache = "no-cache"; +- +- DonorBadges = await fetch("https://badges.vencord.dev/badges.json", init) +- .then(r => r.json()); +-} +- + export default definePlugin({ + name: "BadgeAPI", + description: "API to add badges to users.", +@@ -91,94 +78,12 @@ export default definePlugin({ + } + ], + +- toolboxActions: { +- async "Refetch Badges"() { +- await loadBadges(true); +- Toasts.show({ +- id: Toasts.genId(), +- message: "Successfully refetched badges!", +- type: Toasts.Type.SUCCESS +- }); +- } +- }, +- + async start() { + Vencord.Api.Badges.addBadge(ContributorBadge); +- await loadBadges(); + }, + + renderBadgeComponent: ErrorBoundary.wrap((badge: ProfileBadge & BadgeUserArgs) => { + const Component = badge.component!; + return ; +- }, { noop: true }), +- +- +- getDonorBadges(userId: string) { +- return DonorBadges[userId]?.map(badge => ({ +- image: badge.badge, +- description: badge.tooltip, +- position: BadgePosition.START, +- props: { +- style: { +- borderRadius: "50%", +- transform: "scale(0.9)" // The image is a bit too big compared to default badges +- } +- }, +- onClick() { +- const modalKey = openModal(props => ( +- { +- closeModal(modalKey); +- VencordNative.native.openExternal("https://github.com/sponsors/Vendicated"); +- }}> +- +- +- +- +- +- Vencord Donor +- +- +- +- +- +- +- +- +-
+- +- This Badge is a special perk for Vencord Donors +- +- +- Please consider supporting the development of Vencord by becoming a donor. It would mean a lot!! +- +-
+-
+- +- +- +- +- +-
+-
+- )); +- }, +- })); +- } ++ }, { noop: true }) + }); +-- +2.43.1 + diff --git a/0002-Small-rebrand.patch b/0002-Small-rebrand.patch new file mode 100644 index 0000000..1052397 --- /dev/null +++ b/0002-Small-rebrand.patch @@ -0,0 +1,150 @@ +From 50d952d0728b6ec9a096acb36e6096f862e185b4 Mon Sep 17 00:00:00 2001 +From: 1024x2 <2pow11@gmail.com> +Date: Tue, 13 Feb 2024 21:26:56 +0000 +Subject: [PATCH 2/5] Small rebrand + +There's a litevex in here! It's got my gun!!! AHHHHHHHH +--- + README.md | 46 ++++++++----------- + src/components/VencordSettings/VencordTab.tsx | 4 +- + src/plugins/vencordToolbox/index.tsx | 10 ++-- + 3 files changed, 26 insertions(+), 34 deletions(-) + +diff --git a/README.md b/README.md +index a43c9f8..1f4f970 100644 +--- a/README.md ++++ b/README.md +@@ -1,20 +1,21 @@ +-# Vencord ++# Vexcord + + [![Codeberg Mirror](https://img.shields.io/static/v1?style=for-the-badge&label=Codeberg%20Mirror&message=codeberg.org/Vee/cord&color=2185D0&logo=data:image/png;base64,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)](https://codeberg.org/Vee/cord) + +-The cutest Discord client mod ++The porniest Discord client mod + +-| ![image](https://github.com/Vendicated/Vencord/assets/45497981/706722b1-32de-4d99-bee9-93993b504334) | ++| ![image](https://media.tenor.com/BxmwtK6R-10AAAAC/litevex-litevx.gif) | + |:--:| +-| A screenshot of vencord showcasing the [vencord-theme](https://github.com/synqat/vencord-theme) | ++| A screenshot of vexcord showcasing the [pornliker](https://litevex.staropa.net/) | + + ## Features + +-- Super easy to install (Download Installer, open, click install button, done) ++- ![No anime](https://i.kym-cdn.com/photos/images/original/001/408/771/8e3.jpg) ++- Despite the questionable branding, no porn. + - 100+ plugins built in: [See a list](https://vencord.dev/plugins) + - Some highlights: SpotifyControls, MessageLogger, Experiments, GameActivityToggle, Translate, NoTrack, QuickReply, Free Emotes/Stickers, PermissionsViewer, CustomCommands, ShowHiddenChannels, PronounDB + - Fairly lightweight despite the many inbuilt plugins +-- Excellent Browser Support: Run Vencord in your Browser via extension or UserScript ++- Excellent Browser Support: Run Vexcord in your Browser via extension or UserScript + - Works on any Discord branch: Stable, Canary or PTB all work (though for the best experience I recommend stable!) + - Custom CSS and Themes: Inbuilt css editor with support to import any css files (including BetterDiscord themes) + - Privacy friendly, blocks Discord analytics & crash reporting out of the box and has no telemetry +@@ -22,46 +23,37 @@ The cutest Discord client mod + - Settings sync: Keep your plugins and their settings synchronised between devices / apps (optional) + + +-## Installing / Uninstalling ++## Installing + +-Visit https://vencord.dev/download ++Don't ++ ++## Uninstalling ++ ++Why did you install this + + ## Join our Support/Community Server + +-https://discord.gg/D9uwnFnqmd ++https://discord.gg/QKv6vwGBpk + + ## Sponsors + +-| **Thanks a lot to all Vencord [sponsors](https://github.com/sponsors/Vendicated)!!** | +-|:--:| +-| [![](https://meow.vendicated.dev/sponsors.png)](https://github.com/sponsors/Vendicated) | +-| *generated using [github-sponsor-graph](https://github.com/Vendicated/github-sponsor-graph)* | +- ++WHY WOULD YOU PAY MONEY FOR THIS?? + + ## Star History + +- +- +- +- +- Star History Chart +- +- ++![Star History Chart](https://media.tenor.com/t4_mbIafxxIAAAAC/litevex-litevx.gif) + + ## Disclaimer + + Discord is trademark of Discord Inc. and solely mentioned for the sake of descriptivity. + Mention of it does not imply any affiliation with or endorsement by Discord Inc. ++This is a fork of Vencord, which calls itself the "cutest" client mod. + +
+-Using Vencord violates Discord's terms of service ++Using Vexcord violates Discord's terms of service + + Client modifications are against Discord’s Terms of Service. + +-However, Discord is pretty indifferent about them and there are no known cases of users getting banned for using client mods! So you should generally be fine as long as you don’t use any plugins that implement abusive behaviour. But no worries, all inbuilt plugins are safe to use! +- +-Regardless, if your account is very important to you and it getting disabled would be a disaster for you, you should probably not use any client mods (not exclusive to Vencord), just to be safe +- +-Additionally, make sure not to post screenshots with Vencord in a server where you might get banned for it ++However, I do not care. + +
+diff --git a/src/components/VencordSettings/VencordTab.tsx b/src/components/VencordSettings/VencordTab.tsx +index ab910ea..8bf18f2 100644 +--- a/src/components/VencordSettings/VencordTab.tsx ++++ b/src/components/VencordSettings/VencordTab.tsx +@@ -31,8 +31,8 @@ import { SettingsTab, wrapTab } from "./shared"; + + const cl = classNameFactory("vc-settings-"); + +-const DEFAULT_DONATE_IMAGE = "https://cdn.discordapp.com/emojis/1026533090627174460.png"; +-const SHIGGY_DONATE_IMAGE = "https://media.discordapp.net/stickers/1039992459209490513.png"; ++const DEFAULT_DONATE_IMAGE = "https://i.kym-cdn.com/photos/images/original/001/442/330/d6a.jpg"; ++const SHIGGY_DONATE_IMAGE = "https://media.tenor.com/BxmwtK6R-10AAAAC/litevex-litevx.gif"; + + type KeysOfType = { + [K in keyof Object]: Object[K] extends Type ? K : never; +diff --git a/src/plugins/vencordToolbox/index.tsx b/src/plugins/vencordToolbox/index.tsx +index 0a805a0..a8e2d87 100644 +--- a/src/plugins/vencordToolbox/index.tsx ++++ b/src/plugins/vencordToolbox/index.tsx +@@ -85,10 +85,10 @@ function VencordPopout(onClose: () => void) { + ); + } + +-function VencordPopoutIcon(isShown: boolean) { ++function VexcordPopoutIcon() { + return ( +- +- ++ ++ + + ); + } +@@ -109,8 +109,8 @@ function VencordPopoutButton() { + setShow(v => !v)} +- tooltip={isShown ? null : "Vencord Toolbox"} +- icon={() => VencordPopoutIcon(isShown)} ++ tooltip={isShown ? null : "Vexcord Toolbox"} ++ icon={VexcordPopoutIcon} + selected={isShown} + /> + )} +-- +2.43.1 + diff --git a/0003-Experiments-Re-add-staging-banner.patch b/0003-Experiments-Re-add-staging-banner.patch new file mode 100644 index 0000000..4beacd8 --- /dev/null +++ b/0003-Experiments-Re-add-staging-banner.patch @@ -0,0 +1,45 @@ +From e652044d200bd28b1a6fb214f2a8f33797471238 Mon Sep 17 00:00:00 2001 +From: 1024x2 <2pow11@gmail.com> +Date: Thu, 26 Oct 2023 00:48:25 +0100 +Subject: [PATCH 3/5] Experiments: Re-add staging banner + +(it's funny) +--- + src/plugins/experiments/index.tsx | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +diff --git a/src/plugins/experiments/index.tsx b/src/plugins/experiments/index.tsx +index f8ea4b0..dc4f78f 100644 +--- a/src/plugins/experiments/index.tsx ++++ b/src/plugins/experiments/index.tsx +@@ -33,6 +33,12 @@ const settings = definePluginSettings({ + type: OptionType.BOOLEAN, + default: false, + restartNeeded: true ++ }, ++ forceStagingBanner: { ++ description: "Whether to force Staging banner under user area.", ++ type: OptionType.BOOLEAN, ++ default: false, ++ restartNeeded: true + } + }); + +@@ -77,6 +83,14 @@ export default definePlugin({ + } + ] + }, ++ { ++ find: ".Messages.DEV_NOTICE_STAGING", ++ predicate: () => settings.store.forceStagingBanner, ++ replacement: { ++ match: /window\.GLOBAL_ENV\.RELEASE_CHANNEL/, ++ replace: "\"staging\"" ++ } ++ }, + { + find: 'H1,title:"Experiments"', + replacement: { +-- +2.43.1 + diff --git a/0004-Updater-don-t-prompt-for-updates-when-on-a-local-bra.patch b/0004-Updater-don-t-prompt-for-updates-when-on-a-local-bra.patch new file mode 100644 index 0000000..b90d0c7 --- /dev/null +++ b/0004-Updater-don-t-prompt-for-updates-when-on-a-local-bra.patch @@ -0,0 +1,27 @@ +From 917df10a7d166fdfb4479ee28c40cb884bfc37dc Mon Sep 17 00:00:00 2001 +From: 1024x2 <2pow11@gmail.com> +Date: Wed, 11 Oct 2023 15:55:03 +0100 +Subject: [PATCH 4/5] Updater: don't prompt for updates when on a local branch + +--- + src/main/updater/git.ts | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/src/main/updater/git.ts b/src/main/updater/git.ts +index 2ff3ba5..21f33d1 100644 +--- a/src/main/updater/git.ts ++++ b/src/main/updater/git.ts +@@ -49,9 +49,7 @@ async function getRepo() { + async function calculateGitChanges() { + await git("fetch"); + +- const branch = await git("branch", "--show-current"); +- +- const res = await git("log", `HEAD...origin/${branch.stdout.trim()}`, "--pretty=format:%an/%h/%s"); ++ const res = await git("log", "HEAD...@{u}", "--pretty=format:%an/%h/%s"); + + const commits = res.stdout.trim(); + return commits ? commits.split("\n").map(line => { +-- +2.43.1 + diff --git a/0005-Enable-CSP-bypass-on-stock-discord-desktop-client.patch b/0005-Enable-CSP-bypass-on-stock-discord-desktop-client.patch new file mode 100644 index 0000000..7be02d7 --- /dev/null +++ b/0005-Enable-CSP-bypass-on-stock-discord-desktop-client.patch @@ -0,0 +1,29 @@ +From a88292149ce6bf585d2340774ab605ac88ebb742 Mon Sep 17 00:00:00 2001 +From: 1024x2 <2pow11@gmail.com> +Date: Wed, 27 Dec 2023 15:05:44 +0000 +Subject: [PATCH 5/5] Enable CSP bypass on stock discord desktop client + +--- + src/main/index.ts | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/main/index.ts b/src/main/index.ts +index 481736a..33dbe3f 100644 +--- a/src/main/index.ts ++++ b/src/main/index.ts +@@ -23,10 +23,11 @@ import { ensureSafePath, getSettings } from "./ipcMain"; + import { IS_VANILLA, THEMES_DIR } from "./utils/constants"; + import { installExt } from "./utils/extensions"; + +-if (IS_VESKTOP || !IS_VANILLA) { ++{ + app.whenReady().then(() => { + // Source Maps! Maybe there's a better way but since the renderer is executed + // from a string I don't think any other form of sourcemaps would work ++ if (IS_VESKTOP || !IS_VANILLA) + protocol.registerFileProtocol("vencord", ({ url: unsafeUrl }, cb) => { + let url = unsafeUrl.slice("vencord://".length); + if (url.endsWith("/")) url = url.slice(0, -1); +-- +2.43.1 + diff --git a/README.md b/README.md new file mode 100644 index 0000000..3604afc --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# Vexcord +The porniest client mod. + +Soft fork of [Vencord](https://vencord.dev/), the self-proclaimed "cutest Discord client mod". +Mainly seeks to remove porno (despite the name) and tweak some small things. -- cgit v1.2.3