Пример #1
0
        private void CheckTransactionsStatuses()
        {
            if (_pendingTransactions.Count > 0)
            {
                for (int i = 0; i < _pendingTransactions.Count; i++)
                {
                    var    transaction             = _pendingTransactions[i];
                    int    transactionConnectionId = transaction.Sender.ConnectionId;
                    string playerMarketAccessToken = Model.GetPlayerMarketAccessToken(transactionConnectionId);

                    DMarketApi.CheckAsyncOperation(playerMarketAccessToken, transaction.OperationIds,
                                                   (response, request) =>
                    {
                        var answerMessage = new AppChangingItemsAnswerMessage(new ItemsChangingResponse());

                        foreach (var transactionItem in response.Items)
                        {
                            var status = _apiResponseAdapter.GetTransactionStatusType(transactionItem.status);
                            switch (status)
                            {
                            case DMarketTransactionStatusType.Fail:
                                {
                                    answerMessage.Response.MarketError = (ErrorCode)transactionItem.transferError.code;
                                    transaction.RemoveOperation(transactionItem.operationId);
                                    break;
                                }

                            case DMarketTransactionStatusType.Success:
                                {
                                    OnSuccessMarketOperation(transactionItem, transaction);
                                    transaction.RemoveOperation(transactionItem.operationId);
                                    break;
                                }
                            }
                        }

                        var transactionLog = string.Format("Transaction for connection: {0}, operation left: {1}", transaction.Sender.ConnectionId,
                                                           transaction.OperationsCount);
                        DevLogger.Log(transactionLog, DTanksLogChannel.GameServer);

                        if (transaction.OperationsCount == 0)
                        {
                            SendMessageToClient(answerMessage, transactionConnectionId);
                            _pendingTransactions.Remove(transaction);
                        }
                        Storage.Change(GetPlayer(transactionConnectionId));
                    },
                                                   error =>
                    {
                        foreach (var transactionInfo in _pendingTransactions)
                        {
                            OnItemOperationError(transactionInfo.Sender, error);
                        }
                        _pendingTransactions.Clear();
                    });
                }
            }
        }
        private void CheckTransactionsStatuses()
        {
            if (_pendingOperations.Count == 0)
            {
                return;
            }

            var transactionIds = _pendingOperations.Keys;

            DMarketApi.CheckAsyncOperation(Model.GetPlayerMarketAccessToken(_connectionId), transactionIds.ToArray(),
                                           (response, request) =>
            {
                foreach (var item in response.Items)
                {
                    string itemAssetId    = item.assetId;
                    string operationId    = item.operationId;
                    var transactionStatus = _apiResponseAdapter.GetTransactionStatusType(item.status);

                    switch (transactionStatus)
                    {
                    case DMarketTransactionStatusType.Fail:
                        _pendingOperations.Remove(operationId);
                        DevLogger.Error(string.Format("Transaction for item: {0} was failed.", itemAssetId));
                        break;

                    case DMarketTransactionStatusType.Pending:
                        break;

                    case DMarketTransactionStatusType.Success:
                        _pendingOperations.Remove(operationId);
                        _successItemsIds.Add(itemAssetId);
                        break;
                    }
                }

                if (_pendingOperations.Count == 0)
                {
                    if (_actionType == ItemActionType.FromMarket)
                    {
                        AddMovedItemsToInventory();
                    }
                    else
                    {
                        RemoveMovedItemsFromInventory();
                    }

                    SendLoadInventoryData();
                    Terminate();
                }
            },
                                           error =>
            {
                _pendingOperations.Clear();;
                OnItemOperationError(error);
            });
        }
        private void ReplaceItemsFromDMarket()
        {
            Dictionary <string, ItemInfo> itemsInfo = new Dictionary <string, ItemInfo>();

            foreach (var item in _bulkTransferItemsList)
            {
                var assetId = DMarketConverter.GetAssetId(item.WorldId);
                itemsInfo.Add(assetId, item);
            }

            switch (_actionType)
            {
            case ItemActionType.ToMarket:
            {
                var items = new AssetToMarketModel[_bulkTransferItemsList.Count];
                for (var i = 0; i < items.Length; i++)
                {
                    var classId = DMarketConverter.GetClassId(_bulkTransferItemsList[i].ItemType);
                    var assetId = DMarketConverter.GetAssetId(_bulkTransferItemsList[i].WorldId);
                    items[i] = new AssetToMarketModel
                    {
                        assetId = assetId,
                        classId = classId
                    };
                }

                DMarketApi.AsyncToMarket(Model.GetPlayerMarketAccessToken(_connectionId), items,
                                         (response, request) =>
                    {
                        foreach (var responseItem in response.Items)
                        {
                            _pendingOperations.Add(responseItem.OperationId, responseItem.AssetId);
                        }
                    },
                                         OnItemOperationError);
                break;
            }

            case ItemActionType.FromMarket:
            {
                var itemsIdsArray = itemsInfo.Keys.ToArray();
                DMarketApi.AsyncFromMarket(Model.GetPlayerMarketAccessToken(_connectionId), itemsIdsArray,
                                           (response, request) =>
                    {
                        foreach (var item in response.Items)
                        {
                            _pendingOperations.Add(item.OperationId, item.AssetId);
                        }
                    },
                                           OnItemOperationError);
                break;
            }
            }
        }
        private void OnItemChangingMsg(AppChangingItemsMessage message)
        {
            int connectionId = message.ConnectionId;

            if (message.ActionType != ItemActionType.ToMarket && message.ActionType != ItemActionType.FromMarket)
            {
                return;
            }

            if (!IsCanMakeDMarketOperation(message))
            {
                return;
            }

            var assetIds  = new List <string>();
            var itemsInfo = new Dictionary <string, ItemInfo>();

            for (var i = 0; i < message.ItemsCount; i++)
            {
                var assetId = DMarketConverter.GetAssetId(message.GetWorldId(i));
                assetIds.Add(assetId);
                itemsInfo.Add(assetId, new ItemInfo(message.GetWorldId(i), message.GetItemType(i)));
            }

            //TODO think about request generic...  now code is duplicated
            switch (message.ActionType)
            {
            case ItemActionType.ToMarket:
                var items = new AssetToMarketModel[assetIds.Count];
                for (var i = 0; i < items.Length; i++)
                {
                    var classId = DMarketConverter.GetClassId(message.GetItemType(i));
                    items[i] = new AssetToMarketModel {
                        assetId = assetIds[i],
                        classId = classId
                    };
                }
                DMarketApi.AsyncToMarket(Model.GetPlayerMarketAccessToken(connectionId), items,
                                         (response, request) => { AsyncMarketCallback(response.Items, message, itemsInfo); },
                                         error => { OnItemOperationError(message, error); });
                break;

            case ItemActionType.FromMarket:
                DMarketApi.AsyncFromMarket(Model.GetPlayerMarketAccessToken(connectionId), assetIds.ToArray(),
                                           (response, request) => { AsyncMarketCallback(response.Items, message, itemsInfo); },
                                           error => { OnItemOperationError(message, error); });
                break;
            }
        }
