【问题标题】:I can't change channel permissions ( interaction.channel.permissionOverwrites is not a function )我无法更改频道权限(interaction.channel.permissionOverwrites 不是函数)
【发布时间】:2022-01-09 06:15:13
【问题描述】:

我正在尝试制作一个票务系统,当我点击按钮时,它会更改频道类别并删除会员查看它的权限。当我单击按钮时,它会更改类别但不会更改频道的权限。我已经查看了文档,但没有找到任何东西。

错误:

C:\Users\whash\OneDrive\Documentos\optipc_bot_beta_sem_erro\events\ticket\suporte.js:187
        interaction.channel.permissionOverwrites(subTicketSuporte.userId, {deny: Permissions.FLAGS.VIEW_CHANNEL})
                            ^

TypeError: interaction.channel.permissionOverwrites is not a function
    at Client.<anonymous> (C:\Users\whash\OneDrive\Documentos\optipc_bot_beta_sem_erro\events\ticket\suporte.js:187:29)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)

数据库:

我的代码:

const {
    MessageActionRow,
    MessageButton,
    MessageEmbed,
    MessageSelectMenu,
    Permissions,
} = require("discord.js");
const firebase = require("firebase");
const db = firebase.database();

const client = require("../../index");

client.on("interactionCreate", async (interaction) => {
    if (interaction.isCommand()) return;
    interaction.deferUpdate();

    // ROWS //
    const rowDelChannel = new MessageActionRow().addComponents(
        new MessageButton()
            .setStyle("DANGER")
            .setLabel("???? | Deletar canal")
            .setCustomId("delChannel")
    );

    const rowDelMessage = new MessageActionRow().addComponents(
        new MessageButton()
            .setStyle("DANGER")
            .setLabel("???? | Deletar mensagem")
            .setCustomId("delMessage")
    );

    const rowArchiveThread = new MessageActionRow().addComponents(
        new MessageButton()
            .setStyle("DANGER")
            .setLabel("???? | Arquivar thread")
            .setCustomId("archiveThread")
    );

    const rowArchiveChannel = new MessageActionRow().addComponents(
        new MessageButton()
            .setStyle("DANGER")
            .setLabel("???? | Arquivar canal")
            .setCustomId("archiveChannel")
    );

    // EMBEDS //
    let embedOptions = new MessageEmbed()
        .setTitle("???? | Opções do ticket")
        .setDescription(
            'Olá, bem vindo a aba de suporte! Caso queira fechar o ticket, clique em "arquivar" ou "deletar".'
        )
        .setColor("GREY")
        .setFooter("A optiPC agradece sua atenção.", interaction.guild.iconURL());

        let subTicketSuporte = await db.ref(`Ticket/Arquivado/${interaction.user.id}`).once("value");
        subTicketSuporte = subTicketSuporte.val();

    // PAINEL DE SUPORTE//

    if (interaction.customId === "OPENSUPORTE") {

        // DATABASE //

        let ticketSuporte = await db.ref(`Ticket/Suporte`).once("value");
        ticketSuporte = ticketSuporte.val();

        //var subTicketSuporte = await db.ref(`Ticket/Arquivado/${interaction.user.id}`).once("value");
        // subTicketSuporte = subTicketSuporte.val();

        if (!ticketSuporte) ticketSuporte = {};
        if (!subTicketSuporte) subTicketSuporte = {};

        // salvando contador
        if (!ticketSuporte.contador) {
            db.ref(`Ticket/Suporte`).set({
                contador: parseInt(1),
            });
        } else {
            db.ref(`Ticket/Suporte`).update({
                contador: ticketSuporte.contador + parseInt(1),
            });
        }

        // salvando o ID do user na DB
        if (!subTicketSuporte.userId) {
            db.ref(`Ticket/Arquivado/${interaction.user.id}`).set({
                userId: interaction.user.id
            });
        }

        // configurando o canal do ticket
        let canalSuporte = await interaction.guild.channels.create(
            `❔▏suporte_${ticketSuporte.contador}`,
            {
                parent: "915975240541171813",
                type: "GUILD_TEXT",
                permissionOverwrites: [
                    {
                        id: interaction.guild.id,
                        deny: [Permissions.FLAGS.VIEW_CHANNEL],
                    },
                    {
                        id: interaction.user.id,
                        allow: [
                            Permissions.FLAGS.VIEW_CHANNEL,
                            Permissions.FLAGS.SEND_MESSAGES,
                        ],
                    },
                ],
            }
        );
        await canalSuporte.send({
            embeds: [embedOptions],
            components: [rowDelChannel, rowArchiveChannel],
        });
        interaction.followUp({
            content: `✅ Ticket criado com sucesso! Por favor, vá até ${canalSuporte}.`,
            ephemeral: true,
        });

        /*
                    // configurando thread
            
                    const threadSuporte = await interaction.channel.threads.create({
                        name: `❔▏suporte_${counterSuporte.contador}`,
                        autoArchiveDuration: 60,
                        // type: 'GUILD_PRIVATE_THREAD',
                        reason: 'Thread para suporte.'
                    });
            
                    if (threadSuporte.joinable) await threadSuporte.join();
                    await threadSuporte.members.add('840983211458428928');
                    await threadSuporte.members.add('550978800952016896');
                    await threadSuporte.members.add('518517142656647208');
                    await threadSuporte.members.add('639856950368010240');
            
                    // ARQUIVAR THREAD //
                    if (interaction.customId === "archiveThread") {
                        let permicaoNecessaria = Permissions.FLAGS.BAN_MEMBERS;
                        if (!interaction.member.permissions.has(permicaoNecessaria))
                            return interaction.followUp({
                                content: "Você não possui permissão para arquivar o ticket!",
                                ephemeral: true,
                            });
            
                        await threadSuporte.setArchived(true); // archived
            
                    }
                }
            */
    }

    // ROW CONFIG
    if (interaction.customId === "delChannel") {
        let permicaoNecessaria = Permissions.FLAGS.BAN_MEMBERS;
        if (!interaction.member.permissions.has(permicaoNecessaria))
            return interaction.followUp({
                content: "Você não possui permissão para fechar o ticket!",
                ephemeral: true,
            });

        interaction.channel.delete();
    }

    if (interaction.customId === "delMessage") {
        let permicaoNecessaria = Permissions.FLAGS.BAN_MEMBERS;
        if (!interaction.member.permissions.has(permicaoNecessaria))
            return interaction.followUp({
                content: "Você não possui permissão para fechar o ticket!",
                ephemeral: true,
            });

        interaction.message.delete();
    }

    if (interaction.customId === "archiveChannel") {
        console.log("a") // a
        
        let permicaoNecessaria = Permissions.FLAGS.BAN_MEMBERS;
        if (!interaction.member.permissions.has(permicaoNecessaria))
            return interaction.followUp({
                content: "Você não possui permissão para arquivar o ticket!",
                ephemeral: true,
            });

        await interaction.channel.setParent("915985254127370240");
        interaction.channel.permissionOverwrites(subTicketSuporte.userId, {deny: Permissions.FLAGS.VIEW_CHANNEL})
    }
});

【问题讨论】:

标签: javascript node.js database firebase discord.js


【解决方案1】:

其实GuildChannel#permissionOverwrites不是函数

这是一个返回PermissionOverwriteManager的属性

我建议你使用

interaction.channel.permissionOverwrites.edit(subTicketSuporte.userId, { "VIEW_CHANNEL": false })

应该就是这样

Docs Source

【讨论】:

    【解决方案2】:

    GuildChannel#permissionOverwritesPermissionOverwriteManager。请改用.set

    interaction.channel.permissionOverwrites.set([{
      deny: [Permissions.FLAGS.VIEW_CHANNEL],
      id: subTicketSuporte.userId,
      type: "member"
    }])
    

    【讨论】:

    • permissionOverwrites.set() 只接受一个数组或一个集合,这个将throw a TypeError
    猜你喜欢
    • 1970-01-01
    • 2021-09-16
    • 2021-02-01
    • 1970-01-01
    • 2020-05-07
    • 2021-04-18
    • 1970-01-01
    • 2023-02-18
    • 2018-12-15
    相关资源
    最近更新 更多