/* * 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 type { Guild } from "discord-types/general"; import { Devs } from "../utils/constants"; import { LazyComponent, lazyWebpack } from "../utils/misc"; import { ModalRoot, ModalSize, openModal } from "../utils/modal"; import { PluginDef } from "../utils/types"; import { filters, find } from "../webpack"; import { Menu } from "../webpack/common"; const ImageModal = LazyComponent(() => find(m => m.prototype?.render?.toString().includes("OPEN_ORIGINAL_IMAGE"))); const MaskedLink = LazyComponent(() => find(m => m.type?.toString().includes("MASKED_LINK)"))); const GuildBannerStore = lazyWebpack(filters.byProps("getGuildBannerURL")); const OPEN_URL = "Vencord.Plugins.plugins.ViewIcons.openImage("; export default new class ViewIcons implements PluginDef { name = "ViewIcons"; authors = [Devs.Ven]; description = "Makes Avatars/Banners in user profiles clickable, and adds Guild Context Menu Entries to View Banner/Icon."; dependencies = ["MenuItemDeobfuscatorAPI"]; openImage(url: string) { const u = new URL(url); u.searchParams.set("size", "512"); url = u.toString(); openModal(modalProps => ( } /> )); } patches = [ { find: "onAddFriend:", replacement: { // global because Discord has two components that are 99% identical with one small change ._. match: /\{src:(.{1,2}),avatarDecoration/g, replace: (_, src) => `{src:${src},onClick:()=>${OPEN_URL}${src}),avatarDecoration` } }, { find: "().popoutNoBannerPremium", replacement: { match: /style:.{0,10}\{\},(.{1,2})\)/, replace: (m, style) => `onClick:${style}.backgroundImage&&(${style}.cursor="pointer",` + `()=>${OPEN_URL}${style}.backgroundImage.replace("url(", ""))),${m}` } }, { find: '"GuildContextMenu:', replacement: [ { match: /\w=(\w)\.id/, replace: "_guild=$1,$&" }, { match: /(id:"leave-guild".{0,200}),(\(0,.{1,3}\.jsxs?\).{0,200}function)/, replace: "$1,Vencord.Plugins.plugins.ViewIcons.buildGuildContextMenuEntries(_guild),$2" } ] } ]; buildGuildContextMenuEntries(guild: Guild) { return ( {guild.banner && ( this.openImage(GuildBannerStore.getGuildBannerURL(guild))} /> )} {guild.icon && ( this.openImage(guild.getIconURL(0, true))} /> )} ); } };