public async ValueTask <ConnectedClient> ConnectAsync(IConnection connection, CancellationToken cancellationToken) { if (!(await connection.ReceiveAsync(cancellationToken).ConfigureAwait(false) is Join join)) { throw new InvalidOperationException($"Could not connect: first message is not a valid {nameof(Join)} message."); } var playerId = new PlayerId(join.PlayerId); var player = _playerRepository.Find(playerId); if (player == null) { throw new InvalidOperationException($"Could not connect: could not find player {playerId}."); } var group = player.MessagingGroup; return(new ConnectedClient(playerId, connection, group, _updateDetector)); }
public object GetUpdateFor(string clientId) { var playerId = new PlayerId(clientId); var player = _playerRepository.Find(playerId); if (player == null) { throw new InvalidOperationException($"Player {playerId} is not found."); } var state = player.GetState(); if (state.RoadMovementState != null) { var playerPositions = _connectedClients.FindInGroups(player.MessagingGroup) .Select(client => { var playerId = new PlayerId(client.ClientId); var player = _playerRepository.Find(playerId); if (player == null) { throw new InvalidOperationException($"Player {playerId} is not found."); } return(player); }) .Select(p => ToPlayerPosition(p, state.RoadMovementState.MovementDirection)); return(new MovementUpdate( state.RoadMovementState.RoadId, playerPositions.Single(p => p.PlayerId == state.PlayerId), playerPositions.ToList())); } var visiblePlayerIds = _connectedClients.FindInGroups(player.MessagingGroup) .Select(client => client.ClientId) .ToList(); return(new Update(state.LocationId, visiblePlayerIds)); }