Пример #1
0
        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));
        }
Пример #2
0
        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));
        }