Пример #5
0
        private void OnLoadDMarketDataMsg(AppLoadDMarketDataMessage message)
        {
            int connectionId = message.ConnectionId;

            if (!IsCanMakeDMarketOperation(connectionId))
            {
                return;
            }

            DMarketApi.GetInMarketInventory(Model.GetPlayerMarketAccessToken(connectionId),
                                            (response, request) =>
            {
                PlayerInfo playerInfo = GetPlayer(connectionId);

                PlayerInventoryInfo inventory = GetInventory(connectionId);
                playerInfo.Inventory          = inventory;
                inventory.RemoveAllDMarketItems();

                foreach (var item in response.Items)
                {
                    GameItemType itemType = DMarketConverter.GetItemType(item.classId);
                    long worldId          = DMarketConverter.GetWorldId(item.assetId);

                    PlayerItemInfo dmarketItem = new PlayerItemInfo(itemType, worldId, true);
                    inventory.AddItem(dmarketItem);
                }

                Storage.Change(playerInfo);

                SendDmarketDataUpdateAnswer(connectionId);
            },
                                            error =>
            {
                if (error.ErrorCode == ErrorCode.DMarketTokenExpired)
                {
                    RefreshMarketToken(connectionId, () => OnLoadDMarketDataMsg(message),
                                       errorParam => SendLoadDMarketLoadDataError(connectionId, errorParam));
                    return;
                }

                SendLoadDMarketLoadDataError(connectionId, error.ErrorCode);
            });
        }
Пример #6
0
        private void OnGetGameTokenMsg(AppGetGameTokenMessage message)
        {
            var answer = new AppGetGameTokenAnswerMessage();

            DMarketApi.GetBasicAccessToken(message.UserId,
                                           (response, requestParams) =>
            {
                answer.Response = new DMarketGameTokenResponse(response.token,
                                                               response.refreshToken);
                SendMessageToClient(answer, message.ConnectionId);
            },
                                           error =>
            {
                DevLogger.Warning(string.Format("Get marketWidget token error: code: {0}, message:" +
                                                " {1}", error.ErrorCode, error.ErrorMessage));
                answer.Error = NetworkMessageErrorType.DMarketError;
                SendMessageToClient(answer, message.ConnectionId);
            });
        }
Пример #7
0
        private void OnLoadInventoryBasicIntegration(InventoryBasicIntegrationMessage message)
        {
            int connectionId = message.ConnectionId;

            if (!IsCanMakeDMarketOperation(connectionId))
            {
                return;
            }

            DMarketApi.GetInMarketInventory(Model.GetPlayerMarketAccessToken(connectionId),
                                            (response, request) =>
            {
                List <ItemInfo> itemsList = new List <ItemInfo>();
                foreach (var item in response.Items)
                {
                    GameItemType itemType = DMarketConverter.GetItemType(item.classId);
                    long worldId          = DMarketConverter.GetWorldId(item.assetId);

                    ItemInfo dmarketItem = new ItemInfo(worldId, itemType);
                    itemsList.Add(dmarketItem);
                }

                if (itemsList.Count == 0)
                {
                    SendLoadInventoryData(connectionId);
                    return;
                }

                ApplyCommand(new ServerBulkTransferInventoryBasicIntegrationCommand(itemsList, ItemActionType.FromMarket, connectionId));
            },
                                            error =>
            {
                if (error.ErrorCode == ErrorCode.DMarketTokenExpired)
                {
                    RefreshMarketToken(connectionId, () => OnLoadInventoryBasicIntegration(message),
                                       errorCode => SendLoadInventoryData(connectionId, errorCode));
                    return;
                }

                SendLoadInventoryData(connectionId, error.ErrorCode);
            });
        }