diff options
author | Vendicated <vendicated@riseup.net> | 2022-10-20 23:06:28 +0200 |
---|---|---|
committer | Vendicated <vendicated@riseup.net> | 2022-10-20 23:06:28 +0200 |
commit | a15d5de4934624911da9462c50b21dc4a9a7c53d (patch) | |
tree | cd81f71f466a3d8b4c9e9efa0bff3b95509c965a | |
parent | 05051399b6cc7c6821b3df52da82ec9e57e29c22 (diff) | |
download | Vencord-a15d5de4934624911da9462c50b21dc4a9a7c53d.tar.gz Vencord-a15d5de4934624911da9462c50b21dc4a9a7c53d.tar.bz2 Vencord-a15d5de4934624911da9462c50b21dc4a9a7c53d.zip |
New plugin: vcDoubleClick
-rw-r--r-- | src/plugins/vcDoubleClick.ts | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/plugins/vcDoubleClick.ts b/src/plugins/vcDoubleClick.ts new file mode 100644 index 0000000..5ace502 --- /dev/null +++ b/src/plugins/vcDoubleClick.ts @@ -0,0 +1,52 @@ +import definePlugin from "../utils/types"; +import { Devs } from "../utils/constants"; + +const timers = {} as Record<string, { + timeout?: NodeJS.Timeout; + i: number; +}>; + +export default definePlugin({ + name: "vcDoubleClick", + description: "Join VCs via DoubleClick instead of single click", + authors: [Devs.Ven], + patches: [ + { + find: "VoiceChannel.renderPopout", + replacement: { + match: /onClick:function\(\)\{(e\.handleClick.+?)}/g, + // hack: this is not a react onClick, it is a custom prop handled by Discord + // thus, replacin this with onDoubleClick won't work and you also cannot check + // e.detail since instead of the event they pass the channel. + // do this timer workaround instead + replace: "onClick:function(){Vencord.Plugins.plugins.vcDoubleClick.schedule(()=>{$1}, e)}", + }, + }, + { + find: 'className:"channelMention",iconType:(', + replacement: { + match: /onClick:(.{1,3}),/, + replace: "onClick:(_vcEv)=>_vcEv.detail>=2&&($1)(),", + } + } + ], + + schedule(cb: () => void, e: any) { + const id = e.props.channel.id as string; + // use a different counter for each channel + const data = (timers[id] ??= { timeout: void 0, i: 0 }); + // clear any existing timer + clearTimeout(data.timeout); + + // if we already have 2 or more clicks, run the callback immediately + if (++data.i >= 2) { + cb(); + delete timers[id]; + } else { + // else reset the counter in 500ms + data.timeout = setTimeout(() => { + delete timers[id]; + }, 500); + } + } +}); |