Skip to content

Instantly share code, notes, and snippets.

@Rhincodon
Created June 16, 2022 14:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Rhincodon/17773b5bffccc5e888ae9e73d5a7995a to your computer and use it in GitHub Desktop.
Save Rhincodon/17773b5bffccc5e888ae9e73d5a7995a to your computer and use it in GitHub Desktop.
const config = require('./config.js');
const Discord = require('discord.js');
const client = new Discord.Client();
const queue = require('queue')
require('dotenv').config({path: '../.env'});
async function removeUnusedChannels(categoryChannels) {
let countChannels = categoryChannels.size;
let emptyChannels = categoryChannels.filter((channel) => {
return channel.members.size === 0;
});
let deletedIds = [];
if (emptyChannels.size <= 1) {
return deletedIds;
}
const promises = categoryChannels.map((channel) => {
if (countChannels <= 1) {
return Promise.resolve();
}
if (channel.members.size === 0) {
deletedIds.push(channel.id);
countChannels -= 1;
return channel.delete();
}
return Promise.resolve();
});
await Promise.all(promises);
return deletedIds;
}
async function setChannelsNames(categoryChannels) {
let i = 0;
const promises = categoryChannels.map((channel) => {
let name = channel.name.split('-')[0];
i++;
return channel.setName(name + '-' + i);
});
await Promise.all(promises);
return i;
}
function addChannelToTheEndOfCategory(categoryChannels, emptyChannels, guild, i, category) {
let lastChannel = categoryChannels.last();
if (lastChannel.members.size >= 1 && emptyChannels.size <= 0) {
let name = lastChannel.name.split('-')[0];
console.log(name);
console.log(name + '-' + (i + 1));
return guild.createChannel(name + '-' + (i + 1), {
type: 'voice',
parent: category,
bitrate: 64 * 1024,
userLimit: lastChannel.userLimit,
permissionOverwrites: lastChannel.permissionOverwrites
});
}
return Promise.resolve();
}
async function releaseQueue(oldMember) {
let guild = oldMember.guild;
let processedCategories = guild.channels.filter((channel) => {
return channel.type === 'category' && config.channelIds.indexOf(channel.id) >= 0;
});
const promises = processedCategories.map(async (category) => {
let categoryChannels = guild.channels.filter((channel) => {
return channel.parentID === category.id;
});
let deletedIds = await removeUnusedChannels(categoryChannels);
categoryChannels = categoryChannels.filter((channel) => {
return deletedIds.indexOf(channel.id) < 0;
});
let emptyChannels = categoryChannels.filter((channel) => {
return channel.members.size === 0;
});
let i = await setChannelsNames(categoryChannels);
await addChannelToTheEndOfCategory(categoryChannels, emptyChannels, guild, i, category);
return Promise.resolve();
});
await Promise.all(promises);
}
const voiceQueue = queue({autostart: true, concurrency: 1});
client.on('voiceStateUpdate', (oldMember) => {
voiceQueue.push(async (cb) => {
await releaseQueue(oldMember);
cb();
});
});
client.login(process.env.DISCORD_VOICE_TOKEN);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment