Search code examples
rolediscord.js

discord.js - Has role give permission


So basically I am trying to make a ticket sort of discord bot using discord.js.

The concept: someone says +help then it DMs a member, who has said +onduty and has a role of something like "Helper".

I need to work out how to detect the role and add them to a set who are "on duty".

I was wondering if anyone can help me with this.

Many thanks.


Solution

  • The way I do stuff like this in my bot (snipet from my example bot's kick command):

    // This command should be limited to staff. In this example we just hardcode the role names.
    // Please read up on Array.some() to understand this bit: 
    // https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/some
    if(!message.member.roles.some(r=>["STAFF","Helper"].includes(r.name))) {
        return message.reply("Sorry, you don't have permissions to use this!");
    }
    

    A little bit of the documentation on this:

    https://discord.js.org/#/docs/main/stable/class/Message?scrollTo=member https://discord.js.org/#/docs/main/stable/class/GuildMember?scrollTo=roles

    message.member.roles contains a collection of the members roles

    we can use .some() to go through them and see if the user has a role
    .some(): https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/some

    So to go through all guild members to see if they have helper then, if they also have on duty:

    // assuming the Message is in a variable called message
    
    var gm=Array.from(message.guild.members);
    for(var member in gm) {
        if(gm[member].roles.some(r=>["Helper"].includes(r.name))) {
            if(gm[member].roles.some(r=>["on duty"].includes(r.name))) {
                gm[member].send(`Help command ran:\nUser: ${message.author.tag}\nContent: ${message.content.replace("+help ","")}`);
            }
        }
    }
    

    if a user runs the command +help <what they need help with> it will send to someone in the guild with the roles helper and on duty:

    (using my Discord tag for an example)


    What was ran: +help I need some help with something

    "Help command ran:
    User: Donovan_DMC#1337
    Content: I need some help with something" (without quotes)

    as for this

    I need to work out how to detect the role and add them to a set who are "on duty".

    I assume you mean that when someone with the role helper runs the command +onduty they get the role on duty.

    var roleid=message.guild.roles.find("name","on duty").id;
    if(message.member.roles.some(r=>["Helper"].includes(r.name))) {
        message.member.addRole(roleid);
    }
    


    A few documentation links to hopefully help you understand this
    message: https://discord.js.org/#/docs/main/stable/class/Message
    message.guild: https://discord.js.org/#/docs/main/stable/class/Message?scrollTo=guild
    message.guild.roles: https://discord.js.org/#/docs/main/stable/class/Guild?scrollTo=roles

    and for removing the role it's almost exactly the same

    var roleid=message.guild.roles.find("name","on duty").id;
    if(message.member.roles.some(r=>["Helper"].includes(r.name))) {
        message.member.removeRole(roleid);
    }
    



    In summary a basic bot for this you could have something like this.
    ^ I've added some extra checks for already having the role, not having it, and made it where the prefix can be changed

    I've tested it, and it worked wonderfully.