微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 guildUserProperties.Mute 设置为 false 时,Bot 不会取消用户静音

如何解决将 guildUserProperties.Mute 设置为 false 时,Bot 不会取消用户静音

我使用 discord.Net 创建了一个 discord 机器人,它观察来自多个公会的多个语音频道。我正在侦听 UserVoiceStateUpdated 事件,因为每当用户加入观察到的已静音的语音频道时,该用户应该被机器人静音。每当用户离开观察到的语音频道时,用户应该取消静音。

我有一个内存缓存,用于保存所有观察到的语音通道的信息。每个信息对象提供这些信息

public class ObservedVoiceChannelInfo
{
    public ulong VoiceChannelId { get; set; }
    public bool Muted { get; set; }
    public List<ulong> MutedUserIds { get; set; } = new List<ulong>();
}

对于活动部分,我考虑了以下几点:

  • 如果用户离开观察到的处于静音状态的语音通道,则该用户应该被机器人取消静音
  • 如果用户加入观察到的语音频道,该频道处于静音状态,则该用户应该被机器人静音

基本上我想要实现的是:如果有人加入观察到的静音语音频道,请将该用户静音。如果该用户离开此频道,则在状态为静音的情况下取消静音。

这是我当前的实现(observedVoiceChannelsCache 是具有观察语音通道的内存缓存字典)

    private async Task OnUserVoiceStateUpdated(SocketUser socketUser,SocketVoiceState oldSocketVoiceState,SocketVoiceState newSocketVoiceState)
    {
        SocketGuildUser socketGuildUser = socketUser as SocketGuildUser;

        if (newSocketVoiceState.IsMuted &&
            newSocketVoiceState.VoiceChannel == null &&
            _observedVoiceChannelsCache.TryGetValue(oldSocketVoiceState.VoiceChannel.Id,out ObservedVoiceChannelInfo oldobservedVoiceChannelInfo) &&
            oldobservedVoiceChannelInfo.Muted)
        {
            bool userRemovedFromMuteList = oldobservedVoiceChannelInfo.MutedUserIds.Remove(socketGuildUser.Id);

            if (userRemovedFromMuteList)
                await SetUserVoiceState(socketGuildUser,false);
        }
        else if (!newSocketVoiceState.IsMuted &&
                 newSocketVoiceState.VoiceChannel != null &&
                 _observedVoiceChannelsCache.TryGetValue(newSocketVoiceState.VoiceChannel.Id,out ObservedVoiceChannelInfo newObservedVoiceChannelInfo) &&
                 newObservedVoiceChannelInfo.Muted)
        {
            await SetUserVoiceState(socketGuildUser,true);
            newObservedVoiceChannelInfo.MutedUserIds.Add(socketGuildUser.Id);
        }
    }

    private async Task SetUserVoiceState(SocketGuildUser socketGuildUser,bool muted)
    {
        await socketGuildUser.ModifyAsync(guildUserProperties => { guildUserProperties.Mute = muted; });
    }

else 块似乎工作正常(加入观察到的静音频道)。但是第一个 if 块(离开观察到的静音通道)不起作用。用户从列表中删除,但当使用 SetUserVoiceState 调用 false 时,用户不会被机器人取消静音。我可以通过加入观察到的静音语音通道,离开它并加入另一个未观察到的语音通道来重现它。那我还是静音了。

有人知道这里缺少什么吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。