提问者:小点点

如何:在用户加入VC时授予文本通道的权限,在用户离开VC时撤销文本通道的权限


我试图使它这样,当某人加入语音通道,所以机器人将添加特定的人到文本通道的权限,阅读和发送消息,并删除个人和他们的权限,当他们离开语音通道。我对discord.js不是很熟悉,所以我不知道怎么做。


共2个答案

匿名用户

首先,也是最重要的,欢迎使用堆栈溢出。我希望我们能对你有所帮助。

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

匿名用户

好的,让我们来看看DiscordJS API:

在这里发现的。

正如我们所看到的,有一个名为“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