Compare commits

...

3 Commits

Author SHA1 Message Date
f3e2715703 use existing private channels 2024-02-07 20:05:39 +01:00
a29e2074a5 ignore if channel is unregistered 2024-02-07 19:38:51 +01:00
d212ca398a acknowledge command with reply 2024-02-07 19:34:18 +01:00
3 changed files with 78 additions and 21 deletions

View File

@ -1,4 +1,4 @@
import { SlashCommandBuilder } from 'discord.js'; import { ChannelType, SlashCommandBuilder } from 'discord.js';
import { VoiceChannel } from '../../../database.js'; import { VoiceChannel } from '../../../database.js';
export const data = new SlashCommandBuilder() export const data = new SlashCommandBuilder()
@ -39,13 +39,22 @@ export async function execute(interaction) {
step = 'create'; step = 'create';
// Create new channel // Create new channel
const channel = await guild.create({ const channel = await guild.channels.create({
name, type: ChannelType.GuildVoice name, type: ChannelType.GuildVoice
}); });
// Save channel data // Save channel data
step = 'save'; step = 'save';
await VoiceChannel.create({ id: channel.id }); await VoiceChannel.create({
id: channel.id,
create: true
});
// Reply success to acknowledge command
await interaction.reply({
content: `Successfully created channel!`,
ephemeral: true
});
break; break;
} }
case 'register': { case 'register': {
@ -58,7 +67,13 @@ export async function execute(interaction) {
// Save channel data // Save channel data
step = 'save'; step = 'save';
await VoiceChannel.create({ id }); await VoiceChannel.create({ id, create: true });
// Reply success to acknowledge command
await interaction.reply({
content: `Successfully registered channel!`,
ephemeral: true
});
break; break;
} }
} }

View File

@ -1,36 +1,70 @@
import { ChannelType, Events, PermissionsBitField } from 'discord.js'; 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 const name = Events.VoiceStateUpdate;
export async function execute(_, state) { export async function execute(_, state) {
if (!state.channel) return; if (!state.channel) return;
// Find channel by id, return if not registered for customs
const createCh = await VoiceChannel.findOne({
where: {
id: state.channel.id,
create: true,
}
});
if (createCh === null) return;
// Extract user data // Extract user data
const member = state.member; const member = state.member;
const name = member.user.username;
// Extract channel data // Extract channel data
const channels = state.guild.channels; const channels = state.guild.channels;
let step = 'create';
try { try {
// Create private channel with all permissions const privCh = await getchannel(member, channels);
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
]
}
]
});
step = 'move to';
// Move user to private channel // Move user to private channel
await state.setChannel(privCh); await state.setChannel(privCh);
console.info(`[INFO] User '${name}' created private channel with ID ${privCh.id}.`); console.info(`[INFO] User '${name}' created private channel with ID ${privCh.id}.`);
} catch (error) { } catch (error) {
console.error(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.`);
} }
} }

View File

@ -1,10 +1,18 @@
import { DataTypes } from 'sequelize'; import { DataTypes } from 'sequelize';
export default function (sequelize) { export default function(sequelize) {
return sequelize.define('VoiceChannel', { return sequelize.define('VoiceChannel', {
id: { id: {
type: DataTypes.STRING, type: DataTypes.STRING,
primaryKey: true primaryKey: true
},
create: {
type: DataTypes.BOOLEAN
},
owner: {
type: DataTypes.STRING,
defaultValue: false,
allowNull: true
} }
}); });
} }