using System.Text.RegularExpressions; using BadmintonBooker; using Microsoft.Playwright; var argsLength = args.Length; if(argsLength < 1) { Console.WriteLine("Useage: BadmintonBooker "); return; } var endTime = args[0]; if (!TimeSpan.TryParse(endTime, out var endTimeSpan)) { Console.WriteLine("Invalid end time format. Use HH:mm"); return; } var debug = false; if (argsLength == 2) { if (!bool.TryParse(args[1], out debug)) { Console.WriteLine("Invalid debug value. Use true or false"); return; } } using var playwright = await Playwright.CreateAsync(); var context = await BrowserManager.GetContextAsync(playwright); var page = context.Pages.Count > 0 ? context.Pages[0] : await context.NewPageAsync(); await page.GotoAsync("https://my.hdc.mv/"); await page.GetByRole(AriaRole.Link, new() { Name = "Login" }).ClickAsync(); await page.GetByRole(AriaRole.Button, new() { Name = "eFaas" }).ClickAsync(); await page.GetByRole(AriaRole.Tab, new() { Name = "Password Login" }).ClickAsync(new () { Delay = 1000 }); await page.GetByPlaceholder("Username").FillAsync("A384347"); var password = File.ReadAllText("password.txt"); await page.GetByPlaceholder("Password").FillAsync(password); await page.GetByRole(AriaRole.Button, new() { Name = "LOGIN" }).ClickAsync(); await page.GetByRole(AriaRole.Button, new() { Name = "CONTINUE" }).ClickAsync(new () { Delay = 1000 }); await Task.Delay(5000); var egovOtp = await GoogleMessages.GetEgovOTP(context, page); if (egovOtp is not null) Console.WriteLine($"Extracted eGov OTP: {egovOtp}"); else return; await page.GetByPlaceholder("OTP").FillAsync(egovOtp); await page.GetByRole(AriaRole.Button, new() { Name = "CONTINUE" }).ClickAsync(); await page.GetByText("Make a booking").ClickAsync(); await page.GetByText("Fahiveni").ClickAsync(); await page.GetByText("Sports and Leisure").ClickAsync(); await page.GetByText(" Fahiveni Community Center ").First.ClickAsync(new () { Delay = 1500 }); await page.GetByText("Badminton Court 1").ClickAsync(new () { Delay = 1500 }); var currentDateTime = DateTime.Now; var upperBound = new DateTime(currentDateTime.Year, currentDateTime.Month, currentDateTime.Day, hour: 8, minute: 15, second: 0); var lowerBound = new DateTime(currentDateTime.Year, currentDateTime.Month, currentDateTime.Day, hour: 7, minute: 59, second: 59, millisecond: 800); var lastReloadTime = DateTime.Now; while (!debug && (currentDateTime < lowerBound || currentDateTime >= upperBound)) { if(lowerBound - currentDateTime > TimeSpan.FromSeconds(10) && lastReloadTime - currentDateTime > TimeSpan.FromMinutes(2)) { await page.ReloadAsync(); lastReloadTime = DateTime.Now; } await Task.Delay(5); currentDateTime = DateTime.Now; } await page.Locator("div.flex.items-center.justify-end > div > div:nth-child(2) > svg").ClickAsync(); await page.Locator("div.grid.bg-gray-100.rounded-lg.anim").Filter(new () { HasText = endTime }).ClickAsync(); await page.GetByRole(AriaRole.Button, new() { Name = "Submit" }).ClickAsync(); await page.GetByRole(AriaRole.Link, new() { Name = "Proceed to payment" }).ClickAsync(); await page.GetByRole(AriaRole.Button, new() { Name = "Pay Now" }).ClickAsync(new () { Delay = 3500 }); await page.GetByRole(AriaRole.Checkbox, new()).ClickAsync(); await page.GetByRole(AriaRole.Button, new() { Name = "Pay now" }).ClickAsync(); var cardDetails = File.ReadAllLines("CardDetails.txt"); await page.GetByPlaceholder("Name on card").FillAsync(cardDetails[0]); await page.GetByPlaceholder("1234 1234 1234 1234").FillAsync(cardDetails[1]); await page.GetByPlaceholder("MM/YY").FillAsync(cardDetails[2]); var cvv = File.ReadAllText("CVV.txt"); await page.GetByPlaceholder("CVV").FillAsync(cvv); await page.GetByText(new Regex("^Pay")).ClickAsync(new () { Delay = 1000 }); await Task.Delay(15000); var bmlOtp = await GoogleMessages.GetBMLOTP(context, page); if (bmlOtp is not null) Console.WriteLine($"Extracted BML OTP: {bmlOtp}"); else return; await page.Locator("input[name='otpValue']").FillAsync(bmlOtp); await page.GetByRole(AriaRole.Button, new() { Name = "CONFIRM" }).ClickAsync(); await Task.Delay(15000); var hdcMessage = await GoogleMessages.GetMessageFromHDC(context, page); Console.WriteLine($"Message from HDC: {hdcMessage}");