LenovoLegionToolkit
71 строка · 2.6 Кб
1using System;2using System.Text.Json.Nodes;3using System.Threading;4using System.Threading.Tasks;5using CoordinateSharp;6using LenovoLegionToolkit.Lib.Settings;7
8namespace LenovoLegionToolkit.Lib.Utils;9
10public class SunriseSunset11{
12private readonly SunriseSunsetSettings _settings;13private readonly HttpClientFactory _httpClientFactory;14
15public SunriseSunset(SunriseSunsetSettings settings, HttpClientFactory httpClientFactory)16{17_settings = settings ?? throw new ArgumentNullException(nameof(settings));18_httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory));19}20
21public async Task<(Time?, Time?)> GetSunriseSunsetAsync(CancellationToken token = default)22{23var (sunrise, sunset) = (_settings.Store.Sunrise, _settings.Store.Sunset);24if (_settings.Store.LastCheckDateTime == DateTime.Today && sunrise is not null && sunset is not null)25return (sunrise, sunset);26
27var coordinate = await GetGeoLocationAsync(token).ConfigureAwait(false);28
29if (coordinate is null)30return (null, null);31
32(sunrise, sunset) = CalculateSunriseSunset(coordinate);33
34_settings.Store.LastCheckDateTime = DateTime.UtcNow;35_settings.Store.Sunrise = sunrise;36_settings.Store.Sunset = sunset;37_settings.SynchronizeStore();38
39return (sunrise, sunset);40}41
42private async Task<Coordinate?> GetGeoLocationAsync(CancellationToken token)43{44try45{46using var httpClient = _httpClientFactory.Create();47var responseJson = await httpClient.GetStringAsync("http://ip-api.com/json?fields=lat,lon", token).ConfigureAwait(false);48var responseJsonNode = JsonNode.Parse(responseJson);49if (responseJsonNode is not null && double.TryParse(responseJsonNode["lat"]?.ToString(), out var lat) && double.TryParse(responseJsonNode["lon"]?.ToString(), out var lon))50return new Coordinate(lat, lon, DateTime.UtcNow);51}52catch (Exception ex)53{54if (Log.Instance.IsTraceEnabled)55Log.Instance.Trace($"Failed to get geolocation.", ex);56}57
58return null;59}60
61private static (Time?, Time?) CalculateSunriseSunset(Coordinate coordinate)62{63var sunrise = coordinate.CelestialInfo.SunRise;64var sunset = coordinate.CelestialInfo.SunSet;65
66if (sunrise == null || sunset == null)67return (null, null);68
69return (new Time { Hour = sunrise.Value.Hour, Minute = sunrise.Value.Minute }, new Time { Hour = sunset.Value.Hour, Minute = sunset.Value.Minute });70}71}
72