【问题标题】:How to: Give permissions for text channel when user joins VC and revoke when user leaves VC如何:在用户加入 VC 时授予文本频道权限,并在用户离开 VC 时撤销
【发布时间】:2019-10-17 05:07:12
【问题描述】:

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

【问题讨论】:

  • 请记住,如果您要问一个操作方法问题,有时不需要代码,但至少有一个 API 链接,或者您的问题中的更多块会有所帮助:P

标签: javascript discord discord.js


【解决方案1】:

首先,欢迎来到 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);
    }
  }
});

【讨论】:

  • 我想问一下,您将如何为多个州执行此操作?我的意思是另一个 VC 和文本频道链接。我将如何处理这样的多对?
  • @AzureReckoning 好问题。我将更新代码以显示一个简单的方法。
  • @AzureReckoning 更新答案。
【解决方案2】:

好的,让我们来看看 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

【讨论】:

  • 投反对票有两个原因。第一,这个答案没有解决问题的权限部分。第二,代码脱轨。 newUser 未定义。 voiceConnections 是 Client 实例的属性,而不是 GuildMember。正确的代码看起来像newMember.voiceChannel.name。即使有这个修复,代码仍然会被用户静音或取消静音等触发。
  • OOF。当我回答这个问题时,我的大脑正在嘎嘎作响。我将进行建议的修复,但我相信您对静音/取消静音是错误的。 “例如加入/离开频道”
  • 来自文档的直接引用:“每当用户更改语音状态时发出 - 例如加入/离开频道,静音/取消静音。”
  • 我认为这并不重要,因为有一个明确的 if 语句可以进行检查。仅仅因为静音触发了事件,并不会改变在频道中时他们将拥有权限的最终效果,幸运的是 overwritePermissions 也不会保存权限。那么一切都好吗?这里有什么问题......我的工作不是为他们做这件事,只是为他们指明正确的方向。您之前的评论很有用,但不是。
  • 静音/静音仍然可以通过if 语句获得。即使用户已经拥有权限,也会进行过多的、不必要的 API 调用,并且可能会限制客户端速率。
猜你喜欢
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 2016-10-07
  • 2013-07-10
  • 1970-01-01
  • 2019-06-01
  • 2021-01-31
相关资源
最近更新 更多