/// <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(); } }
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; } }