discord.js - Has role give permission

1.8k views Asked by At

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.

1

There are 1 answers

6
Donovan_DMC On BEST ANSWER

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.