From 1c24c4d17341f006a2aed85dcc51f93d4f5f2fba Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Fri, 16 May 2025 17:23:59 -0400 Subject: [PATCH] Move CopyStickerLinks + Fix Lint --- .../copyStickerLinks/index.tsx | 135 ++++++++++++++++ src/equicordplugins/sidebarChat/index.tsx | 4 +- src/plugins/copyStickerLinks/index.tsx | 147 ------------------ src/plugins/devCompanion.dev/initWs.tsx | 2 +- src/plugins/experiments/index.tsx | 20 +-- 5 files changed, 142 insertions(+), 166 deletions(-) create mode 100644 src/equicordplugins/copyStickerLinks/index.tsx delete mode 100644 src/plugins/copyStickerLinks/index.tsx diff --git a/src/equicordplugins/copyStickerLinks/index.tsx b/src/equicordplugins/copyStickerLinks/index.tsx new file mode 100644 index 00000000..d4d95841 --- /dev/null +++ b/src/equicordplugins/copyStickerLinks/index.tsx @@ -0,0 +1,135 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2025 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { findGroupChildrenByChildId, NavContextMenuPatchCallback } from "@api/ContextMenu"; +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 { Promisable } from "type-fest"; + +const StickersStore = findStoreLazy("StickersStore"); + +interface Sticker { + t: "Sticker"; + format_type: number; + id: string; + type: number; +} + +const StickerExt = ["png", "png", "json", "gif"] as const; + +function getUrl(data: Sticker) { + if (data.format_type === 4) + return `https:${window.GLOBAL_ENV.MEDIA_PROXY_ENDPOINT}/stickers/${data.id}.gif?size=4096&lossless=true`; + + return `https://${window.GLOBAL_ENV.CDN_HOST}/stickers/${data.id}.${StickerExt[data.format_type]}?size=4096&lossless=true`; +} + +function buildMenuItem(Sticker, fetchData: () => Promisable>) { + return ( + <> + + + { + const res = await fetchData(); + const data = { t: Sticker, ...res } as Sticker; + const url = getUrl(data[0]); + copyWithToast(url, "Link copied!"); + } + } + /> + + { + const res = await fetchData(); + const data = { t: Sticker, ...res } as Sticker; + const url = getUrl(data[0]); + VencordNative.native.openExternal(url); + } + } + /> + + ); +} + +function buildMenuExpression(Sticker, fetchData: () => Promisable>) { + return ( + <> + + { + const res = await fetchData(); + const data = { t: Sticker, ...res } as Sticker; + const url = getUrl(data); + copyWithToast(url, "Link copied!"); + } + } + /> + { + const res = await fetchData(); + const data = { t: Sticker, ...res } as Sticker; + const url = getUrl(data); + VencordNative.native.openExternal(url); + } + } + /> + + ); +} + +const messageContextMenuPatch: NavContextMenuPatchCallback = (children, props) => { + const { favoriteableId, favoriteableType } = props ?? {}; + if (!favoriteableId) return; + const menuItem = (() => { + const sticker = props.message.stickerItems.find(s => s.id === favoriteableId); + if (sticker?.format_type === 3) return; + switch (favoriteableType) { + case "sticker": + return buildMenuItem("Sticker", () => props.message.stickerItems); + } + })(); + + if (menuItem) + findGroupChildrenByChildId("devmode-copy-id", children, true)?.push(menuItem); +}; + +const expressionPickerPatch: NavContextMenuPatchCallback = (children, props: { target: HTMLElement; }) => { + const { id } = props?.target?.dataset ?? {}; + if (!id) return; + + if (!props.target.className?.includes("lottieCanvas")) { + const stickerCache = StickersStore.getStickerById(id); + if (stickerCache) { + children.push(buildMenuExpression("Sticker", () => stickerCache)); + } + } +}; + +export default definePlugin({ + name: "CopyStickerLinks", + description: "Adds the ability to copy and open sticker links to your browser", + authors: [Devs.Byeoon], + contextMenus: { + "message": messageContextMenuPatch, + "expression-picker": expressionPickerPatch + } +}); diff --git a/src/equicordplugins/sidebarChat/index.tsx b/src/equicordplugins/sidebarChat/index.tsx index 9bf808fc..bc5f8aec 100644 --- a/src/equicordplugins/sidebarChat/index.tsx +++ b/src/equicordplugins/sidebarChat/index.tsx @@ -55,7 +55,7 @@ interface ContextMenuProps { } const ArrowsLeftRightIcon = findComponentByCodeLazy("18.58V3a1"); -const XSmallIcon = findComponentByCodeLazy("12l4.94-4.94a1.5") +const XSmallIcon = findComponentByCodeLazy("12l4.94-4.94a1.5"); function MakeContextCallback(name: "user" | "channel"): NavContextMenuPatchCallback { return (children, { user, channel, guildId }: ContextMenuProps) => { @@ -149,7 +149,7 @@ export default definePlugin({ }} /> ()} + icon={() => ()} tooltip="Close Sidebar Chat" onClick={() => { FluxDispatcher.dispatch({ diff --git a/src/plugins/copyStickerLinks/index.tsx b/src/plugins/copyStickerLinks/index.tsx deleted file mode 100644 index f98a3c96..00000000 --- a/src/plugins/copyStickerLinks/index.tsx +++ /dev/null @@ -1,147 +0,0 @@ -/* -* 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 { findGroupChildrenByChildId, NavContextMenuPatchCallback } from "@api/ContextMenu"; -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 { Promisable } from "type-fest"; - -const StickersStore = findStoreLazy("StickersStore"); - -interface Sticker { - t: "Sticker"; - format_type: number; - id: string; - type: number; -} - -const StickerExt = [, "png", "png", "json", "gif"] as const; - -function getUrl(data: Sticker) { - if (data.format_type === 4) - return `https:${window.GLOBAL_ENV.MEDIA_PROXY_ENDPOINT}/stickers/${data.id}.gif?size=4096&lossless=true`; - - return `https://${window.GLOBAL_ENV.CDN_HOST}/stickers/${data.id}.${StickerExt[data.format_type]}?size=4096&lossless=true`; -} - -function buildMenuItem(Sticker, fetchData: () => Promisable>) { - return ( - <> - - - { - const res = await fetchData(); - const data = { t: Sticker, ...res } as Sticker; - const url = getUrl(data[0]); - copyWithToast(url, "Link copied!"); - } - } - /> - - { - const res = await fetchData(); - const data = { t: Sticker, ...res } as Sticker; - const url = getUrl(data[0]); - VencordNative.native.openExternal(url); - } - } - /> - - ); -} - -function buildMenuExpression(Sticker, fetchData: () => Promisable>) { - return ( - <> - - { - const res = await fetchData(); - const data = { t: Sticker, ...res } as Sticker; - const url = getUrl(data); - copyWithToast(url, "Link copied!"); - } - } - /> - { - const res = await fetchData(); - const data = { t: Sticker, ...res } as Sticker; - const url = getUrl(data); - VencordNative.native.openExternal(url); - } - } - /> - - ); -} - -const messageContextMenuPatch: NavContextMenuPatchCallback = (children, props) => { - const { favoriteableId, favoriteableType } = props ?? {}; - if (!favoriteableId) return; - const menuItem = (() => { - const sticker = props.message.stickerItems.find(s => s.id === favoriteableId); - if (sticker?.format_type === 3) return; - switch (favoriteableType) { - case "sticker": - return buildMenuItem("Sticker", () => props.message.stickerItems); - } - })(); - - if (menuItem) - findGroupChildrenByChildId("devmode-copy-id", children, true)?.push(menuItem); -}; - -const expressionPickerPatch: NavContextMenuPatchCallback = (children, props: { target: HTMLElement; }) => { - const { id } = props?.target?.dataset ?? {}; - if (!id) return; - - if (!props.target.className?.includes("lottieCanvas")) { - const stickerCache = StickersStore.getStickerById(id); - if (stickerCache) { - children.push(buildMenuExpression("Sticker", () => stickerCache)); - } - } -}; - -export default definePlugin({ - name: "CopyStickerLinks", - description: "Adds the ability to copy and open sticker links to your browser", - authors: [Devs.Byeoon], - contextMenus: { - "message": messageContextMenuPatch, - "expression-picker": expressionPickerPatch - } -}); diff --git a/src/plugins/devCompanion.dev/initWs.tsx b/src/plugins/devCompanion.dev/initWs.tsx index c264338e..93b89b68 100644 --- a/src/plugins/devCompanion.dev/initWs.tsx +++ b/src/plugins/devCompanion.dev/initWs.tsx @@ -126,7 +126,7 @@ export function initWs(isManual = false) { function reply(error?: string) { const toSend = { nonce: d.nonce, ok: !error } as Record; if (error) toSend.error = error; - logger.debug(`Replying with:`, toSend); + logger.debug("Replying with:", toSend); ws.send(JSON.stringify(toSend)); } function replyData(data: OutgoingMessage) { diff --git a/src/plugins/experiments/index.tsx b/src/plugins/experiments/index.tsx index 62110bf9..c7acde3c 100644 --- a/src/plugins/experiments/index.tsx +++ b/src/plugins/experiments/index.tsx @@ -1,20 +1,8 @@ /* -* 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 . -*/ + * Vencord, a Discord client mod + * Copyright (c) 2025 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ import { definePluginSettings } from "@api/Settings"; import { disableStyle, enableStyle } from "@api/Styles";