试图制作一个票务机器人但得到 TypeError: channel.updateOverwrite is not a function

问题描述

我想制作一个票务系统,当您对 ✅ 做出反应时,在票证中只允许管理员查看频道。 (关闭票证。)

代码

if (reaction.emoji.name === "✅") {
    if(!reaction.message.channel.name.includes('ticket-')) return
    reaction.users.remove(user)

    reaction.message.reactions.cache.get('✅').remove()
    reaction.message.reactions.cache.get('❌').remove()

    let channel = reaction.message

    channel.updateOverwrite("user.id",{ VIEW_CHANNEL: false });
}

错误TypeError: channel.updateOverwrite is not a function

解决方法

首先,channel 不是 GuildChannel 的实例,而是 Message 的实例,这可能是一个错误。要获取相应的 GuildChannel 对象,请使用以下内容:(如 PerplexingParadox 在其 comment 中所说。)

let channel = reaction.message.channel;

接下来是 Collection.get() 方法接受一个键作为其参数,在这种情况下是反应 ID(或 Twitter Snowflake)。要按名称查找反应,您可以这样做:

for (const emojiName of ["✅","❌"]) {
    reaction.message.reactions.cache.find((reaction) => {
        return reaction.emoji.name === emojiName;
    })?.remove();
}

并在使用 optional chaining operator 找到它们时将其删除。

最后 GuildChannel.updateOverwrite() 接受 RoleResolvableUserResolvable 作为它的第一个参数。传入用户 ID 是正确的,因为它属于 UserResolvable。您可能不小心在 user.id 周围添加了引号。它是一个变量,如果您希望将其视为一个变量,请删除引号,否则它只会被视为一个带有文本的字符串。并且无法使用,因为文本“user.id”不是有效的 Twitter Snowflake。

channel.updateOverwrite(user.id,{ VIEW_CHANNEL: false });

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...