Как исправить «Поставленный параметр не был ни пользователем, ни ролью». - PullRequest
1 голос
/ 06 мая 2019

Я пытаюсь заставить бота создать роль и перейти к указанному каналу в аргументах команды.
Код заставит бота перейти на указанный канал и добавить разрешения для роли, которую только что создал бот, и в этом проблема.
Консоль в VSC сообщает, что «роль / пользователь не указан» и пропускает это.

Я пытался изменить arole на переменную и установить arole (message.arole) на arole.id, и все равно это не сработало. Возиться и изменить настройки не удалось вообще.

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

Я ожидаю, что бот сможет получить доступ к указанному каналу в аргументах, создать роль и переопределить разрешения роли для этого канала.

Фактический вывод заключается в том, что бот делает все хорошо, но роль не имеет специальных разрешений для канала.

1 Ответ

0 голосов
/ 06 мая 2019

С вашим кодом есть две основные проблемы:

  • Guild.createRole() синхронно не возвращает Role: он возвращает Promise<Role>, так что вы фактически не предоставляете роль в качестве аргумента для .overwritePermissions()
  • После создания роли (если вы правильно сохранили ее в arole), вы не сможете получить к ней доступ как message.arole.

Вы можете сделать это либо с помощью async/await, либо с помощью метода обещания .then().
Если вы не уверены в обещаниях или асинхронном коде, вам следует попытаться узнать что-то об этом, это действительно полезно: проверить Используя обещания , Promise и async function документы по MDN.

Вот пример:

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