コード例 #1
0
        private void HandleClientMetaDataUpdate(SRSClientSession session, NetworkMessage message, bool send)
        {
            if (_clients.ContainsKey(message.Client.ClientGuid))
            {
                var client = _clients[message.Client.ClientGuid];

                if (client != null)
                {
                    bool redrawClientAdminList = client.Name != message.Client.Name || client.Coalition != message.Client.Coalition;

                    //copy the data we need
                    client.LastUpdate     = DateTime.Now.Ticks;
                    client.Name           = message.Client.Name;
                    client.Coalition      = message.Client.Coalition;
                    client.LatLngPosition = message.Client.LatLngPosition;
                    client.Seat           = message.Client.Seat;

                    //send update to everyone
                    //Remove Client Radio Info
                    var replyMessage = new NetworkMessage
                    {
                        MsgType = NetworkMessage.MessageType.UPDATE,
                        Client  = new SRClient
                        {
                            ClientGuid     = client.ClientGuid,
                            Coalition      = client.Coalition,
                            Name           = client.Name,
                            LatLngPosition = client.LatLngPosition,
                            Seat           = client.Seat
                        }
                    };

                    if (send)
                    {
                        MulticastAllExeceptOne(replyMessage.Encode(), session.Id);
                    }

                    // Only redraw client admin UI of server if really needed
                    if (redrawClientAdminList)
                    {
                        _eventAggregator.PublishOnUIThread(new ServerStateMessage(true,
                                                                                  new List <SRClient>(_clients.Values)));
                    }
                }
            }
        }
コード例 #2
0
        private bool HandleConnectedClient(SRSClientSession state, NetworkMessage message)
        {
            var srClient = message.Client;

            if (!_clients.ContainsKey(srClient.ClientGuid))
            {
                var clientIp = (IPEndPoint)state.Socket.RemoteEndPoint;
                if (message.Version == null)
                {
                    Logger.Warn("Disconnecting Unversioned Client -  " + clientIp.Address + " " +
                                clientIp.Port);
                    state.Disconnect();
                    return(false);
                }

                var clientVersion   = Version.Parse(message.Version);
                var protocolVersion = Version.Parse(UpdaterChecker.MINIMUM_PROTOCOL_VERSION);

                if (clientVersion < protocolVersion)
                {
                    Logger.Warn(
                        $"Disconnecting Unsupported  Client Version - Version {clientVersion} IP {clientIp.Address} Port {clientIp.Port}");
                    HandleVersionMismatch(state);

                    //close socket after
                    state.Disconnect();

                    return(false);
                }

                srClient.ClientSession = state;

                //add to proper list
                _clients[srClient.ClientGuid] = srClient;

                state.SRSGuid = srClient.ClientGuid;


                _eventAggregator.PublishOnUIThread(new ServerStateMessage(true,
                                                                          new List <SRClient>(_clients.Values)));
            }

            return(true);
        }
コード例 #3
0
        private void HandleClientRadioUpdate(SRSClientSession session, NetworkMessage message)
        {
            if (_clients.ContainsKey(message.Client.ClientGuid))
            {
                var client = _clients[message.Client.ClientGuid];

                if (client != null)
                {
                    //update to local ticks
                    message.Client.RadioInfo.LastUpdate = DateTime.Now.Ticks;

                    client.LastUpdate     = DateTime.Now.Ticks;
                    client.Name           = message.Client.Name;
                    client.Coalition      = message.Client.Coalition;
                    client.RadioInfo      = message.Client.RadioInfo;
                    client.Position       = message.Client.Position;
                    client.LatLngPosition = message.Client.LatLngPosition;

                    //    _logger.Info("Received Radio Update");
                }
            }
        }
