From e2e1cf2bfdfc83f6a2f33d7f77f6fabecb142e67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=90=E1=BB=97=20V=C4=83n=20Ho=C3=A0i=20Tu=C3=A2n?= Date: Mon, 17 Apr 2023 15:18:18 -0700 Subject: [PATCH] feat(plugin): USRBG (#844) Co-authored-by: amsyarasyiq <82711525+amsyarasyiq@users.noreply.github.com> Co-authored-by: Vendicated --- src/plugins/usrbg/index.css | 31 +++++++++++++++ src/plugins/usrbg/index.tsx | 75 +++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 src/plugins/usrbg/index.css create mode 100644 src/plugins/usrbg/index.tsx diff --git a/src/plugins/usrbg/index.css b/src/plugins/usrbg/index.css new file mode 100644 index 000000000..6d1bd9bd7 --- /dev/null +++ b/src/plugins/usrbg/index.css @@ -0,0 +1,31 @@ +:is([class*="userProfile"], [class*="userPopout"]) [class*="bannerPremium"] { + background: center / cover no-repeat; + position: relative; + z-index: -1; +} + +[class*="userPopout"] [class*="NonPremium"] [class*="bannerPremium"] { + top: -30px; +} + +[class*="NonPremium"]:has([class*="bannerPremium"]) [class*="bannerSVGWrapper"] { + min-height: 120px !important; +} + +[class*="NonPremium"]:has([class*="bannerPremium"]) [class*="bannerSVGWrapper"] foreignObject { + height: 360px; +} + +[class*="userPopout"] [class*="NonPremium"]:has([class*="bannerPremium"]) [class*="bannerSVGWrapper"] rect { + height: 120px; + y: -30; +} + +[class*="userPopout"] [class*="NonPremium"]:has([class*="bannerPremium"]) [class*="bannerSVGWrapper"] circle { + cy: 86; +} + +[class*="NonPremium"]:has([class*="bannerPremium"]) [class*="avatarPositionNormal"], +[class*="PremiumWithoutBanner"]:has([class*="bannerPremium"]) [class*="avatarPositionPremiumNoBanner"] { + top: 76px; +} diff --git a/src/plugins/usrbg/index.tsx b/src/plugins/usrbg/index.tsx new file mode 100644 index 000000000..e14ba595b --- /dev/null +++ b/src/plugins/usrbg/index.tsx @@ -0,0 +1,75 @@ +/* + * Vencord, a modification for Discord's desktop app + * Copyright (c) 2023 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 { enableStyle } from "@api/Styles"; +import { Link } from "@components/Link"; +import { Devs } from "@utils/constants"; +import definePlugin, { OptionType } from "@utils/types"; + +import style from "./index.css?managed"; + +const BASE_URL = "https://raw.githubusercontent.com/AutumnVN/usrbg/main/usrbg.json"; + +let data = {} as Record; + +const settings = definePluginSettings({ + nitroFirst: { + description: "Banner to use if both Nitro and USRBG banners are present", + type: OptionType.SELECT, + options: [ + { label: "Nitro banner", value: true, default: true }, + { label: "USRBG banner", value: false }, + ] + } +}); + +export default definePlugin({ + name: "USRBG", + description: "USRBG is a community maintained database of Discord banners, allowing anyone to get a banner without requiring Nitro", + authors: [Devs.AutumnVN, Devs.pylix], + settings, + patches: [ + { + find: ".bannerSrc,", + replacement: { + match: /(\i)\.bannerSrc,/, + replace: "$self.useBannerHook($1)," + } + } + ], + + settingsAboutComponent: () => { + return ( + Get your own banner + ); + }, + + useBannerHook({ displayProfile, user }: any) { + if (displayProfile?.banner && settings.store.nitroFirst) return; + if (data[user.id]) return data[user.id]; + }, + + async start() { + enableStyle(style); + + const res = await fetch(BASE_URL); + if (res.ok) + data = await res.json(); + } +});