语音频道用户有 UserStatus.Offline 虽然每个人都在线

问题描述

我正在使用 discord.Net 并希望将语音频道中的用户静音/取消静音。我不确定

voiceChannelUser.ModifyAsync(guildUserProperties => guildUserProperties.Mute = true /* or false */)

如果用户不在线并且机器人试图将他静音/取消静音,则会引发异常。因此,当我加入语音频道时,机器人会从该语音频道获取所有用户

IEnumerable<IGuildUser> voiceChannelUsers = await voiceChannel.GetUsersAsync().FlattenAsync();

正如预期的那样,该集合返回的计数为 1。在运行静音/取消静音任务之前,我不知道是否可能是用户离线并且集合不知道。那么 ModifyAsync 可能会因为用户现在离线而抛出异常?

问题是当通过

检查我自己的状态时
bool iAmOffline = voiceChannelUsers.First().Status == UserStatus.Offline; // expected false,actual true

它返回 true 虽然它应该是 false 因为我在线。所以

  • 是否需要进行该检查以防止出现异常?
  • 如果是,为什么我没有离线,但为什么说我离线?

我使用的是 discord.Net v2.3。

解决方法

如本评论所述

Voice channel users have UserStatus.Offline although everyone is online

我所要做的就是启用存在意图

enter image description here

因此,当取消静音用户的静音时,我会使用这样的代码

IGuildUser guildUser = null; // receive the user from somewhere
SocketGuildUser socketGuildUser = guildUser as SocketGuildUser;
bool userIsMuted = socketGuildUser.VoiceState?.IsMuted == true;
bool userNotOffline = socketGuildUser.Status != UserStatus.Offline;

if (userIsMuted && userNotOffline)
{
    await guildUser.ModifyAsync(guildUserProperties => guildUserProperties.Mute = false);
}

看来必须要进行离线检查,否则ModifyAsync方法会为离线用户抛出异常。