コード例 #4
0
        private void HandleClientRadioUpdate(SRSClientSession session, NetworkMessage message, bool send)
        {
            if (_clients.ContainsKey(message.Client.ClientGuid))
            {
                var client = _clients[message.Client.ClientGuid];

                if (client != null)
                {
                    //shouldnt be the case but just incase...
                    if (message.Client.RadioInfo == null)
                    {
                        message.Client.RadioInfo = new DCSPlayerRadioInfo();
                    }
                    //update to local ticks
                    message.Client.RadioInfo.LastUpdate = DateTime.Now.Ticks;

                    var changed = false;

                    if (client.RadioInfo == null)
                    {
                        client.RadioInfo = message.Client.RadioInfo;
                        changed          = true;
                    }
                    else
                    {
                        changed = !client.RadioInfo.Equals(message.Client.RadioInfo);
                    }


                    if (!changed)
                    {
                        changed = client.Name != message.Client.Name || client.Coalition != message.Client.Coalition ||
                                  !message.Client.LatLngPosition.Equals(client.LatLngPosition) ||
                                  message.Client.Seat != client.Seat;
                    }

                    client.LastUpdate     = DateTime.Now.Ticks;
                    client.Name           = message.Client.Name;
                    client.Coalition      = message.Client.Coalition;
                    client.Seat           = message.Client.Seat;
                    client.RadioInfo      = message.Client.RadioInfo;
                    client.LatLngPosition = message.Client.LatLngPosition;
                    client.Seat           = message.Client.Seat;

                    TimeSpan lastSent = new TimeSpan(DateTime.Now.Ticks - client.LastRadioUpdateSent);

                    //send update to everyone
                    //Remove Client Radio Info
                    if (send)
                    {
                        NetworkMessage replyMessage;
                        if ((changed || lastSent.TotalSeconds > 180))
                        {
                            client.LastRadioUpdateSent = DateTime.Now.Ticks;
                            replyMessage = new NetworkMessage
                            {
                                MsgType = NetworkMessage.MessageType.RADIO_UPDATE,
                                Client  = new SRClient
                                {
                                    ClientGuid     = client.ClientGuid,
                                    Coalition      = client.Coalition,
                                    Name           = client.Name,
                                    LatLngPosition = client.LatLngPosition,
                                    RadioInfo      = client.RadioInfo, //send radio info
                                    Seat           = client.Seat
                                }
                            };
                            Multicast(replyMessage.Encode());
                        }
                    }
                }
            }
        }
コード例 #5
0
        private void HandleClientRadioUpdate(SRSClientSession session, NetworkMessage message, bool send)
        {
            if (_clients.ContainsKey(message.Client.ClientGuid))
            {
                var client = _clients[message.Client.ClientGuid];

                if (client != null)
                {
                    //shouldnt be the case but just incase...
                    if (message.Client.RadioInfo == null)
                    {
                        message.Client.RadioInfo = new DCSPlayerRadioInfo();
                    }
                    //update to local ticks
                    message.Client.RadioInfo.LastUpdate = DateTime.Now.Ticks;

                    var changed = false;

                    if (client.RadioInfo == null)
                    {
                        client.RadioInfo = message.Client.RadioInfo;
                        changed          = true;
                    }
                    else
                    {
                        changed = !client.RadioInfo.Equals(message.Client.RadioInfo);
                    }

                    client.LastUpdate     = DateTime.Now.Ticks;
                    client.Name           = message.Client.Name;
                    client.Coalition      = message.Client.Coalition;
                    client.RadioInfo      = message.Client.RadioInfo;
                    client.LatLngPosition = message.Client.LatLngPosition;

                    TimeSpan lastSent = new TimeSpan(DateTime.Now.Ticks - client.LastRadioUpdateSent);

                    //send update to everyone
                    //Remove Client Radio Info
                    if (send)
                    {
                        NetworkMessage replyMessage;
                        if ((changed || lastSent.TotalSeconds > 60))
                        {
                            client.LastRadioUpdateSent = DateTime.Now.Ticks;
                            replyMessage = new NetworkMessage
                            {
                                MsgType        = NetworkMessage.MessageType.RADIO_UPDATE,
                                ServerSettings = _serverSettings.ToDictionary(),
                                Client         = new SRClient
                                {
                                    ClientGuid     = client.ClientGuid,
                                    Coalition      = client.Coalition,
                                    Name           = client.Name,
                                    LastUpdate     = client.LastUpdate,
                                    LatLngPosition = client.LatLngPosition,
                                    RadioInfo      = client.RadioInfo //send radio info
                                }
                            };
                        }
                        else
                        {
                            replyMessage = new NetworkMessage
                            {
                                MsgType        = NetworkMessage.MessageType.RADIO_UPDATE,
                                ServerSettings = _serverSettings.ToDictionary(),
                                Client         = new SRClient
                                {
                                    ClientGuid     = client.ClientGuid,
                                    Coalition      = client.Coalition,
                                    Name           = client.Name,
                                    LastUpdate     = client.LastUpdate,
                                    LatLngPosition = client.LatLngPosition,
                                    RadioInfo      = null //send radio update will null indicating no change
                                }
                            };
                        }

                        MulticastAllExeceptOne(replyMessage.Encode(), session.Id);
                    }
                }
            }
        }
