如何:当用户加入VC时为文本通道授予权限,并在用户离开VC时撤消权限

时间:2019-05-31 14:27:29

标签: javascript discord discord.js

我正在尝试做到这一点,以便当有人加入语音通道时,Bot会将特定的人添加到文本通道中,并具有阅读和发送消息的权限,并在离开该人员时删除该人及其权限。语音通道。我对discord.js不太熟悉,所以不确定如何去做。

2 个答案:

答案 0 :(得分:2)

首先,欢迎您使用Stack Overflow。希望我们能为您提供帮助。

让我们先检测成员何时加入语音通道。为此,我们可以监听您客户的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);
    }
  }
});

答案 1 :(得分:0)

好的,让我们看一下DiscordJS API:

找到了here.

我们可以看到,有一个名为“ 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