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

How to: Give permissions for text channel when user joins VC and revoke when user leaves VC

我正在尝试做到这一点,以便当有人加入语音频道时,机器人会将特定的人添加到文本频道,并允许他们阅读和发送消息,并在他们加入时删除个人及其权限离开语音频道。我对 discord.js 不是很熟悉,所以我不确定该怎么做。

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

找到here.

正如我们所见,有一个名为“WSEvent”的class(代表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

首先,欢迎来到 Stack Overflow。希望我们能对您有所帮助。

让我们从检测成员何时加入语音频道开始。为此,我们可以听取您客户的意见 voiceStateUpdate event. Next, we can compare the old voice channel with the new one, and see if the member joined or left. Finally, we can change the permissions for the member in the text channel using GuildChannel.overwritePermissions().

更新: 多个 "pairs" 具有相似行为的文本频道和语音频道。

要为许多不同的频道执行此操作,您可以设置一个 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);
    }
  }
});