diff --git a/src/plugins/anonymiseFileNames/index.tsx b/src/plugins/anonymiseFileNames/index.tsx index 21f4e5c8..34b5a5fa 100644 --- a/src/plugins/anonymiseFileNames/index.tsx +++ b/src/plugins/anonymiseFileNames/index.tsx @@ -21,12 +21,10 @@ import { definePluginSettings } from "@api/Settings"; import ErrorBoundary from "@components/ErrorBoundary"; import { Devs } from "@utils/constants"; import definePlugin, { OptionType } from "@utils/types"; -import { findByCodeLazy, findByPropsLazy } from "@webpack"; - -type AnonUpload = Upload & { anonymise?: boolean; }; +import { findByCodeLazy } from "@webpack"; +import { useState } from "@webpack/common"; const ActionBarIcon = findByCodeLazy(".actionBarIcon)"); -const UploadDraft = findByPropsLazy("popFirstFile", "update"); const enum Methods { Random, @@ -34,6 +32,7 @@ const enum Methods { Timestamp, } +const ANONYMISE_UPLOAD_SYMBOL = Symbol("vcAnonymise"); const tarExtMatcher = /\.tar\.\w+$/; const settings = definePluginSettings({ @@ -69,41 +68,44 @@ export default definePlugin({ name: "AnonymiseFileNames", authors: [Devs.fawn], description: "Anonymise uploaded file names", + settings, + patches: [ { - find: "instantBatchUpload:", + find: 'type:"UPLOAD_START"', replacement: { - match: /uploadFiles:(\i),/, - replace: - "uploadFiles:(...args)=>(args[0].uploads.forEach(f=>f.filename=$self.anonymise(f)),$1(...args)),", + match: /await \i\.uploadFiles\((\i),/, + replace: "$1.forEach($self.anonymise),$&" }, }, { find: 'addFilesTo:"message.attachments"', replacement: { - match: /(\i.uploadFiles\((\i),)/, - replace: "$2.forEach(f=>f.filename=$self.anonymise(f)),$1" + match: /\i.uploadFiles\((\i),/, + replace: "$1.forEach($self.anonymise),$&" } }, { find: "#{intl::ATTACHMENT_UTILITIES_SPOILER}", replacement: { match: /(?<=children:\[)(?=.{10,80}tooltip:.{0,100}#{intl::ATTACHMENT_UTILITIES_SPOILER})/, - replace: "arguments[0].canEdit!==false?$self.renderIcon(arguments[0]):null," + replace: "arguments[0].canEdit!==false?$self.AnonymiseUploadButton(arguments[0]):null," }, }, ], - settings, - renderIcon: ErrorBoundary.wrap(({ upload, channelId, draftType }: { upload: AnonUpload; draftType: unknown; channelId: string; }) => { - const anonymise = upload.anonymise ?? settings.store.anonymiseByDefault; + AnonymiseUploadButton: ErrorBoundary.wrap(({ upload }: { upload: Upload; }) => { + const [anonymise, setAnonymise] = useState(upload[ANONYMISE_UPLOAD_SYMBOL] ?? settings.store.anonymiseByDefault); + + function onToggleAnonymise() { + upload[ANONYMISE_UPLOAD_SYMBOL] = !anonymise; + setAnonymise(!anonymise); + } + return ( { - upload.anonymise = !anonymise; - UploadDraft.update(channelId, upload.id, draftType, {}); // dummy update so component rerenders - }} + onClick={onToggleAnonymise} > {anonymise ? @@ -113,25 +115,31 @@ export default definePlugin({ ); }, { noop: true }), - anonymise(upload: AnonUpload) { - if ((upload.anonymise ?? settings.store.anonymiseByDefault) === false) return upload.filename; - - const file = upload.filename; - const tarMatch = tarExtMatcher.exec(file); - const extIdx = tarMatch?.index ?? file.lastIndexOf("."); - const ext = extIdx !== -1 ? file.slice(extIdx) : ""; - - switch (settings.store.method) { - case Methods.Random: - const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - return Array.from( - { length: settings.store.randomisedLength }, - () => chars[Math.floor(Math.random() * chars.length)] - ).join("") + ext; - case Methods.Consistent: - return settings.store.consistent + ext; - case Methods.Timestamp: - return Date.now() + ext; + anonymise(upload: Upload) { + if ((upload[ANONYMISE_UPLOAD_SYMBOL] ?? settings.store.anonymiseByDefault) === false) { + return; } - }, + + const originalFileName = upload.filename; + const tarMatch = tarExtMatcher.exec(originalFileName); + const extIdx = tarMatch?.index ?? originalFileName.lastIndexOf("."); + const ext = extIdx !== -1 ? originalFileName.slice(extIdx) : ""; + + const newFilename = (() => { + switch (settings.store.method) { + case Methods.Random: + const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + return Array.from( + { length: settings.store.randomisedLength }, + () => chars[Math.floor(Math.random() * chars.length)] + ).join("") + ext; + case Methods.Consistent: + return settings.store.consistent + ext; + case Methods.Timestamp: + return Date.now() + ext; + } + })(); + + upload.filename = newFilename; + } }); diff --git a/src/plugins/openInApp/index.ts b/src/plugins/openInApp/index.ts index 2585f906..e1133234 100644 --- a/src/plugins/openInApp/index.ts +++ b/src/plugins/openInApp/index.ts @@ -107,6 +107,7 @@ export default definePlugin({ ] }, + // User Profile Modal & User Profile Modal v2 ...[".__invalid_connectedAccountOpenIconContainer", ".BLUESKY||"].map(find => ({ find, replacement: {