From 4760af7f0ee275caa1eee440f4945032057d2b56 Mon Sep 17 00:00:00 2001 From: 12944qwerty Date: Fri, 2 Dec 2022 09:38:52 -0600 Subject: add ViewRaw plugin & MiniPopover API (#275) Co-authored-by: Vendicated --- src/plugins/viewRaw.tsx | 147 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 src/plugins/viewRaw.tsx (limited to 'src/plugins/viewRaw.tsx') diff --git a/src/plugins/viewRaw.tsx b/src/plugins/viewRaw.tsx new file mode 100644 index 0000000..c49180b --- /dev/null +++ b/src/plugins/viewRaw.tsx @@ -0,0 +1,147 @@ +/* + * 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 { addButton, removeButton } from "@api/MessagePopover"; +import ErrorBoundary from "@components/ErrorBoundary"; +import { Flex } from "@components/Flex"; +import { Devs } from "@utils/constants"; +import { copyWithToast } from "@utils/misc"; +import { closeModal, ModalCloseButton, ModalContent, ModalHeader, ModalRoot, ModalSize, openModal } from "@utils/modal"; +import definePlugin from "@utils/types"; +import { Button, ChannelStore, Forms, Margins, Parser } from "@webpack/common"; +import { Message } from "discord-types/general"; + + +const CopyIcon = () => { + return ; +}; + +function sortObject(obj: T): T { + return Object.fromEntries(Object.entries(obj).sort(([k1], [k2]) => k1.localeCompare(k2))) as T; +} + +function cleanMessage(msg: Message) { + const clone = sortObject(JSON.parse(JSON.stringify(msg))); + for (const key in clone.author) { + switch (key) { + case "id": + case "username": + case "usernameNormalized": + case "discriminator": + case "avatar": + case "bot": + case "system": + case "publicFlags": + break; + default: + // phone number, email, etc + delete clone.author[key]; + } + } + + // message logger added properties + const cloneAny = clone as any; + delete cloneAny.editHistory; + delete cloneAny.deleted; + cloneAny.attachments?.forEach(a => delete a.deleted); + + return clone; +} + +function CodeBlock(props: { content: string, lang: string; }) { + return ( + // make text selectable +
+ {Parser.defaultRules.codeBlock.react(props, null, {})} +
+ ); +} + +function openViewRawModal(msg: Message) { + msg = cleanMessage(msg); + const msgJson = JSON.stringify(msg, null, 4); + + const key = openModal(props => ( + + + + View Raw + closeModal(key)} /> + + + + + + + + {!!msg.content && ( + <> + Content + + + + )} + + Message Data + + + + + )); +} + +export default definePlugin({ + name: "ViewRaw", + description: "Copy and view the raw content/data of any message.", + authors: [Devs.KingFish, Devs.Ven], + dependencies: ["MessagePopoverAPI"], + + start() { + addButton("ViewRaw", msg => { + return { + label: "View Raw (Left Click) / Copy Raw (Right Click)", + icon: CopyIcon, + message: msg, + channel: ChannelStore.getChannel(msg.channel_id), + onClick: () => openViewRawModal(msg), + onContextMenu: e => { + e.preventDefault(); + e.stopPropagation(); + copyWithToast(msg.content); + } + }; + }); + }, + + stop() { + removeButton("CopyRawMessage"); + } +}); -- cgit