diff --git a/commands/admin/custom_vc/slash.js b/commands/admin/custom_vc/slash.js index c640655..a079c69 100644 --- a/commands/admin/custom_vc/slash.js +++ b/commands/admin/custom_vc/slash.js @@ -1,4 +1,4 @@ -import { SlashCommandBuilder } from 'discord.js'; +import { ChannelType, SlashCommandBuilder } from 'discord.js'; import { VoiceChannel } from '../../../database.js'; export const data = new SlashCommandBuilder() @@ -39,13 +39,16 @@ export async function execute(interaction) { step = 'create'; // Create new channel - const channel = await guild.create({ + const channel = await guild.channels.create({ name, type: ChannelType.GuildVoice }); // Save channel data step = 'save'; - await VoiceChannel.create({ id: channel.id }); + await VoiceChannel.create({ + id: channel.id, + create: true + }); // Reply success to acknowledge command await interaction.reply({ @@ -64,7 +67,7 @@ export async function execute(interaction) { // Save channel data step = 'save'; - await VoiceChannel.create({ id }); + await VoiceChannel.create({ id, create: true }); // Reply success to acknowledge command await interaction.reply({ diff --git a/events/channels/voiceStateUpdate.js b/events/channels/voiceStateUpdate.js index 5ee9841..a640d0c 100644 --- a/events/channels/voiceStateUpdate.js +++ b/events/channels/voiceStateUpdate.js @@ -1,45 +1,70 @@ import { ChannelType, Events, PermissionsBitField } from 'discord.js'; import { VoiceChannel } from '../../database.js'; +const getchannel = async (member, channels) => { + // Check database for existing channel + const ownCh = await VoiceChannel.findOne({ + where: { + owner: member.user.id + } + }); + if (ownCh !== null) { + return await channels.fetch(ownCh.id); + } + + // Create private channel with all permissions + const name = member.user.username; + const chName = `${name}${name.endsWith('s') ? "'" : "'s"} channel`; + const privCh = await channels.create({ + name: chName, + type: ChannelType.GuildVoice, + permissionOverwrites: [ + { + id: member.id, + allow: [ + PermissionsBitField.All + ] + } + ] + }); + + // Save newly created channel + await VoiceChannel.create({ + id: privCh.id, + owner: member.user.id + }) + + return privCh; +}; + export const name = Events.VoiceStateUpdate; export async function execute(_, state) { if (!state.channel) return; // Find channel by id, return if not registered for customs - const channel = await VoiceChannel.findOne({ + const createCh = await VoiceChannel.findOne({ where: { - id: state.channel.id + id: state.channel.id, + create: true, } }); - if (channel === null) return; + if (createCh === null) return; // Extract user data const member = state.member; - const name = member.user.username; // Extract channel data const channels = state.guild.channels; + let step = 'create'; try { - // Create private channel with all permissions - const chName = `${name}${name.endsWith('s') ? "'" : "'s"} channel`; - const privCh = await channels.create({ - name: chName, - type: ChannelType.GuildVoice, - permissionOverwrites: [ - { - id: member.id, - allow: [ - PermissionsBitField.All - ] - } - ] - }); + const privCh = await getchannel(member, channels); + step = 'move to'; // Move user to private channel await state.setChannel(privCh); console.info(`[INFO] User '${name}' created private channel with ID ${privCh.id}.`); } catch (error) { console.error(error); - await member.send('Could no create or move to channel! Please contact server staff.'); + await member.send(`Failed to ${step} channel! Please contact server staff.`); } } diff --git a/models/voiceChannels.js b/models/voiceChannels.js index f175404..1e73e57 100644 --- a/models/voiceChannels.js +++ b/models/voiceChannels.js @@ -1,10 +1,18 @@ import { DataTypes } from 'sequelize'; -export default function (sequelize) { +export default function(sequelize) { return sequelize.define('VoiceChannel', { id: { type: DataTypes.STRING, primaryKey: true + }, + create: { + type: DataTypes.BOOLEAN + }, + owner: { + type: DataTypes.STRING, + defaultValue: false, + allowNull: true } }); }