private void OnTopologyChange(object sender, XElement topologychangedXElement) { if (Topology != null) { var newTopology = topologychangedXElement.ToZoneGroups(); var noUpdateNeeded = newTopology.Any(nz => Topology.Any(oz => oz.Id == nz.Id)); if (noUpdateNeeded) { return; } } _topology = topologychangedXElement; _storage.Save(Tokens.ZoneGroupTopology, _topology); _messageBus.Send(new EventArgs(), Message.TopologyChanged); var query = topologychangedXElement.GetTopologyCoordinators(); // if we have no coordinator or the coordinator isnt present in the new topology update the coordinator if (CurrentCoordinator == null || query.SingleOrDefault(x => x.Uuid == CurrentCoordinator.Uuid) == null) { if (query.Any()) { var activeZoneMember = query.First(); // for now just take the first found. var z = Zones.FirstOrDefault(x => x.ZoneName == activeZoneMember.Title); CurrentCoordinator = new ZonePlayer(z); } } if (_pollTask == null) { _pollTask = Poll(); } }