public async Task InitializeReportLogger(CommandContext context)
        {
            var newReport = new Report()
            {
                UserId  = context.Message.Author.Id.ToString(),
                GuildId = context.Guild.Id.ToString(),
                Date    = DateTime.Now.ToString("dddd, dd MMMM HH:mm")
            };

            var summaryStep     = new SummaryStep("Enter summary", null);
            var timeboxStep     = new TimeboxStep("Enter timebox", summaryStep);
            var meetingTypeStep = new MeetingTypeStep("Enter meeting type", timeboxStep);

            meetingTypeStep.OnValidResult += (result) => newReport.MeetingType = result;
            summaryStep.OnValidResult     += (result) => newReport.Summary = result;
            timeboxStep.OnValidResult     += (result) => newReport.Timebox = result;

            // open dm
            // var dm = await context.Member.CreateDmChannelAsync().ConfigureAwait(false);

            var reportLogger = new ReportLoggerHandler(
                context.Client,
                context.Channel,
                context.User,
                meetingTypeStep
                );

            var succeeded = await reportLogger.ProcessReportLogger().ConfigureAwait(false);

            if (!succeeded)
            {
                return;
            }

            await _dbContext.AddAsync(newReport).ConfigureAwait(false);

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

            await context.Channel.SendMessageAsync("Report successfully saved to database").ConfigureAwait(false);
        }
        public async Task ScheduleMeeting(CommandContext context)
        {
            var newMeeting = new Meeting()
            {
                CreatorUserId = context.Message.Author.Id.ToString(),
                GuildId       = context.Guild.Id.ToString()
            };

            var dateTimeStep    = new DateTimeStep("Enter summary", null);
            var timeboxStep     = new TimeboxStep("Enter timebox", dateTimeStep);
            var meetingTypeStep = new MeetingTypeStep("Enter meeting type", timeboxStep);
            var titleStep       = new TitleStep("Enter meeting type", meetingTypeStep);

            titleStep.OnValidResult       += (result) => newMeeting.Title = result;
            meetingTypeStep.OnValidResult += (result) => newMeeting.MeetingType = result;
            timeboxStep.OnValidResult     += (result) => newMeeting.Timebox = result;
            dateTimeStep.OnValidResult    += (result) => newMeeting.DateTime = result;

            // open dm
            // var dm = await context.Member.CreateDmChannelAsync().ConfigureAwait(false);

            var meetingScheduler = new MeetingSchedulerHandler(
                context.Client,
                context.Channel,
                context.User,
                titleStep
                );

            var succeeded = await meetingScheduler.ProcessReportLogger().ConfigureAwait(false);

            if (!succeeded)
            {
                return;
            }

            await _dbContext.AddAsync(newMeeting).ConfigureAwait(false);

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

            await context.Channel.SendMessageAsync("Report successfully saved to database").ConfigureAwait(false);
        }
        public async Task InitializeConnectionToGitHub(CommandContext context, string githubToken, string username, string repoName)
        {
            var existingConnection = await _dbContext.GitHubInformations
                                     .AsNoTracking()
                                     .FirstOrDefaultAsync(g => g.GuildId == context.Guild.Id.ToString())
                                     .ConfigureAwait(false);

            if (existingConnection != default)
            {
                var embedBuilder = new DiscordEmbedBuilder
                {
                    Title = "Already connected"
                };
                embedBuilder.AddField("Connected", $"{context.User.Mention}, " +
                                      $"this server is already connected to repo '{existingConnection.RepositoryName}'");

                await context.Channel.SendMessageAsync(embed : embedBuilder).ConfigureAwait(false);

                return;
            }

            var githubInformation = new GitHubInformation
            {
                GuildId        = context.Guild.Id.ToString(),
                GitHubToken    = githubToken,
                DiscordUserId  = context.User.Id.ToString(),
                RepositoryName = repoName,
                Url            = $"https://api.github.com/repos/{username}/{repoName}"
            };

            await _dbContext.AddAsync(githubInformation);

            await _dbContext.SaveChangesAsync();

            await context.Channel.SendMessageAsync("Successfully saved github information, you're now ready to connect.");
        }