Example #1
0
        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));
        }
Example #2
0
        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));
        }
Example #3
0
        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);
        }