Как: дать разрешения для текстового канала, когда пользователь присоединяется к VC, и отзывать, когда пользователь покидает VC - PullRequest
1 голос
/ 31 мая 2019

Я пытаюсь сделать так, чтобы, когда кто-то присоединялся к Голосовому каналу, бот добавлял конкретного человека в текстовый канал с разрешением на чтение и отправку сообщений и удалял человека и его разрешения, когда они покидаютГолосовой канал.Я не слишком знаком с discord.js, поэтому не знаю, как это сделать.

Ответы [ 2 ]

2 голосов
/ 31 мая 2019

Прежде всего, добро пожаловать в переполнение стека. Надеюсь, мы сможем вам помочь.

Давайте начнем с определения, когда участник присоединяется к голосовому каналу. Для этого мы можем прослушать событие вашего клиента voiceStateUpdate. Затем мы можем сравнить старый голосовой канал с новым и посмотреть, присоединился ли участник или покинул его. Наконец, мы можем изменить разрешения для члена в текстовом канале, используя GuildChannel.overwritePermissions().

Обновление: Несколько "пар" текстовых каналов и голосовых каналов с похожим поведением.

Чтобы сделать это для множества различных каналов, вы можете настроить файл json для хранения голосовых каналов и соответствующих текстовых каналов, а затем выполнить итерацию по каждой паре, проверяя, соответствует ли ситуация какому-либо.

channelPairs.json

[
  { "voice": "voiceChannelIDHere", "text": "textChannelIDHere" }
]

index.js

const pairs = require('./channelPairs.json'); // Keep in mind the path may vary

client.on('voiceStateUpdate', (oldMember, newMember) => {
  let oldID;
  let newID;
  if (oldMember.voiceChannel) oldID = oldMember.voiceChannel.id;
  if (newMember.voiceChannel) newID = newMember.voiceChannel.id;

  for (let i = 0; i < pairs.length; i++) {
    const textChannel = newMember.guild.channels.get(pairs[i].text);
    if (!textChannel) {
      console.log('Invalid text channel ID in json.');
      continue;
    }

    const vcID = pairs[i].voice;

    if (oldID !== vcID && newID === vcID) {          // Joined the voice channel.
      textChannel.overwritePermissions(newMember, {
        VIEW_CHANNEL: true,
        SEND_MESSAGES: true
      }).catch(console.error);
    } else if (oldID === vcID && newID !== vcID) {   // Left the voice channel.
      textChannel.overwritePermissions(newMember, {
        VIEW_CHANNEL: null,
        SEND_MESSAGES: null
      }).catch(console.error);
    }
  }
});
0 голосов
/ 31 мая 2019

Хорошо, давайте посмотрим на API DiscordJS:

Найдено здесь.

Как мы видим, есть класс с именем " WSEvent " (расшифровывается как WebsocketEvent ). Мы можем использовать это, чтобы обнаружить, когда пользователь присоединяется к каналу ...

Но мы не можем по-настоящему использовать это, потому что нет события "CHANNEL_JOIN". Поэтому вместо этого мы должны прослушивать это событие voiceStateUpdate или VOICE_STATUS_UPDATE.

Вот так:

// voiceStateUpdate
/* Emitted whenever a user changes voice state - e.g. joins/leaves a channel, mutes/unmutes.
PARAMETER    TYPE             DESCRIPTION
oldMember    GuildMember      The member before the voice state update
newMember    GuildMember      The member after the voice state update    */
client.on("voiceStateUpdate", function(oldMember, newMember){
    console.log(`a user changes voice state`);
  // Here we can just check if newMember is in the channel that we want. Bam.
  if(newMember.voiceChannel.name == 'channelname') {
    // DO SOMETHING.
    myVoiceChannel.overwritePermissions(newMember, {
      SEND_MESSAGES: true
    });
  } else {
    myVoiceChannel.overwritePermissions(newMember, {
      SEND_MESSAGES: null
    });
  }
});

Давайте уменьшим это:

newMember.voiceChannel - Это означает, к какому каналу они подключены.

voiceChannel.name - Получить название канала, чтобы мы могли его проверить.

Надеюсь, я вам помог, и, между прочим, вот небольшая читалка, которую я люблю использовать при разработке ботов DiscordJS: https://gist.github.com/koad/316b265a91d933fd1b62dddfcc3ff584

...