public async Task <bool> PayUser(string discordId, decimal amount, DateTime dateTime, bool stimulus)
        {
            using var context = new DiscordDBContext(_options);

            Users user = await GetUserById(discordId).ConfigureAwait(false);

            user.CashBalance += amount;

            if (stimulus)
            {
                TimeSpan interval = DateTime.Now - user.LastStimulus;
                if (interval < TimeSpan.FromHours(24))
                {
                    return(false);
                }
                user.LastStimulus = dateTime;
            }
            else
            {
                TimeSpan interval = DateTime.Now - user.LastWorked;
                if (interval < TimeSpan.FromMinutes(30))
                {
                    return(false);
                }
                user.LastWorked = dateTime;
            }

            context.Update(user);
            await context.SaveChangesAsync().ConfigureAwait(false);

            return(true);
        }
        public async Task <Users> GetUserById(string discordId)
        {
            using var context = new DiscordDBContext(_options);

            Users user = await context.Users
                         .FirstOrDefaultAsync(x => x.DiscordId == discordId).ConfigureAwait(false);

            if (user != null)
            {
                return(user);
            }

            // add user to db if not already added
            user = new Users
            {
                DiscordId          = discordId,
                CashBalance        = 0.00m,
                BankBalance        = 0.00m,
                LastWorked         = DateTime.Now.Subtract(TimeSpan.FromMinutes(30)),
                LastStimulus       = DateTime.Now.Subtract(TimeSpan.FromHours(24)),
                CockFightWinStreak = 0
            };

            await context.AddAsync(user).ConfigureAwait(false);

            await context.SaveChangesAsync().ConfigureAwait(false);

            return(user);
        }
        public async Task <List <Users> > GetLeaderboard()
        {
            using var context = new DiscordDBContext(_options);

            var leaderboard = await context.Users.FromSqlRaw("SELECT Id, DiscordId, CashBalance + BankBalance AS CashBalance, BankBalance, LastWorked, CockFightWinStreak, LastStimulus " +
                                                             "FROM DiscordDBContext.dbo.Users " +
                                                             "WHERE DiscordId != 383717290715250688 AND DiscordId != 811705966184628296" + // omit the casino user
                                                             "ORDER BY CashBalance DESC").ToListAsync();

            return(leaderboard);
        }
        public async Task TakeMoney(string discordId, decimal amount)
        {
            using var context = new DiscordDBContext(_options);

            Users user = await GetUserById(discordId).ConfigureAwait(false);

            user.CashBalance -= amount;

            context.Update(user);
            await context.SaveChangesAsync().ConfigureAwait(false);
        }
        public async Task SetCockfightStreak(string discordId, bool won)
        {
            using var context = new DiscordDBContext(_options);

            Users user = await GetUserById(discordId).ConfigureAwait(false);

            if (won)
            {
                user.CockFightWinStreak++;
            }
            else
            {
                user.CockFightWinStreak = 0;
            }

            context.Update(user);
            await context.SaveChangesAsync().ConfigureAwait(false);
        }
        public async Task <bool> WithdrawMoney(string discordId, decimal amount)
        {
            using var context = new DiscordDBContext(_options);

            Users user = await GetUserById(discordId).ConfigureAwait(false);

            // exclude if withdrawal is more than bank balance or less than 0
            if (amount > user.BankBalance || amount <= 0)
            {
                return(false);
            }

            user.BankBalance -= amount;
            user.CashBalance += amount;

            context.Update(user);
            await context.SaveChangesAsync().ConfigureAwait(false);

            return(true);
        }