Пример #1
0
        private Task <Guid> DoGameWalletOperation(Guid playerId, Func <Entities.Wallet, Transaction> walletAction)
        {
            var wallet = _repository.GetWalletWithUPDLock(playerId);

            var transaction = walletAction.Invoke(wallet);

            wallet.Events.ForEach(ev =>
                                  _serviceBus.PublishExternalMessage(ev)
                                  );

            return(Task.FromResult(transaction.Id));
        }
Пример #2
0
        private WalletOperationResult PerformFundOperation(Guid playerId, decimal amount, string transactionNumber, bool isFundIn)
        {
            using (var scope = CustomTransactionScope.GetTransactionScope())
            {
                var wallet = _repository.GetWalletWithUPDLock(playerId);

                var transaction = wallet.Data.Transactions.FirstOrDefault(x => x.TransactionNumber == transactionNumber);
                if (transaction != null)
                {
                    return(GetOperationResult(wallet, transaction, true));
                }

                transaction = isFundIn ? wallet.FundIn(amount, transactionNumber) : wallet.FundOut(amount, transactionNumber);

                _repository.SaveChanges();

                // PublishMessage has to know the exact event type!
                wallet.Events.ForEach(@event => _serviceBus.PublishExternalMessage(@event));

                scope.Complete();

                return(GetOperationResult(wallet, transaction, false));
            }
        }
Пример #3
0
        public async Task Process(IEnumerable <BusEvent> events, string playerToken, string brandCode, GameActionData actionData, string gameProviderCode)
        {
            if (_useRealUgs)
            {
                var client = _flycowApiClientProvider.GetApiClient();
                var token  = await _flycowApiClientProvider.GetApiToken(client);

                var gameEvents = events.OfType <GameEvent>();
                foreach (var ev in gameEvents)
                {
                    switch (ev.type)
                    {
                    case BusEventType.BetPlaced:
                        await client.PlaceBetAsync(GetBetRequest <PlaceBetRequest>(playerToken, ev, null), token);

                        break;

                    case BusEventType.BetFree:
                        await client.FreeBetAsync(GetBetRequest <FreeBetRequest>(playerToken, ev, (int)GameTransactionType.Free), token);

                        break;

                    case BusEventType.BetLost:
                        await client.LoseBetAsync(GetBetRequest <LoseBetRequest>(playerToken, ev, (int)GameTransactionType.Loss), token);

                        break;

                    case BusEventType.BetWon:
                        await client.WinBetAsync(GetBetRequest <WinBetRequest>(playerToken, ev, (int)GameTransactionType.Win), token);

                        break;

                    case BusEventType.BetAdjusted:
                        await client.AdjustTransactionAsync(GetBetRequest <AdjustTransactionRequest>(playerToken, ev, null), token);

                        break;

                    case BusEventType.BetTied:
                        await client.TieBetAsync(GetBetRequest <TieBetRequest>(playerToken, ev, (int)GameTransactionType.Tie), token);

                        break;

                    case BusEventType.GameActionCancelled:
                        await client.CancelTransaction(GetBetRequest <CancelTransactionRequest>(playerToken, ev, null), token);

                        break;
                    }
                }
            }
            else
            {
                events.ForEach(
                    @event =>
                {
                    var ev              = @event as GameEvent;
                    ev.brandcode        = brandCode;
                    ev.externalroundid  = actionData.RoundId;
                    ev.externalgameid   = actionData.ExternalGameId;
                    ev.gameprovidercode = gameProviderCode;

                    _serviceBus.PublishExternalMessage(ev);
                });
            }
        }