// GET api/GameState/5
        public GameState Get(int id)
        {
            var gameState = _gameStateRepository.Find(id);

            if (gameState == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }
            return(gameState);
        }
Beispiel #2
0
        public ApiResponse <IntentResponse> CreateCommands(IntentRequest req)
        {
            if (string.IsNullOrEmpty(req.ExpectedVersion))
            {
                return(new ClientError("invalid state version").AsError <IntentResponse>());
            }
            var user = _users.Find(req.Login);

            if (user == null)
            {
                _logger.Warning(this, $"Can't find user with login: '******'");
                return(new ServerError().AsError <IntentResponse>());
            }
            var state = _states.Find(user);

            if (state == null)
            {
                _logger.Warning(this, $"Can't find state for user with login: '******'");
                return(new ServerError().AsError <IntentResponse>());
            }
            if (state.Version != req.ExpectedVersion)
            {
                _logger.Warning(this, $"Current state version don't match expected version: '{state.Version}' != '{req.ExpectedVersion}'");
                return(new ConflictError($"Current state version is '{state.Version}'").AsError <IntentResponse>());
            }
            var config  = _config.Get();
            var command = req.Command;

            if (!IsValidAsFirstCommand(command))
            {
                return(new ClientError($"Trying to execute internal command: '{command}'").AsError <IntentResponse>());
            }
            var runner = new CommandRunner(_time.RealTime - state.Time.LastSyncTime, command, state, config);

            foreach (var item in runner)
            {
                if ((item.Command is IDebugCommand) && !_env.IsDebugMode)
                {
                    return(new ClientError($"Invalid debug command: '{item.Command}'").AsError <IntentResponse>());
                }
                if (!item.IsValid())
                {
                    return(new ClientError($"Invalid command: '{item.Command}'").AsError <IntentResponse>());
                }
                item.Execute();
            }
            var oldVersion = state.Version;

            state.UpdateVersion();
            state = _states.Save(user, state);
            _logger.Debug(this, $"State updated: version was '{oldVersion}', changed to '{state.Version}'");
            return(new IntentResponse(state.Version).AsResult());
        }