namespace Sonex.Client.Helpers;
using Sonex.Client.Dialogs;
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
public static class LogerSender
{
private static readonly object Sync = new();
private static readonly HttpClient HttpClient = new()
{
Timeout = TimeSpan.FromSeconds(3)
};
private static bool _started;
///
/// Uruchamia wysylke zaleglych logow w tle.
/// Funkcja nigdy nie blokuje startu aplikacji i nie wyrzuca wyjatku na zewnatrz.
///
public static void SendLogs()
{
lock (Sync)
{
if (_started)
return;
_started = true;
}
_ = Task.Run(async () =>
{
try
{
await SendLogsInternalAsync();
}
catch
{
}
finally
{
lock (Sync)
{
_started = false;
}
}
});
}
///
/// Skanuje folder Logs i wysyla wszystkie pliki JSON, ktore nie sa jeszcze oznaczone jako wyslane.
///
private static async Task SendLogsInternalAsync()
{
string endpoint = Config.GetStringValue("LOGS_ENDPOINT", string.Empty).Trim();
if (string.IsNullOrWhiteSpace(endpoint))
return;
if (!Uri.TryCreate(endpoint, UriKind.Absolute, out var uri))
return;
string logsPath = Logger.GetLogsDirectoryPath();
if (!Directory.Exists(logsPath))
return;
string[] files;
try
{
files = Directory.GetFiles(logsPath, "*.json", SearchOption.TopDirectoryOnly);
}
catch
{
return;
}
Array.Sort(files, StringComparer.OrdinalIgnoreCase);
foreach (string filePath in files)
{
try
{
if (filePath.EndsWith(".sended.json", StringComparison.OrdinalIgnoreCase))
continue;
string json = await File.ReadAllTextAsync(filePath, Encoding.UTF8);
if (string.IsNullOrWhiteSpace(json))
continue;
using var content = new StringContent(json, Encoding.UTF8, "application/json");
using var response = await HttpClient.PostAsync(uri, content);
if (!response.IsSuccessStatusCode)
continue;
RenameToSended(filePath);
}
catch
{
}
}
}
///
/// Oznacza poprawnie wyslany plik przez zmiane rozszerzenia z .json na .sended.json.
///
private static void RenameToSended(string filePath)
{
try
{
if (!filePath.EndsWith(".json", StringComparison.OrdinalIgnoreCase))
return;
string sentFilePath = filePath[..^".json".Length] + ".sended.json";
File.Move(filePath, sentFilePath, overwrite: true);
}
catch
{
}
}
}