public IEnumerator ReplaceGameRecord(string @namespace, string accessToken, string key,
                                             ConcurrentReplaceRequest data, ResultCallback callback, Action callbackOnConflictedData = null)
        {
            Assert.IsNotNull(@namespace, nameof(@namespace) + " cannot be null");
            Assert.IsNotNull(accessToken, nameof(accessToken) + " cannot be null");
            Assert.IsNotNull(key, nameof(key) + " cannot be null");
            Assert.IsNotNull(data, nameof(data) + " cannot be null");

            var request = HttpRequestBuilder
                          .CreatePut(this.baseUrl + "/v1/namespaces/{namespace}/concurrent/records/{key}")
                          .WithPathParam("namespace", @namespace)
                          .WithPathParam("key", key)
                          .WithBearerAuth(accessToken)
                          .WithBody(data.ToUtf8Json())
                          .WithContentType(MediaType.ApplicationJson)
                          .Accepts(MediaType.ApplicationJson)
                          .GetResult();

            IHttpResponse response = null;

            yield return(this.httpClient.SendRequest(request, rsp => response = rsp));

            var result = response.TryParse();

            if (result.IsError && result.Error.Code == ErrorCode.GameRecordPreconditionFailed && callbackOnConflictedData != null)
            {
                callbackOnConflictedData?.Invoke();
            }
            else
            {
                callback.Try(result);
            }
        }
Example #2
0
        private void ReplaceUserRecordRecursive(int remainingAttempt, string key, Dictionary <string, object> recordRequest, ResultCallback callback, Func <Dictionary <string, object>, Dictionary <string, object> > payloadModifier)
        {
            if (remainingAttempt <= 0)
            {
                callback.TryError(new Error(ErrorCode.PreconditionFailed, "Exhaust all retry attempt to modify game record. Please try again."));
                return;
            }

            GetUserRecord(key, getUserRecordResult =>
            {
                var updateRequest = new ConcurrentReplaceRequest();
                if (getUserRecordResult.IsError)
                {
                    if (getUserRecordResult.Error.Code == ErrorCode.PlayerRecordNotFound)
                    {
                        updateRequest.value     = recordRequest;
                        updateRequest.updatedAt = DateTime.Now;

                        this.coroutineRunner.Run(
                            this.api.ReplaceUserRecord(
                                this.@namespace,
                                this.session.UserId,
                                this.session.AuthorizationToken,
                                key,
                                updateRequest,
                                callback,
                                () =>
                        {
                            ReplaceUserRecordRecursive(remainingAttempt - 1, key, recordRequest, callback, payloadModifier);
                        }));
                    }
                    else
                    {
                        callback.TryError(getUserRecordResult.Error);
                    }
                }
                else
                {
                    getUserRecordResult.Value.value = payloadModifier(getUserRecordResult.Value.value);

                    updateRequest.value     = getUserRecordResult.Value.value;
                    updateRequest.updatedAt = getUserRecordResult.Value.updated_at;

                    this.coroutineRunner.Run(
                        this.api.ReplaceUserRecord(
                            this.@namespace,
                            this.session.UserId,
                            this.session.AuthorizationToken,
                            key,
                            updateRequest,
                            callback,
                            () =>
                    {
                        ReplaceUserRecordRecursive(remainingAttempt - 1, key, recordRequest, callback, payloadModifier);
                    }));
                }
            });
        }
Example #3
0
        /// <summary>
        /// Replace a record in namespace-level. If the record doesn't exist, it will create and save the record. If already exists, it will replace the existing one, but will failed if lastUpdated is not up-to-date.
        /// </summary>
        /// <param name="key">Key of record</param>
        /// <param name="lastUpdated">last time the record is updated. Retrieve it from GetGameRecord.</param>
        /// <param name="recordRequest">The request of the record with JSON formatted.</param>
        /// <param name="callback">Returns a Result via callback when completed</param>
        public void ReplaceGameRecordCheckLatest(string key, DateTime lastUpdated, Dictionary <string, object> recordRequest, ResultCallback callback)
        {
            Assert.IsFalse(string.IsNullOrEmpty(key), "Key should not be null.");
            Assert.IsNotNull(recordRequest, "RecordRequest should not be null.");

            Report.GetFunctionLog(this.GetType().Name);

            if (!this.session.IsValid())
            {
                callback.TryError(ErrorCode.IsNotLoggedIn);

                return;
            }

            ConcurrentReplaceRequest request = new ConcurrentReplaceRequest
            {
                updatedAt = lastUpdated,
                value     = recordRequest
            };

            this.coroutineRunner.Run(this.api.ReplaceGameRecord(this.@namespace, this.session.AuthorizationToken, key, request, callback));
        }