private async Task <ActionResult> SpinCAsync() { if (_wheelConfig.Value.WheelCLPCost <= 0 || _wheelConfig.Value.WheelCPrizes.Count == 0) { return(BadRequest()); } var user = await _userManager.GetUserAsync(User); var success = await TrySpendLPAsync(user, _wheelConfig.Value.WheelCLPCost); if (!success) { return(BadRequest(new { err = "not enough lp" })); } var prize = DrawPrize(_wheelConfig.Value.WheelCPrizes); var v = new UserVoucher { VoucherID = Guid.NewGuid(), VoucherKind = UserVoucher.Kind.WheelC, IssueTime = DateTime.Now, UserID = user.Id, UseTime = DateTime.Now, RedeemItem = prize.PrizeName, }; _udb.UserVouchers.Add(v); SpinWheelResult result = await ProcessPrizeAsync(user, prize); await _udb.SaveChangesAsync(); return(Json(result)); }
private async Task <ActionResult> SpinAAsync() { if (_wheelConfig.Value.WheelACost <= 0 || _wheelConfig.Value.WheelAPrizes.Count == 0) { return(BadRequest()); } var user = await _userManager.GetUserAsync(User); var todayDrawCount = await _udb.UserVouchers .Where(v => v.UserID == user.Id && v.VoucherKind == UserVoucher.Kind.WheelA && DbFunctions.DiffDays(v.IssueTime, DateTime.Today) == 0) .CountAsync(); if (todayDrawCount >= 3 && !User.IsInRole("AdManager") && !User.IsInRole("Administrator")) { return(BadRequest(new { drawCount = todayDrawCount })); } if (user.Points < _wheelConfig.Value.WheelACost) { return(BadRequest(new { points = user.Points })); } _expUtil.AddPoint(user, -_wheelConfig.Value.WheelACost); var prize = DrawPrize(_wheelConfig.Value.WheelAPrizes); var v = new UserVoucher { VoucherID = Guid.NewGuid(), VoucherKind = UserVoucher.Kind.WheelA, IssueTime = DateTime.Now, UserID = user.Id, UseTime = DateTime.Now, RedeemItem = prize.PrizeName, }; _udb.UserVouchers.Add(v); SpinWheelResult result = await ProcessPrizeAsync(user, prize); await _udb.SaveChangesAsync(); return(Json(result)); }
private async Task <SpinWheelResult> ProcessPrizeAsync(UserProfile user, WheelPrize prize) { SpinWheelResult result = new SpinWheelResult { Prize = new WheelPrize { PrizeName = prize.PrizeName, PrizePic = prize.PrizePic, PrizeLPValue = prize.PrizeLPValue, IsVoucher = prize.IsVoucher, IsRealItem = prize.IsRealItem, IsCoupon = prize.IsCoupon, ItemLink = prize.ItemLink, }, }; if (prize.IsRealItem) { await _semaphoreSlim.WaitAsync(); try { if (await _udb.UserVouchers.AnyAsync(v => v.RedeemItem == prize.PrizeName && v.VoucherKind == UserVoucher.Kind.Prize && v.UserID == user.Id)) { result.Prize.PrizeName = string.Format("{0}(已折换)", prize.PrizeName); var subVoucher = new UserVoucher { VoucherID = Guid.NewGuid(), UserID = user.Id, IssueTime = DateTime.Now, VoucherKind = UserVoucher.Kind.LuckyPoint, RedeemItem = string.Format("{0}/{0}", prize.PrizeLPValue), }; _udb.UserVouchers.Add(subVoucher); result.Voucher = Vouchers.FromUserVoucher(subVoucher, user.UserName); } else { var stock = await _udb.UserVouchers .Where(v => v.RedeemItem == prize.PrizeName && v.VoucherKind == UserVoucher.Kind.Prize && v.UserID == null) .FirstOrDefaultAsync(); if (stock != null) { stock.UserID = user.Id; stock.IssueTime = DateTime.Now; result.Voucher = Vouchers.FromUserVoucher(stock, user.UserName); } else { result.Prize.PrizeName = string.Format("{0}(售罄)", prize.PrizeName); var subVoucher = new UserVoucher { VoucherID = Guid.NewGuid(), UserID = user.Id, IssueTime = DateTime.Now, VoucherKind = UserVoucher.Kind.LuckyPoint, RedeemItem = string.Format("{0}/{0}", prize.PrizeLPValue), }; _udb.UserVouchers.Add(subVoucher); result.Voucher = Vouchers.FromUserVoucher(subVoucher, user.UserName); } } await _udb.SaveChangesAsync(); } finally { _semaphoreSlim.Release(); } } else if (prize.IsCoupon) { var subVoucher = new UserVoucher { VoucherID = Guid.NewGuid(), UserID = user.Id, IssueTime = DateTime.Now, VoucherKind = UserVoucher.Kind.Coupon, RedeemItem = prize.PrizeName, }; _udb.UserVouchers.Add(subVoucher); result.Voucher = Vouchers.FromUserVoucher(subVoucher, user.UserName); } else if (prize.IsVoucher) { var subVoucher = new UserVoucher { VoucherID = Guid.NewGuid(), UserID = user.Id, IssueTime = DateTime.Now, VoucherKind = UserVoucher.Kind.LuckyPoint, RedeemItem = string.Format("{0}/{0}", prize.PrizeLPValue), }; _udb.UserVouchers.Add(subVoucher); result.Voucher = Vouchers.FromUserVoucher(subVoucher, user.UserName); } return(result); }