Created
June 16, 2022 14:05
-
-
Save Rhincodon/17773b5bffccc5e888ae9e73d5a7995a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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