From dc44cb86abdfbc3247770313d512f7b2000acdd9 Mon Sep 17 00:00:00 2001 From: mslowin Date: Tue, 29 Jul 2025 09:06:24 +0200 Subject: [PATCH] Fix: fix work status extraction logic, enhance error handling and logging across application --- Program.cs | 6 +-- Services/RcpApiClient.cs | 68 +++++++++++++++++++++----------- Services/RcpAutomationService.cs | 16 +++++--- 3 files changed, 57 insertions(+), 33 deletions(-) diff --git a/Program.cs b/Program.cs index 9358e75..b3c90c6 100644 --- a/Program.cs +++ b/Program.cs @@ -75,8 +75,6 @@ static async Task Main() } } while (!api.LoginSuccessful); - - // Check if the work has already started - runs in the background 6 times every 1 minute var result = await RcpAutomationService.CheckIfWorkAlreadyStartedWithRetryAsync(api); if (result == null) @@ -104,9 +102,9 @@ static async Task Main() catch (Exception ex) { // TODO: tutaj może mail jeszcze do mnie z informacją że coś poszło komuś nie tak - komu i co poszło nie tak - File.AppendAllText("output.txt", $"[{DateTime.Now}] {ex}\n\n"); + File.AppendAllText("output.txt", $"[{DateTime.Now}] {ex}\nMetoda: Program.cs -> Main()\n\n"); MessageBox.Show( - "Wystąpił nieoczekiwany błąd. Szczegóły zapisano w pliku output.txt", + "Wystąpił nieoczekiwany błąd. Szczegóły zapisano w pliku output.txt, proszę skonsultować się z administratorem.", "EasyRCP - Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error); diff --git a/Services/RcpApiClient.cs b/Services/RcpApiClient.cs index 215c4c9..0bdfbd0 100644 --- a/Services/RcpApiClient.cs +++ b/Services/RcpApiClient.cs @@ -138,31 +138,51 @@ public static async Task CreateApiClientAsync(string email, string /// true if work has already started; otherwise false. public async Task CheckIfWorkAlreadyStarted() { - var myStatusResponse = await _client.PostAsync("/dashboard/getMyStatus/1", null); - string json = await ReadResponseAsDecompressedString(myStatusResponse); - var parsed = JsonDocument.Parse(json); - var rawHtml = parsed.RootElement.GetProperty("body").GetString(); - var readableHtml = WebUtility.HtmlDecode(rawHtml); - - if (readableHtml != null && (readableHtml.Contains("Na stanowisku") - || readableHtml.Contains("Praca zdalna") - || readableHtml.Contains("W terenie"))) + try { - // User is already at work - return true; + var myStatusResponse = await _client.PostAsync("/dashboard/getMyStatus/1", null); + string json = await ReadResponseAsDecompressedString(myStatusResponse); + var parsed = JsonDocument.Parse(json); + var rawHtml = parsed.RootElement.GetProperty("body").GetString(); + var readableHtml = WebUtility.HtmlDecode(rawHtml); + + if (readableHtml == null) + { + throw new InvalidOperationException("Nie udało się odczytać HTMLa z getMyStatus"); + } + + var match = Regex.Match(readableHtml, @"Twój status obecności.*?\s*(.*?)\s*", RegexOptions.Singleline); + if (!match.Success) + { + throw new InvalidOperationException("Nie udało się znaleźć statusu obecności w HTMLu z getMyStatus"); + } + + var workStatus = match.Groups[1].Value.Trim(); + if (workStatus != null && (workStatus == "Na stanowisku" + || workStatus == "Praca zdalna" + || workStatus == "W terenie")) + { + // User is already at work + return true; + } + else if (workStatus != null && workStatus == "Nie ma") + { + // User is not at work + return false; + } + else + { + throw new InvalidOperationException("Nie udało się rozpoznać statusu pracy w HTMLu z getMyStatus"); + } } - else if (readableHtml != null && readableHtml.Contains("Nie ma")) - { - // User is not at work - return false; - } - else + catch (Exception ex) { // Sth not right but cannot throw error to Program.cs as this is in Polly retry policy. Needs to be handled here - File.AppendAllText("output.txt", $"[{DateTime.Now}] Coś poszło nie tak, nie udało się sprawdzić, czy użytkownik jest już w pracy. " + + File.AppendAllText("output.txt", $"[{DateTime.Now}] Coś poszło nie tak, nie udało się sprawdzić," + + $"czy użytkownik jest już w pracy.\nMetoda: RcpApiClient -> CheckIfWorkAlreadyStarted()\n ex.Message: {ex.Message}\n" + $"Możliwe, że zmieniło się coś w zwracanym z /dashboard/getMyStatus/ HTMLu.\n\n"); MessageBox.Show( - "Wystąpił nieoczekiwany błąd. Szczegóły zapisano w pliku output.txt", + "Wystąpił nieoczekiwany błąd. Szczegóły zapisano w pliku output.txt, proszę skonsultować się z administratorem.", "EasyRCP - Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error); @@ -283,9 +303,10 @@ private async Task SendPostAndHandleResponseAsync(string requestUri, FormU if (!resp.IsSuccessStatusCode) { // TODO: tu może wystarczy zrobić throw do Program.cs - File.AppendAllText("output.txt", $"[{DateTime.Now}] HTTP {(int)resp.StatusCode}: {resp.ReasonPhrase}\n{json}\n\n"); + File.AppendAllText("output.txt", $"[{DateTime.Now}] HTTP {(int)resp.StatusCode}: {resp.ReasonPhrase}\n{json}\n" + + $"Metoda: RcpApiClient -> SendPostAndHandleResponseAsync()\n\n"); MessageBox.Show( - $"Błąd, szczegóły zostały zapisane w pliku output.txt", + $"Błąd, szczegóły zostały zapisane w pliku output.txt, proszę skonsultować się z administratorem.", "EasyRCP - Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error); @@ -297,9 +318,10 @@ private async Task SendPostAndHandleResponseAsync(string requestUri, FormU if (!success) { // TODO: tu może wystarczy zrobić throw do Program.cs - File.AppendAllText("output.txt", $"[{DateTime.Now}] API zwróciło success = false\n{json}\n\n"); + File.AppendAllText("output.txt", $"[{DateTime.Now}] API zwróciło success = false\n{json}\n" + + $"Metoda: RcpApiClient -> SendPostAndHandleResponseAsync()\n\n"); MessageBox.Show( - $"Błąd, szczegóły zostały zapisane w pliku output.txt", + $"Błąd, szczegóły zostały zapisane w pliku output.txt, proszę skonsultować się z administratorem.", "EasyRCP - Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error); diff --git a/Services/RcpAutomationService.cs b/Services/RcpAutomationService.cs index 8d79457..5b2a07a 100644 --- a/Services/RcpAutomationService.cs +++ b/Services/RcpAutomationService.cs @@ -15,7 +15,8 @@ public static class RcpAutomationService sleepDurationProvider: retryAttempt => TimeSpan.FromMinutes(1), onRetry: (exception, timeSpan, retryCount, _) => { - File.AppendAllText("output.txt", $"[{DateTime.Now}] [Retry {retryCount}] Błąd: {exception.Message}. Próba ponownie za {timeSpan.TotalSeconds} sek.\n\n"); + File.AppendAllText("output.txt", $"[{DateTime.Now}] [Retry {retryCount}] Błąd: {exception.Message}. Próba ponownie za {timeSpan.TotalSeconds} sek.\n" + + $"Metoda: RcpAutomationService -> CheckIfWorkAlreadyStartedAsync()\n\n"); }); /// @@ -35,7 +36,8 @@ public static class RcpAutomationService } catch (Exception ex) { - File.AppendAllText("output.txt", $"[{DateTime.Now}] {ex}\n\n"); + File.AppendAllText("output.txt", $"[{DateTime.Now}] {ex}\n" + + $"Metoda: RcpAutomationService -> CheckIfWorkAlreadyStartedWithRetryAsync()\n\n"); Console.WriteLine($"Wszystkie retry zakończone niepowodzeniem (pewnie brak internetu). Szczegóły błędu zapisano w pliku output.txt"); return null; } @@ -92,9 +94,10 @@ public static async Task StartWorkAsync(RcpApiClient api) // Program.cs właśnie w każdym przypadku (zarówno z metody wywoływanej w Program.cs, jak i z opcji w tray menu) // TODO: tutaj może mail jeszcze do mnie z informacją że coś poszło komuś nie tak - komu i co poszło nie tak - File.AppendAllText("output.txt", $"[{DateTime.Now}] {ex}\n\n"); + File.AppendAllText("output.txt", $"[{DateTime.Now}] {ex}\n" + + $"Metoda: RcpAutomationService -> StartWorkAsync()\n\n"); MessageBox.Show( - "Wystąpił nieoczekiwany błąd, nie udało się zarejestrować początku pracy. Szczegóły błędu zapisano w pliku output.txt", + "Wystąpił nieoczekiwany błąd, nie udało się zarejestrować początku pracy. Szczegóły błędu zapisano w pliku output.txt, proszę skonsultować się z administratorem.", "EasyRCP - Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error); @@ -143,9 +146,10 @@ public static async Task EndWork(RcpApiClient api) // Program.cs właśnie w każdym przypadku (zarówno z metody wywoływanej w Program.cs, jak i z opcji w tray menu) // TODO: tutaj może mail jeszcze do mnie z informacją że coś poszło komuś nie tak - komu i co poszło nie tak - File.AppendAllText("output.txt", $"[{DateTime.Now}] {ex}\n\n"); + File.AppendAllText("output.txt", $"[{DateTime.Now}] {ex}\n" + + $"Metoda: RcpAutomationService -> EndWork()\n\n"); MessageBox.Show( - "Wystąpił nieoczekiwany błąd, nie udało się zarejestrować końca pracy. Szczegóły błędu zapisano w pliku output.txt", + "Wystąpił nieoczekiwany błąd, nie udało się zarejestrować końca pracy. Szczegóły błędu zapisano w pliku output.txt, proszę skonsultować się z administratorem.", "EasyRCP - Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);