Plugin

RevealAllSpoilers

Reveal all spoilers in a message by Ctrl-clicking a spoiler, or in the chat with Ctrl+Shift-click

Accessibility Chat Shortcuts Utility
index.ts
Download

Source

src/plugins/revealAllSpoilers/index.ts
1/*
2 * FiveCord — a Discord client mod
3 * Copyright (c) 2025 FiveCord
4 * SPDX-License-Identifier: GPL-3.0-or-later
5 */
6
7import { Devs, IS_MAC } from "@utils/constants";
8import definePlugin from "@utils/types";
9import { findCssClassesLazy } from "@webpack";
10
11const SpoilerClasses = findCssClassesLazy("spoilerContent", "hidden");
12const MessagesClasses = findCssClassesLazy("messagesWrapper", "navigationDescription");
13
14export default definePlugin({
15 name: "RevealAllSpoilers",
16 description: "Reveal all spoilers in a message by Ctrl-clicking a spoiler, or in the chat with Ctrl+Shift-click",
17 authors: [Devs.whqwert],
18 tags: ["Accessibility", "Chat", "Shortcuts", "Utility"],
19 patches: [
20 {
21 find: ".removeObscurity,",
22 replacement: {
23 match: /(?<=removeObscurity(?:",|=)(\i)=>{)/,
24 replace: (_, event) => `$self.reveal(${event});`
25 }
26 }
27 ],
28
29 reveal(event: MouseEvent) {
30 const { ctrlKey, metaKey, shiftKey, target } = event;
31
32 if (!(IS_MAC ? metaKey : ctrlKey)) { return; }
33
34 const { spoilerContent, hidden } = SpoilerClasses;
35 const { messagesWrapper } = MessagesClasses;
36
37 const parent = shiftKey
38 ? document.querySelector(`div.${messagesWrapper}`)
39 : (target as HTMLSpanElement).parentElement;
40
41 for (const spoiler of parent!.querySelectorAll(`span.${spoilerContent}.${hidden}`)) {
42 (spoiler as HTMLSpanElement).click();
43 }
44 }
45
46});
47