public async Task RegisterJob(DiggingJob job)
        {
            // Do not continue if consent was lost.
            if (!_gudp.GlobalDataExists(job.UserId))
            {
                return;
            }

#if DEBUG
            // In DEBUG, we need to wait for SECONDS instead of HOURS
            // to be able to test the feature without actually waiting.
            var finishDateTime = job.StartDateTime.AddSeconds(job.DiggingLengthInHours);
            //var finishDateTime = job.StartDateTime.AddSeconds(20);
#else
            var finishDateTime = job.StartDateTime.AddHours(job.DiggingLengthInHours);
#endif

            // Finish if past due-date.
            if (finishDateTime < DateTime.Now)
            {
                await FinishDigging(job);

                return;
            }

            var user = _gudp.GetGlobalUserData(job.UserId);

            JustineCore.SchedulerUtilities.ExecuteAt(async() => {
                await FinishDigging(job);
            }, finishDateTime);

            Logger.Log($"[RegisterAllDiggingJobs] Scheduled a stored job.");
        }
        public async Task FinishDigging(DiggingJob job)
        {
            if (job is null)
            {
                return;
            }
            if (!_gudp.GlobalDataExists(job.UserId))
            {
                return;
            }

            try
            {
                var discordUser = _client.GetUser(job.UserId);

                var g  = _client.GetGuild(job.GuildId);
                var ch = g.GetTextChannel(job.TextChannelId);

                await ch.SendMessageAsync($"{discordUser.Mention}, you finished your digging! Use `gold dig reward` to collect your reward.");
            }
            catch
            {
                Logger.Log("[DiggingJobProvider] Couldn't send a completion message.", ConsoleColor.Red);
            }
        }
        public static int GetReward(this DiggingJob job)
        {
            var reward = job.DiggingLengthInHours * Constants.DiggingGoldPerHour;

            if (job.DiggingLengthInHours > 1)
            {
                reward += job.DiggingLengthInHours * Constants.StreakBonusPerHour;
            }

            return(reward);
        }
        public async void AddJob(DiggingJob job)
        {
            if (_activeJobs.Any(j => j.UserId == job.UserId))
            {
                return;
            }

            _activeJobs.Add(job);
            SaveJobs();

            await RegisterJob(job);
        }
        public static bool IsComplete(this DiggingJob job)
        {
#if DEBUG
            // In DEBUG, we need to wait for SECONDS instead of HOURS
            // to be able to test the feature without actually waiting.
            var finishDateTime = job.StartDateTime.AddSeconds(job.DiggingLengthInHours);
            //var finishDateTime = job.StartDateTime.AddSeconds(20);
#else
            var finishDateTime = job.StartDateTime.AddHours(job.DiggingLengthInHours);
#endif
            return(finishDateTime < DateTime.Now);
        }