public async Task <ActionResult> Download(WalletDownload walletDownload, DateTime now)
        {
            var user = await _dbContext.User.FirstOrDefaultAsync(r => r.UserId == walletDownload.UserId);

            var userReferral = await _dbContext.UserReferral.FirstOrDefaultAsync(r => r.UserId == walletDownload.UserId);

            if (userReferral != null && !UserLockCollection.Lock(userReferral.UserId))
            {
                return(StatusCode(UserLockCollection.UserLockedReturnCode));
            }

            try
            {
                var downloads = _dbContext.WalletDownload.Where(w => w.TimeStamp.AddDays(7) > now).Where(d => d.IPAddress == walletDownload.IPAddress);

                if (!downloads.Any() && userReferral != null && (userReferral.ReferralId != 0 && userReferral.WalletDownloadDate == null))
                {
                    try
                    {
                        walletDownload.ReferralUserId = _dbContext.Referrer
                                                        .FirstOrDefault(r => r.ReferralId == Convert.ToInt32(userReferral.ReferralId))?.UserId;
                        walletDownload.ReferralCode = userReferral.ReferralId.ToString();
                    }
                    catch (Exception e)
                    {
                        throw new Exception($"could not convert referral code: {walletDownload.ReferralCode} to an integer");
                    }

                    var referrerUser = await _dbContext.JoinUserModels().FirstOrDefaultAsync(u => u.UserId == walletDownload.ReferralUserId);

                    if (referrerUser != null && userReferral != null && userReferral?.WalletDownloadDate == null)
                    {
                        if (!referrerUser.IsBanned && !user.IsBanned)
                        {
                            await ReferralUtils.ReferralRewards(_dbContext, walletDownload, userReferral, referrerUser, user, "Wallet download");
                        }
                    }
                }

                walletDownload.TimeStamp = now;
                _dbContext.WalletDownload.Add(walletDownload);
                await _dbContext.SaveAsync();

                return(StatusCode((int)HttpStatusCode.OK));
            }
            catch (Exception e)
            {
                await BITCORNLogger.LogError(_dbContext, e, JsonConvert.SerializeObject(walletDownload));

                return(StatusCode((int)HttpStatusCode.InternalServerError));
            }
            finally
            {
                if (userReferral != null)
                {
                    UserLockCollection.Release(userReferral.UserId);
                }
            }
        }
Пример #2
0
        public static async Task ReferralRewards(BitcornContext dbContext, WalletDownload walletDownload, UserReferral userReferral, User referrerUser,
                                                 User user, string type)
        {
            if (user.IsBanned || referrerUser.IsBanned)
            {
                return;
            }

            var referrer = await dbContext.Referrer
                           .FirstOrDefaultAsync(w => w.UserId == walletDownload.ReferralUserId);

            userReferral.WalletDownloadDate = DateTime.Now;

            if (IsValidReferrer(referrer))
            {
                var referralPayoutTotal = await ReferralUtils.TotalReward(dbContext, referrer) + await ReferralUtils.WalletBonusReward(dbContext, referrer, 10);;
                var referrerReward      = await TxUtils.SendFromBitcornhub(referrerUser, referralPayoutTotal, "BITCORNFarms",
                                                                           type, dbContext);

                var referreeReward = await TxUtils.SendFromBitcornhub(user, referrer.Amount + 10, "BITCORNFarms",
                                                                      type, dbContext);

                if (referrerReward && referreeReward)
                {
                    await ReferralUtils.LogReferralTx(dbContext, referrerUser.UserId, referralPayoutTotal,
                                                      type);

                    await ReferralUtils.LogReferralTx(dbContext, user.UserId, referrer.Amount + 10,
                                                      $"Recruit {type}");

                    await ReferralUtils.UpdateYtdTotal(dbContext, referrer, referralPayoutTotal);

                    if (referrerUser.UserStat.TotalReferralRewardsCorn == null)
                    {
                        referrerUser.UserStat.TotalReferralRewardsCorn = 0;
                    }
                    if (referrerUser.UserStat.TotalReferralRewardsUsdt == null)
                    {
                        referrerUser.UserStat.TotalReferralRewardsUsdt = 0;
                    }
                    referrerUser.UserStat.TotalReferralRewardsCorn += referralPayoutTotal;
                    referrerUser.UserStat.TotalReferralRewardsUsdt +=
                        ((referralPayoutTotal) * (await ProbitApi.GetCornPriceAsync(dbContext)));
                    userReferral.WalletDownloadDate = DateTime.Now;
                    await ReferralUtils.BonusPayout(dbContext, userReferral, referrer, user, referrerUser,
                                                    referrerUser.UserStat);
                }
            }
        }
 public async Task <ActionResult> Post([FromBody] WalletDownload walletDownload)
 {
     return(await Download(walletDownload, DateTime.Now));
 }