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))); } } } }
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); }
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"); } } }
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()); } } } } }
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); } } } }
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); } }