Plugin
HideMedia
Hide attachments and embeds for individual messages via hover button
1
import "./styles.css";2
3
import { get, set } from "@api/DataStore";4
import { updateMessage } from "@api/MessageUpdater";5
import { migratePluginSettings } from "@api/Settings";6
import { ImageInvisible, ImageVisible } from "@components/Icons";7
import { Devs } from "@utils/constants";8
import { classes } from "@utils/misc";9
import definePlugin from "@utils/types";10
import { Message } from "@vencord/discord-types";11
import { ChannelStore } from "@webpack/common";12
13
const KEY = "HideAttachments_HiddenIds";14
15
let hiddenMessages = new Set<string>();16
17
async function getHiddenMessages() {18
hiddenMessages = await get(KEY) ?? new Set();19
return hiddenMessages;20
}21
22
const saveHiddenMessages = (ids: Set<string>) => set(KEY, ids);23
24
migratePluginSettings("HideMedia", "HideAttachments");25
26
const hasMedia = (msg: Message) => msg.attachments.length > 0 || msg.embeds.length > 0 || msg.stickerItems.length > 0 || msg.components.length > 0;27
28
async function toggleHide(channelId: string, messageId: string) {29
const ids = await getHiddenMessages();30
if (!ids.delete(messageId))31
ids.add(messageId);32
33
await saveHiddenMessages(ids);34
updateMessage(channelId, messageId);35
}36
37
export default definePlugin({38
name: "HideMedia",39
description: "Hide attachments and embeds for individual messages via hover button",40
tags: ["Chat", "Appearance"],41
authors: [Devs.Ven],42
dependencies: ["MessageUpdaterAPI"],43
44
patches: [{45
find: "this.renderAttachments(",46
replacement: {47
match: /(?<=\i=)this\.render(?:Attachments|Embeds|StickersAccessories|ComponentAccessories)\((\i)\)/g,48
replace: "$self.shouldHide($1?.id)?null:$&"49
}50
}],51
52
messagePopoverButton: {53
icon: ImageInvisible,54
render(msg) {55
if (!hasMedia(msg) && !msg.messageSnapshots.some(s => hasMedia(s.message))) return null;56
57
const isHidden = hiddenMessages.has(msg.id);58
59
return {60
label: isHidden ? "Show Media" : "Hide Media",61
icon: isHidden ? ImageVisible : ImageInvisible,62
message: msg,63
channel: ChannelStore.getChannel(msg.channel_id),64
onClick: () => toggleHide(msg.channel_id, msg.id)65
};66
},67
},68
69
renderMessageAccessory({ message }) {70
if (!this.shouldHide(message.id)) return null;71
72
return (73
<span className={classes("vc-hideAttachments-accessory", !message.content && "vc-hideAttachments-no-content")}>74
Media Hidden75
</span>76
);77
},78
79
async start() {80
await getHiddenMessages();81
},82
83
stop() {84
hiddenMessages.clear();85
},86
87
shouldHide(messageId: string) {88
return hiddenMessages.has(messageId);89
},90
});91