如何使用Discord.js v13实现实时语音状态?

3
我尝试使用discord.js v13实时检测语音频道中每个成员是否在发言。 换句话说,我想在我的应用程序中复制discord的绿色圆圈。 然而,我无法找到合适的代码示例或文章。 你能给我一些建议吗?
编辑:
根据建议,我成功解决了这个问题。 Recorder BOT示例 很有用。 下面是一个代码示例。
const { Client, Intents, VoiceChannel } = require('discord.js')
const { joinVoiceChannel, getVoiceConnection, entersState, VoiceConnectionStatus } = require('@discordjs/voice');
const client = new Client({ intents: ['GUILD_VOICE_STATES', 'GUILD_MESSAGES', 'GUILDS'] });

client.on("messageCreate", async (message) => {
  if(message.content.toLowerCase() === "test") {
    var connection = getVoiceConnection(message.guildId)
    if(!connection){
      connection = joinVoiceChannel({
        channelId: message.member.voice.channelId,
        guildId: message.guildId,
        adapterCreator: message.guild.voiceAdapterCreator,
        selfDeaf: false,
        selfMute: true,
      });
    }
    try {
      await entersState(connection, VoiceConnectionStatus.Ready, 20e3);
      connection.receiver.speaking.on("start", (userId) => {
        console.log(  `${userId} start`  );
      });
      connection.receiver.speaking.on("end", (userId) => {
        console.log(  `${userId} end`  );
      });
      console.log(  "Ready"  );
    } catch (error) {
      console.warn(error);
    }

  }
});

client.login('YOUR-TOKEN')
1个回答

1
搜索结果表明,以前曾经有这种可能,但因为事件不会触发或仅触发一次而出了名的问题而被破坏了。
客户端.voiceStateUpdate事件曾经会给您一个VoiceState,在其中有一个speaking属性,它会告诉您是否有人在讲话(似乎从来没有真正起作用过)。
当前discord.js文档中VoiceState显示此属性不再存在,并且您不能仅使用discord.js来完成您的要求。
编辑:根据下面MrMythical的评论,discord.js/voice具有voiceRecievers,它公开{{link2:voiceReciever.speakingMap.users}},当前正在说话的用户的映射表。 您可以通过注册侦听器来获取它的事件。

谢谢你的有益评论。 我想考虑另一种方法。 你知道最合适的方法吗? - kjmtks
1
也许@discordjs/voice包中的VoiceReceiver会有所帮助。 - MrMythical
我非常感谢Themoonisacheese和MrMythical给予我的友善和宝贵的建议。 - kjmtks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接