javascriptdiscorddiscord.jsticket-system

Trying to make a Ticket Bot but gets TypeError: channel.updateOverwrite is not a function


I want to make a Ticket System and in the ticket when you react with ✅ makes the channel view only from admins. (Closes the ticket.)

Code:

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

Error: TypeError: channel.updateOverwrite is not a function


Solution

  • First of all, channel is not an instance of GuildChannel but of Message, which is probably a mistake. To get the corresponding GuildChannel object, use the following: (as PerplexingParadox said in their comment.)

    let channel = reaction.message.channel;
    

    The next thing is that Collection.get() method accepts a key as its parameter, which is in this case the reaction id (or Twitter Snowflake). To find a reaction by its name, you could do this:

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

    And remove them if they are found using the optional chaining operator.

    At last GuildChannel.updateOverwrite() accepts RoleResolvable or UserResolvable as its first argument. Passing in a user's id is correct, because it falls under UserResolvable. You probably accidentally added the quotation marks around the user.id. It is a variable, if you want it to be treated like one remove the quotation marks, otherwise it will be treated as nothing more but a string with a text inside. And won't work because text "user.id" is not a valid Twitter Snowflake.

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