internal bool IsMember(VoiceClient voiceClient)
 {
     lock (_members)
     {
         return(_members.Any(m => m.VoiceClient == voiceClient));
     }
 }
 internal void AddMember(VoiceClient voiceClient, bool isPrimary)
 {
     lock (_members)
     {
         if (_members.Any(m => m.VoiceClient == voiceClient))
         {
             return;
         }
         _members.Add(new RadioChannelMember(this, voiceClient, isPrimary));
         voiceClient.Player.EmitLocked("SaltyChat:RadioSetChannel", Name, isPrimary);
         foreach (var member in _members.Where(m => m.IsSending))
         {
             voiceClient.Player.EmitLocked("SaltyChat:PlayerIsSending", member.VoiceClient.Player, Name, true, false, member.VoiceClient.Player.Position);
         }
     }
 }
        internal void SetSpeaker(VoiceClient voiceClient, bool isEnabled)
        {
            List <RadioChannelMember> radioChannelMembers;

            lock (_members)
            {
                radioChannelMembers = _members;
            }
            var radioChannelMember = radioChannelMembers.FirstOrDefault(m => m.VoiceClient == voiceClient);

            if (radioChannelMember == null || radioChannelMember.IsSpeakerEnabled == isEnabled)
            {
                return;
            }

            radioChannelMember.IsSpeakerEnabled = isEnabled;
            var sendingMembers = radioChannelMembers.Where(m => m.IsSending).ToArray();

            if (!sendingMembers.Any())
            {
                return;
            }
            if (isEnabled || radioChannelMembers.Any(m => m.IsSpeakerEnabled))
            {
                foreach (var sendingMember in sendingMembers)
                {
                    Send(sendingMember.VoiceClient, true);
                }
            }
            else
            {
                foreach (var sendingMember in sendingMembers)
                {
                    foreach (var client in VoiceManager.Instance.VoiceClients.Where(v => radioChannelMembers.All(m => m.VoiceClient != v)))
                    {
                        client.Player.EmitLocked("SaltyChat:PlayerIsSendingRelayed", sendingMember.VoiceClient.Player, Name, false, false, sendingMember.VoiceClient.Player.Position, false, new string[0]);
                    }
                }
            }
        }
        internal void RemoveMember(VoiceClient voiceClient)
        {
            lock (_members)
            {
                var member = _members.FirstOrDefault(m => m.VoiceClient == voiceClient);
                if (member == null)
                {
                    return;
                }
                if (member.IsSending)
                {
                    if (member.VoiceClient.IsRadioSpeakerEnabled)
                    {
                        foreach (var client in VoiceManager.Instance.VoiceClients)
                        {
                            client.Player.EmitLocked("SaltyChat:PlayerIsSendingRelayed", voiceClient.Player, Name, false, true, voiceClient.Player.Position, false, Array.Empty <string>());
                        }
                    }
                    else
                    {
                        foreach (var client in VoiceManager.Instance.VoiceClients)
                        {
                            client.Player.EmitLocked("SaltyChat:PlayerIsSending", voiceClient.Player, Name, false, true, voiceClient.Player.Position);
                        }
                    }
                }

                _members.Remove(member);

                foreach (var channelMember in _members.Where(m => m.IsSending))
                {
                    voiceClient.Player.EmitLocked("SaltyChat:PlayerIsSending", channelMember.VoiceClient.Player, Name, false, false, channelMember.VoiceClient.Player.Position);
                }

                voiceClient.Player.EmitLocked("SaltyChat:RadioLeaveChannel", null, member.IsPrimary);
            }
        }
        internal void Send(VoiceClient voiceClient, bool isSending)
        {
            RadioChannelMember radioChannelMember;

            lock (_members)
            {
                radioChannelMember = _members.FirstOrDefault(m => m.VoiceClient == voiceClient);
            }
            if (radioChannelMember == null)
            {
                return;
            }

            var stateChanged = radioChannelMember.IsSending != isSending;

            radioChannelMember.IsSending = isSending;

            var channelMembers = Members;
            var onSpeaker      = channelMembers.Where(m => m.VoiceClient.IsRadioSpeakerEnabled && m.VoiceClient != voiceClient).ToArray();

            if (onSpeaker.Length > 0)
            {
                var channelMemberNames = onSpeaker.Select(m => m.VoiceClient.TeamSpeakName).ToArray();
                foreach (var remoteClient in VoiceManager.Instance.VoiceClients)
                {
                    remoteClient.Player.EmitLocked("SaltyChat:PlayerIsSendingRelayed", voiceClient.Player, Name, isSending, stateChanged, voiceClient.Player.Position, IsMember(remoteClient), channelMemberNames);
                }
            }
            else
            {
                foreach (var member in channelMembers)
                {
                    member.VoiceClient.Player.EmitLocked("SaltyChat:PlayerIsSending", voiceClient.Player, Name, isSending, stateChanged, voiceClient.Player.Position);
                }
            }
        }