Skip to content
This repository has been archived by the owner on Jul 29, 2024. It is now read-only.

Commit

Permalink
feat(plugin): VoiceChatUtilities
Browse files Browse the repository at this point in the history
  • Loading branch information
verticalsync committed Feb 16, 2024
1 parent 839bde2 commit 8969036
Show file tree
Hide file tree
Showing 3 changed files with 143 additions and 0 deletions.
1 change: 1 addition & 0 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ Suncord is a fork of [Vencord](https://github.com/Vendicated/Vencord).
- ReplyTimestamp (by [Kyuuhachi](https://github.com/Kyuuhachi/))
- SoundBoardLogger (by [ImpishMoxxie](https://github.com/ImpishMoxxie/SoundBoardLogger))
- MemberListActivities (by [D3SOX](https://github.com/D3SOX/vencord-userplugins/))
- VoiceChatUtilities (by [D3SOX](https://github.com/D3SOX/vencord-userplugins/))

## Installing / Uninstalling

Expand Down
5 changes: 5 additions & 0 deletions src/plugins/voiceChatUtilities/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# VoiceChatUtilities

Allows you to perform multiple actions on an entire channel (move, mute, disconnect, etc.)

![Screenshot](https://user-images.githubusercontent.com/60252259/224880206-9f923f0c-9939-4e1b-81ad-70167f0ee6d4.png)
137 changes: 137 additions & 0 deletions src/plugins/voiceChatUtilities/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
/*
* Vencord, a Discord client mod
* Copyright (c) 2024 Vendicated and contributors
* SPDX-License-Identifier: GPL-3.0-or-later
*/

import { addContextMenuPatch, NavContextMenuPatchCallback, removeContextMenuPatch } from "@api/ContextMenu";
import { Devs } from "@utils/constants";
import definePlugin from "@utils/types";
import { findStoreLazy } from "@webpack";
import { GuildChannelStore, Menu, React, RestAPI, UserStore } from "@webpack/common";
import type { Channel } from "discord-types/general";

const VoiceStateStore = findStoreLazy("VoiceStateStore");

function sendPatch(channel: Channel, body: Record<string, any>, bypass = false) {
const usersVoice = VoiceStateStore.getVoiceStatesForChannel(channel.id); // Get voice states by channel id
const myId = UserStore.getCurrentUser().id; // Get my user id

Object.keys(usersVoice).forEach((key, index) => {
const userVoice = usersVoice[key];

if (bypass || userVoice.userId !== myId) {
setTimeout(() => {
RestAPI.patch({
url: `/guilds/${channel.guild_id}/members/${userVoice.userId}`,
body: body
});
}, index * 500);
}
});
}

interface VoiceChannelContextProps {
channel: Channel;
}

const VoiceChannelContext: NavContextMenuPatchCallback = (children, { channel }: VoiceChannelContextProps) => () => {
// only for voice and stage channels
if (!channel || (channel.type !== 2 && channel.type !== 13)) return;
const userCount = Object.keys(VoiceStateStore.getVoiceStatesForChannel(channel.id)).length;
if (userCount === 0) return;

const guildChannels: { VOCAL: { channel: Channel, comparator: number; }[]; } = GuildChannelStore.getChannels(channel.guild_id);
const voiceChannels = guildChannels.VOCAL.map(({ channel }) => channel).filter(({ id }) => id !== channel.id);

children.splice(
-1,
0,
<Menu.MenuItem
label="Voice Tools"
key="voice-tools"
id="voice-tools"
>
<Menu.MenuItem
key="voice-tools-disconnect-all"
id="voice-tools-disconnect-all"
label="Disconnect all"
action={() => sendPatch(channel, {
channel_id: null,
})}
/>

<Menu.MenuItem
key="voice-tools-mute-all"
id="voice-tools-mute-all"
label="Mute all"
action={() => sendPatch(channel, {
mute: true,
})}
/>

<Menu.MenuItem
key="voice-tools-unmute-all"
id="voice-tools-unmute-all"
label="Unmute all"
action={() => sendPatch(channel, {
mute: false,
})}
/>

<Menu.MenuItem
key="voice-tools-deafen-all"
id="voice-tools-deafen-all"
label="Deafen all"
action={() => sendPatch(channel, {
deaf: true,
})}
/>

<Menu.MenuItem
key="voice-tools-undeafen-all"
id="voice-tools-undeafen-all"
label="Undeafen all"
action={() => sendPatch(channel, {
deaf: false,
})}
/>

<Menu.MenuItem
label="Move all"
key="voice-tools-move-all"
id="voice-tools-move-all"
>
{voiceChannels.map(voiceChannel => {
return (
<Menu.MenuItem
key={voiceChannel.id}
id={voiceChannel.id}
label={voiceChannel.name}
action={() => sendPatch(channel, {
channel_id: voiceChannel.id,
}, true)}
/>
);
})}

</Menu.MenuItem>
</Menu.MenuItem>
);
};



export default definePlugin({
name: "VoiceChatUtilities",
description: "This plugin allows you to perform multiple actions on an entire channel (move, mute, disconnect, etc.) (originally by dutake)",
authors: [{ name: "! 𝕯'𝖆𝖒𝖘", id: 769939285792653325n }, Devs.D3SOX],

start() {
addContextMenuPatch("channel-context", VoiceChannelContext);
},

stop() {
removeContextMenuPatch("channel-context", VoiceChannelContext);
},
});

0 comments on commit 8969036

Please sign in to comment.