1
votes

I'm trying to make a bot make a role and go to a specified channel in the arguments of a command.
The code will make the bot go to the specified channel, and add permissions for the role that the bot just made, and that's where the problem is.
The console in VSC says that "a role / user was not specified" and it skips over that.

I've tried changing the arole to a var, and setting the arole (message.arole) to arole.id and it still didn't work. Messing around and changing the settings did not work at all.

let woaID = message.mentions.channels.first();
if (!woaID) return message.channel.send("Channel is nonexistant or command was not formatted properly. Please do s!woa #(channelname)");
let specifiedchannel = message.guild.channels.find(t => t.id == woaID.id);
var arole = message.guild.createRole({
  name: `A marker v1.0`,
  color: 0xcc3b3b,
  hoist: false,
  mentionable: false,
  permissions: ['SEND_MESSAGES']
}).catch(console.error);

message.channel.send("Created role...");

message.channel.send("Role set up...");


/*const sbwrID = message.guild.roles.find(`null v1.0`);
let specifiedrole = message.guild.roles.find(r => r.id == sbwrID.id)*/

message.channel.send('Modified');

specifiedchannel.overwritePermissions(message.arole, {
    VIEW_CHANNEL: true,
    SEND_MESSAGES: false
  })
  .then(updated => console.log(updated.permissionOverwrites.get(arole.id)))
  .catch(console.error);

I expect the bot able to access the specified channel in the args, and create a role and overwrite role permissions for that channel.

The actual output is that the bot does everything fine, but the role does not have special permissions for the channel.

1

1 Answers

0
votes

There are two main issues with your code:

  • The Guild.createRole() does not synchronously return a Role: it returns a Promise<Role>, so you're in fact not providing a role as argument for .overwritePermissions()
  • After you create the role (if you properly store it in arole) you can't access it as message.arole.

You can either do that with async/await or using the .then() promise method.
If you're not confident with promises or asynchronous code you should try to learn something about it, it's really useful: check out Using promises, the Promise and async function docs by MDN.

Here's an example:

message.guild.createRole({
  name: `A marker v1.0`,
  color: 0xcc3b3b,
  hoist: false,
  mentionable: false,
  permissions: ['SEND_MESSAGES']
}).then(async arole => {
  let updated = await specifiedchannel.overwritePermissions(arole, {
    VIEW_CHANNEL: true,
    SEND_MESSAGES: false
  });
  console.log(updated.permissionOverwrites.get(arole.id));
}).catch(console.error);