diff --git a/modules/admin-tools/commands/admin.js b/modules/admin-tools/commands/admin.js index a0d6ecd..2384e8a 100644 --- a/modules/admin-tools/commands/admin.js +++ b/modules/admin-tools/commands/admin.js @@ -1,113 +1,54 @@ -const {ChannelType} = require('discord.js'); -const {localize} = require('../../../src/functions/localize'); +const { ChannelType } = require('discord.js'); +const { localize } = require('../../../src/functions/localize'); module.exports.subcommands = { 'movechannel': async function (interaction) { const channel = interaction.options.getChannel('channel', true); - if (!interaction.options.get('new-position')) return interaction.reply({ - content: localize('admin-tools', 'position', {i: channel.toString(), p: channel.position}), + const newPos = interaction.options.getInteger('new-position'); + const reason = interaction.options.getString('reason') ?? `Moved by ${interaction.user.tag}`; + + if (newPos === null) return interaction.reply({ + content: localize('admin-tools', 'position', { i: channel.toString(), p: channel.position }), ephemeral: true }); - await channel.setPosition(interaction.options.getInteger('new-position')); + + await channel.setPosition(newPos, { reason }); await interaction.reply({ - content: localize('admin-tools', 'position-changed', {i: channel.toString(), p: channel.position}), + content: localize('admin-tools', 'position-changed', { i: channel.toString(), p: newPos }), ephemeral: true }); }, + 'moverole': async function (interaction) { const role = interaction.options.getRole('role', true); - if (!interaction.options.get('new-position')) return interaction.reply({ - content: localize('admin-tools', 'position', {i: role.toString(), p: role.position}), - ephemeral: true - }); - await role.setPosition(interaction.options.getInteger('new-position')); + const newPos = interaction.options.getInteger('new-position', true); + const reason = interaction.options.getString('reason') ?? `Moved by ${interaction.user.tag}`; + + await role.setPosition(newPos, { reason }); await interaction.reply({ - content: localize('admin-tools', 'position-changed', {i: role.toString(), p: role.position}), + content: localize('admin-tools', 'position-changed', { i: role.toString(), p: newPos }), ephemeral: true }); }, + 'setcategory': async function (interaction) { const channel = interaction.options.getChannel('channel', true); + const category = interaction.options.getChannel('category', true); + const sync = interaction.options.getBoolean('sync') ?? true; // Default to true + const reason = interaction.options.getString('reason') ?? `Category change by ${interaction.user.tag}`; + if (channel.type === ChannelType.GuildCategory) return interaction.reply({ content: '⚠️ ' + localize('admin-tools', 'category-can-not-have-category'), ephemeral: true }); - const category = interaction.options.getChannel('category', true); - if (category.type !== ChannelType.GuildCategory) return interaction.reply({ - content: '⚠️ ' + localize('admin-tools', 'not-category'), - ephemeral: true - }); - await channel.setParent(category); - interaction.reply({ + + // lockPermissions: true will sync permissions with the new category + await channel.setParent(category, { lockPermissions: sync, reason }); + + await interaction.reply({ ephemeral: true, - content: localize('admin-tools', 'changed-category', {cat: category.toString(), c: channel.toString()}) + content: localize('admin-tools', 'changed-category', { cat: category.toString(), c: channel.toString() }) + + ` (Permissions: ${sync ? 'Synced' : 'Original'})` }); } }; - -module.exports.config = { - name: 'admin', - description: localize('admin-tools', 'command-description'), - defaultMemberPermissions: ['ADMINISTRATOR'], - options: [ - { - type: 'SUB_COMMAND', - name: 'movechannel', - description: localize('admin-tools', 'movechannel-description'), - options: [ - { - type: 'CHANNEL', - required: true, - name: 'channel', - description: localize('admin-tools', 'channel-description') - }, - { - type: 'INTEGER', - required: false, - name: 'new-position', - description: localize('admin-tools', 'new-position-description') - } - ] - }, - { - type: 'SUB_COMMAND', - name: 'moverole', - description: localize('admin-tools', 'moverole-description'), - options: [ - { - type: 'ROLE', - required: true, - name: 'role', - description: localize('admin-tools', 'role-description') - }, - { - type: 'INTEGER', - required: true, - name: 'new-position', - description: localize('admin-tools', 'new-position-description') - } - ] - }, - { - type: 'SUB_COMMAND', - name: 'setcategory', - description: localize('admin-tools', 'setcategory-description'), - options: [ - { - type: 'CHANNEL', - required: true, - name: 'channel', - channelTypes: [ChannelType.GuildText, ChannelType.GuildVoice, ChannelType.GuildAnnouncement, ChannelType.GuildStageVoice], - description: localize('admin-tools', 'channel-description') - }, - { - type: 'CHANNEL', - channel_types: [ChannelType.GuildCategory], - required: true, - name: 'category', - description: localize('admin-tools', 'category-description') - } - ] - } - ] -}; \ No newline at end of file