Exemple #1
0
        public async Task <PdfResult> GeneratePdfFromHtmlStringAsync(string htmlString, PdfOptions options)
        {
            try
            {
                var start   = DateTime.Now;
                var browser = await _browserProvider.GetBrowserAsync();

                using var page = await browser.NewPageAsync();

                await page.SetContentAsync(htmlString);

                var pdfOptions = GetPdfOptionsAsync(options);
                var pdfStream  = await page.PdfStreamAsync(pdfOptions);

                var fileName = await PdfHelper.CreateFileNameAsync(page);

                _logger.LogInformation(@$ "Genererte PDF " "{fileName}" " ({Math.Round(pdfStream.Length / 1024f / 1024f, 2)} MB) på {Math.Round(DateTime.Now.Subtract(start).TotalSeconds, 2)} sek.");

                return(new PdfResult
                {
                    FileName = fileName,
                    Data = pdfStream
                });
            }
            catch (Exception exception)
            {
                _logger.LogError(exception, "Kunne ikke generere PDF fra HTML.");
                throw;
            }
        }
Exemple #2
0
        public async Task <IList <Appointment> > GetAppointmentsAsync()
        {
            await using var browser = await _browserProvider.GetBrowserAsync();

            var context = await browser.NewContextAsync();

            var page = await context.NewPageAsync();

            await page.GoToAsync("https://prepmod.doh.wa.gov/clinic/search");

            var vaxEvents = await page.QuerySelectorAllAsync(".main-container .mt-24 .flex");

            var appointments = new List <Appointment>();

            if (vaxEvents?.Any() ?? false)
            {
                foreach (var vaxEvent in vaxEvents)
                {
                    var titleElement = await vaxEvent.QuerySelectorAsync(".title");

                    if (titleElement == null)
                    {
                        Console.WriteLine("Failed to get title for mass vax event");
                        continue;
                    }
                    var title = await titleElement.GetInnerTextAsync();

                    Console.WriteLine($"{title}");
                    var match = Regex.Match(title, "(.*) - COVID Vaccine Clinic on (.*)");
                    if (match.Success)
                    {
                        string location   = match.Groups[1].Value;
                        string dateString = match.Groups[2].Value;
                        DateTime.TryParse(dateString, out DateTime date);

                        appointments.Add(new Appointment(
                                             Name,
                                             location,
                                             "Vaccine Clinic",
                                             date != default ? (DateTime?)date : null,
                                             null));
                    }
                }
            }

            return(appointments);
        }
        public async Task <IList <Appointment> > GetAppointmentsAsync()
        {
            await using var browser = await _browserProvider.GetBrowserAsync();

            var context = await browser.NewContextAsync();

            var page = await context.NewPageAsync();

            await page.GoToAsync("https://volunteer.covidvaccineseattle.org/VolunteerRecall.aspx");

            await page.FillAsync("#ContentPlaceHolder1_TextBox1", _options.Username);

            await page.FillAsync("#ContentPlaceHolder1_TextBoxPassword", _options.Password);

            await page.ClickAsync("#ContentPlaceHolder1_Button1");

            await page.WaitForSelectorAsync("#ContentPlaceHolder1_GridView1");

            var dates = await page.QuerySelectorAllAsync("#ContentPlaceHolder1_GridView1 tbody tr:not(.SeattleGreen) td:nth-child(2)");

            var appointments = new List <Appointment>();

            if (dates?.Any() ?? false)
            {
                foreach (var date in dates)
                {
                    var title = await date.GetInnerTextAsync();

                    appointments.Add(new Appointment(
                                         Name,
                                         "SeattleU",
                                         title,
                                         null,
                                         null,
                                         notes: "Only indicates registration has opened for this week. Spots may not be available."));
                }
            }

            return(appointments);
        }
Exemple #4
0
        public async Task <IList <Appointment> > GetAppointmentsAsync()
        {
            await using var browser = await _browserProvider.GetBrowserAsync();

            var context = await browser.NewContextAsync();

            var page = await context.NewPageAsync();

            await page.GoToAsync("https://volunteer.covidvaccineseattle.org/VolunteerRecall.aspx");

            await page.FillAsync("#ContentPlaceHolder1_TextBox1", _options.Username);

            await page.FillAsync("#ContentPlaceHolder1_TextBoxPassword", _options.Password);

            await page.ClickAsync("#ContentPlaceHolder1_Button1");

            await page.WaitForSelectorAsync("#ContentPlaceHolder1_GridView1");

            int weekCount = (await page.QuerySelectorAllAsync("#ContentPlaceHolder1_GridView1 tbody tr:not(.SeattleGreen) td:nth-child(1) input")).Count();

            var appointments = new List <Appointment>();

            for (int i = 0; i < weekCount; i++)
            {
                await page.GoToAsync("https://volunteer.covidvaccineseattle.org/VolunteerDashboard.aspx");

                var selector = (await page.QuerySelectorAllAsync("#ContentPlaceHolder1_GridView1 tbody tr:not(.SeattleGreen) td:nth-child(1) input")).Skip(i).First();
                await selector.ClickAsync();

                await page.WaitForSelectorAsync("#ContentPlaceHolder1_UpdatePanelSchedule");

                Console.WriteLine($"Checking if any assignments open for week index {i}");
                var dayElements = await page.QuerySelectorAllAsync("[id^=ContentPlaceHolder1_RepeaterSchedule_UpdatePanelAssignment_]");

                Console.WriteLine($"{dayElements.Count()} days to check");
                foreach (var dayElement in dayElements)
                {
                    var  parent = (await dayElement.QuerySelectorAllAsync("../..")).First();
                    bool closed = (await dayElement.QuerySelectorAllAsync("[id^=ContentPlaceHolder1_RepeaterSchedule_LabelRegistrationClosed_]")).Any();
                    if (!closed)
                    {
                        var day = await(await parent.QuerySelectorAsync("td:nth-child(1)")).GetInnerTextAsync();
                        Console.WriteLine($"Day {day} might have openings");
                        var optionsElements = await parent.QuerySelectorAllAsync("select option");

                        var roles = await Task.WhenAll(optionsElements.Select(async x => await x.GetTextContentAsync()));

                        foreach (var role in roles)
                        {
                            if (role != "Not attending this day")
                            {
                                var      date      = DateTime.Parse(day);
                                DateTime?time      = null;
                                var      timeMatch = Regex.Match(role, ".* @ (.*?[AaPp][Mm])");
                                if (timeMatch.Success)
                                {
                                    bool isDst = TimeZoneInfo.Local.IsDaylightSavingTime(DateTime.Now);           // Assume we're on a US server at least...

                                    string timeString     = timeMatch.Groups[1].Value;                            // e.g. 6:00AM
                                    string dateTimeString = $"{timeString} {day} 2021 -{(isDst ? "7" : "8")}:00"; // e.g. 6:00AM Mon Feb 8 2021 -8:00
                                    if (DateTime.TryParse(dateTimeString, out DateTime parsedTime))
                                    {
                                        time = parsedTime.ToUniversalTime();
                                        DateTimeOffset currentTime = DateTimeOffset.UtcNow;
                                        if (currentTime >= time)
                                        {
                                            Console.WriteLine($"Ignoring {role} at {time} since it's before the current time {currentTime}");
                                            continue;
                                        }
                                    }
                                }

                                appointments.Add(new Appointment(Name, "SeattleU", $"{role} on {day}", date: date, time: time));
                            }
                        }
                    }
                }
            }

            return(appointments);
        }