From 0e0674fd98a6a92a2c9e3d4ee92d9da448578bf9 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Sat, 12 Oct 2024 07:59:33 -0400 Subject: [PATCH] BannersEverywhere: Fix Animate on Everything --- .../bannersEverywhere/index.tsx | 52 +++++++++++++++++-- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/src/equicordplugins/bannersEverywhere/index.tsx b/src/equicordplugins/bannersEverywhere/index.tsx index c25a2aac..d3e6b164 100644 --- a/src/equicordplugins/bannersEverywhere/index.tsx +++ b/src/equicordplugins/bannersEverywhere/index.tsx @@ -21,7 +21,7 @@ interface iUSRBG extends Plugin { const settings = definePluginSettings({ animate: { - description: "Animate Discord banners (NOT USRBG)", + description: "Animate banners", type: OptionType.BOOLEAN, default: false }, @@ -73,13 +73,59 @@ export default definePlugin({ memberListBannerHook(user: User) { let url = this.getBanner(user.id); if (!url) return; - if (!settings.store.animate) url = url.replace(".gif", ".png"); + if (!settings.store.animate) { + // Discord Banners + url = url.replace(".gif", ".png"); + // Usrbg Banners + this.gifToPng(url) + .then(pngUrl => { + const imgElement = document.getElementById(`vc-banners-everywhere-${user.id}`) as HTMLImageElement; + if (imgElement) { + imgElement.src = pngUrl; + } + }) + .catch(); + } return ( - + ); }, + async checkImageExists(url: string): Promise { + return new Promise(resolve => { + const img = new Image(); + img.onload = () => resolve(true); + img.onerror = () => resolve(false); + img.src = url; + }); + }, + + async gifToPng(url: string): Promise { + const exists = await this.checkImageExists(url); + if (!exists) return ""; + + return new Promise((resolve, reject) => { + const img = new Image(); + img.crossOrigin = "anonymous"; + img.onload = () => { + const canvas = document.createElement("canvas"); + canvas.width = img.width; + canvas.height = img.height; + const ctx = canvas.getContext("2d"); + if (ctx) { + ctx.drawImage(img, 0, 0); + const pngDataUrl = canvas.toDataURL("image/png"); + resolve(pngDataUrl); + } else { + reject(new Error("Failed to get canvas context.")); + } + }; + img.onerror = err => reject(err); + img.src = url; + }); + }, + getBanner(userId: string): string | undefined { if (Vencord.Plugins.isPluginEnabled("USRBG") && (Vencord.Plugins.plugins.USRBG as iUSRBG).userHasBackground(userId)) { let banner = (Vencord.Plugins.plugins.USRBG as iUSRBG).getImageUrl(userId);