首页 > 解决方案 > 尝试制作 Ticket Bot 但得到 TypeError: channel.updateOverwrite 不是函数

问题描述

我想制作一个票务系统,并在您对 ✅ 做出反应时在票证中仅从管理员那里查看频道。(关闭票证。)

代码:

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

标签: javascriptdiscorddiscord.jsticket-system

解决方案


首先,channelis not an instance of GuildChannelbut of Message,这可能是一个错误。要获取相应的GuildChannel对象,请使用以下命令:(正如 PerplexingParadox 在他们的评论中所说。)

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();
}

如果使用可选的链接运算符找到它们,则将它们删除。

最后GuildChannel.updateOverwrite()接受RoleResolvableorUserResolvable作为它的第一个参数。传入用户的 id 是正确的,因为它属于UserResolvable. 您可能不小心在user.id. 它是一个变量,如果您希望它被视为删除引号,否则它将被视为仅是一个包含文本的字符串。并且不会起作用,因为文本“user.id”不是有效的 Twitter Snowflake。

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

推荐阅读