From 10928bc5a76356301cf31d54e968cfe8d4185e2c Mon Sep 17 00:00:00 2001 From: Sqaaakoi Date: Sat, 26 Oct 2024 04:29:59 +1300 Subject: [PATCH] create plugger --- index.tsx | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 index.tsx diff --git a/index.tsx b/index.tsx new file mode 100644 index 0000000..f5f4247 --- /dev/null +++ b/index.tsx @@ -0,0 +1,99 @@ +import { definePluginSettings } from "@api/Settings"; +import { makeRange } from "@components/PluginSettings/components"; +import { openPluginModal } from "@components/PluginSettings/PluginModal"; +import { Devs } from "@utils/constants"; +import definePlugin, { OptionType } from "@utils/types"; +import { mapMangledModuleLazy } from "@webpack"; +import { FluxDispatcher } from "@webpack/common"; +import { FluxEvents } from "@webpack/types"; + +const Effects: { Dispatcher: { dispatch(eventName: string, args: any): void; }; } = mapMangledModuleLazy("this.emitter.setMaxListeners", { + Dispatcher: e => "_savedDispatches" in e +}); + +const shake = async (duration: number, intensity: number) => !emergencyStopValue && Effects.Dispatcher.dispatch("SHAKE_APP", { duration, intensity: intensity * settings.store.multiplier }); + +function shakeOthers(event: any) { + if (event.type in flux) return; + if (settings.store.everything) shake(100, 1); +} + +let emergencyStopValue = false; + +function emergencyStop(e: KeyboardEvent) { + if (e.key === "F9" && e.ctrlKey && e.altKey && e.shiftKey) { + emergencyStopValue = !emergencyStopValue; + if (emergencyStopValue) openPluginModal(Vencord.Plugins.plugins.Earthquake, () => { }); + } +} + +const flux: Record void> = { + MESSAGE_CREATE: () => shake(500, 5), + MESSAGE_UPDATE: () => shake(250, 3), + TYPING_START: () => shake(150, 5), + TYPING_STOP: () => shake(150, 3), + MESSAGE_REACTION_ADD: () => shake(750, 3), + MESSAGE_REACTION_ADD_MANY: () => shake(750, 4), + MESSAGE_REACTION_REMOVE: () => shake(750, 4), + MESSAGE_REACTION_REMOVE_EMOJI: () => shake(1000, 4), + MESSAGE_REACTION_REMOVE_ALL: () => shake(1000, 4), + PRESENCE_UPDATES: () => shake(150, 2), + GUILD_MEMBER_LIST_UPDATE: () => shake(150, 2), + TRACK: () => shake(150, 2), + SPEAKING: () => shake(350, 4), + DRAFT_CHANGE: () => shake(200, 2), +}; + +const settings = definePluginSettings({ + everything: { + type: OptionType.BOOLEAN, + description: "Shake on every flux event", + default: false + }, + multiplier: { + type: OptionType.SLIDER, + description: "Intensity multiplier", + markers: (() => { let range = makeRange(0, 10, 0.5); range[0] = 0.1; return range; })(), + default: 1, + stickToMarkers: false, + }, + whenUnfocused: { + type: OptionType.BOOLEAN, + description: "Shake when the app is unfocused", + default: true, + restartNeeded: true, + }, +}); + +export default definePlugin({ + name: "Earthquake", + description: "Shake your Discord client", + authors: [Devs.Sqaaakoi], + + settings, + flux, + + start() { + document.addEventListener("keydown", emergencyStop); + (FluxDispatcher as any).addInterceptor(shakeOthers); + }, + + stop() { + document.removeEventListener("keydown", emergencyStop); + let i; + while ((i = ((FluxDispatcher as any)._interceptors).indexOf(shakeOthers)) > -1) { + ((FluxDispatcher as any)._interceptors).splice(i, 1); + } + }, + + patches: [ + { + find: "Shakeable is shaken when not mounted", + predicate: () => settings.store.whenUnfocused, + replacement: { + match: /\i\.\i\.isFocused\(\)/, + replace: "true" + } + } + ] +});