Ejemplo n.º 1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void SocketClient_ReceivedEvent(object sender, EventArgs e)
        {
            byte[] bs = this.SocketClient.ReceivedBytes;

            RainRequest q;
            bool        b = RainRequest.Parse(bs, out q);

            if (b)
            {
                string s = string.Format("请求 '{0}' 数据", q.LastDateTime);
                Logger.Log(s);

                DataTable tbl = App.Default.DB.GetRainDataTable(q.LastDateTime);

                RainResponse response = new RainResponse(q.Address);
                response.RainDataTable = tbl;
                byte[] bsR = response.ToBytes();

                System.Diagnostics.Debug.Assert(bsR.Length == 68, "len != 68");

                try
                {
                    this.SocketClient.Send(bsR);
                }
                catch (Exception ex)
                {
                    Logger.Log(ex.Message);
                    return;
                }

                string sendmsg = string.Format("发送 '{0}' 条数据", tbl.Rows.Count);
                Logger.Log(sendmsg);
            }
        }
        async Task <TxTestResult[]> Rain(decimal amount, User fromUser, User[] toUsers, bool writeOutput = true)
        {
            var dbContext = TestUtils.CreateDatabase();

            try
            {
                List <TxTestResult> results = new List <TxTestResult>();
                List <string>       toList  = new List <string>();
                for (int i = 0; i < toUsers.Length; i++)
                {
                    var res = new TxTestResult();
                    res.Amount           = amount;
                    res.FromUserId       = fromUser.UserId;
                    res.ToUserId         = toUsers[i].UserId;
                    res.FromStartBalance = fromUser.UserWallet.Balance.Value;
                    res.ToStartBalance   = toUsers[i].UserWallet.Balance.Value;
                    toList.Add("twitch|" + toUsers[i].UserIdentity.TwitchId);
                    results.Add(res);
                }

                var txController = new TxController(dbContext);
                var request      = new RainRequest();
                request.Columns  = new string[] { "twitchid" };
                request.Amount   = amount;
                request.Platform = "twitch";

                request.From = "twitch|" + fromUser.UserIdentity.TwitchId;
                request.To   = toList.ToArray();

                var response = (await txController.Rain(request));
                using (var dbContext2 = TestUtils.CreateDatabase())
                {
                    var fromEnd = dbContext2.TwitchQuery(fromUser.UserIdentity.TwitchId).FirstOrDefault().UserWallet.Balance;//(decimal)responseData[0].From[nameof(UserWallet.Balance).ToLower()];

                    foreach (var result in results)
                    {
                        if (writeOutput)
                        {
                            result.FromEndBalance = fromEnd.Value;

                            var toEnd = dbContext2.TwitchQuery(toUsers.FirstOrDefault(u => u.UserId == result.ToUserId).UserIdentity.TwitchId).FirstOrDefault().UserWallet.Balance;
                            result.ToEndBalance = toEnd.Value;
                        }
                        result.ResponseObject = response;
                    }
                }
                return(results.ToArray());
            }
            finally
            {
                dbContext.Dispose();
            }
        }
Ejemplo n.º 3
0
        public async Task <ActionResult <TxReceipt[]> > Rain([FromBody] RainRequest rainRequest)
        {
            try
            {
                if (rainRequest == null)
                {
                    throw new ArgumentNullException();
                }
                if (rainRequest.From == null)
                {
                    throw new ArgumentNullException();
                }
                if (rainRequest.To == null)
                {
                    throw new ArgumentNullException();
                }
                if (rainRequest.Amount <= 0)
                {
                    return(StatusCode((int)HttpStatusCode.BadRequest));
                }

                var processInfo = await TxUtils.ProcessRequest(rainRequest, _dbContext);

                var transactions = processInfo.Transactions;
                if (transactions != null && transactions.Length > 0)
                {
                    StringBuilder sql = new StringBuilder();
                    if (processInfo.WriteTransactionOutput(sql))
                    {
                        string pk         = nameof(UserStat.UserId);
                        string table      = nameof(UserStat);
                        var    recipients = processInfo.ValidRecipients;
                        var    fromId     = transactions[0].From.UserId;

                        var recipientStats = new List <ColumnValuePair>();
                        recipientStats.Add(new ColumnValuePair(nameof(UserStat.RainedOn), 1));
                        recipientStats.Add(new ColumnValuePair(nameof(UserStat.RainedOnTotal), rainRequest.Amount));

                        sql.Append(TxUtils.ModifyNumbers(table, recipientStats, '+', pk, recipients));
                        sql.Append(TxUtils.UpdateNumberIfTop(table, nameof(UserStat.TopRainedOn), rainRequest.Amount, pk, recipients));

                        var senderStats = new List <ColumnValuePair>();
                        senderStats.Add(new ColumnValuePair(nameof(UserStat.Rained), 1));
                        senderStats.Add(new ColumnValuePair(nameof(UserStat.RainTotal), processInfo.TotalAmount));

                        sql.Append(TxUtils.ModifyNumbers(table, senderStats, '+', pk, fromId));
                        sql.Append(TxUtils.UpdateNumberIfTop(table, nameof(UserStat.TopRain), processInfo.TotalAmount, pk, fromId));

                        await _dbContext.Database.ExecuteSqlRawAsync(sql.ToString());

                        await _dbContext.SaveAsync(IsolationLevel.RepeatableRead);
                    }
                    await TxUtils.AppendTxs(transactions, _dbContext, rainRequest.Columns);
                }
                return(processInfo.Transactions);
            }
            catch (Exception e)
            {
                await BITCORNLogger.LogError(_dbContext, e);

                throw e;
            }
        }