问题描述
我正在使用 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
我所要做的就是启用存在意图
因此,当取消静音用户的静音时,我会使用这样的代码
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
方法会为离线用户抛出异常。