コード例 #6
0
        public void HandleMessage(SRSClientSession state, NetworkMessage message)
        {
            try
            {
                //  logger.Info("Received From " + clientIp.Address + " " + clientIp.Port);
                // logger.Info("Recevied: " + message.MsgType);

                switch (message.MsgType)
                {
                case NetworkMessage.MessageType.PING:
                    // Do nothing for now
                    break;

                case NetworkMessage.MessageType.UPDATE:
                    HandleClientMetaDataUpdate(state, message, true);
                    break;

                case NetworkMessage.MessageType.RADIO_UPDATE:
                    bool showTuned = _serverSettings.GetGeneralSetting(ServerSettingsKeys.SHOW_TUNED_COUNT)
                                     .BoolValue;
                    HandleClientMetaDataUpdate(state, message, !showTuned);
                    HandleClientRadioUpdate(state, message, showTuned);
                    break;

                case NetworkMessage.MessageType.SYNC:

                    var srClient = message.Client;
                    if (!_clients.ContainsKey(srClient.ClientGuid))
                    {
                        var clientIp = (IPEndPoint)state.Socket.RemoteEndPoint;
                        if (message.Version == null)
                        {
                            _logger.Warn("Disconnecting Unversioned Client -  " + clientIp.Address + " " +
                                         clientIp.Port);
                            state.Disconnect();
                            return;
                        }

                        var clientVersion   = Version.Parse(message.Version);
                        var protocolVersion = Version.Parse(UpdaterChecker.MINIMUM_PROTOCOL_VERSION);

                        if (clientVersion < protocolVersion)
                        {
                            _logger.Warn(
                                $"Disconnecting Unsupported  Client Version - Version {clientVersion} IP {clientIp.Address} Port {clientIp.Port}");
                            HandleVersionMismatch(state);

                            //close socket after
                            state.Disconnect();

                            return;
                        }

                        srClient.ClientSession = state;

                        //add to proper list
                        _clients[srClient.ClientGuid] = srClient;

                        state.SRSGuid = srClient.ClientGuid;

                        _eventAggregator.PublishOnUIThread(new ServerStateMessage(true,
                                                                                  new List <SRClient>(_clients.Values)));
                    }

                    HandleRadioClientsSync(state, message, srClient);

                    break;

                case NetworkMessage.MessageType.SERVER_SETTINGS:
                    HandleServerSettingsMessage();
                    break;

                case NetworkMessage.MessageType.EXTERNAL_AWACS_MODE_PASSWORD:
                    HandleExternalAWACSModePassword(state, message.ExternalAWACSModePassword, message.Client);
                    break;

                case NetworkMessage.MessageType.EXTERNAL_AWACS_MODE_DISCONNECT:
                    HandleExternalAWACSModeDisconnect(state, message.Client);
                    break;

                default:
                    _logger.Warn("Recevied unknown message type");
                    break;
                }
            }
            catch (Exception ex)
            {
                _logger.Error(ex, "Exception Handling Message " + ex.Message);
            }
        }