LenovoLegionToolkit

Форк
0
71 строка · 2.6 Кб
1
using System;
2
using System.Text.Json.Nodes;
3
using System.Threading;
4
using System.Threading.Tasks;
5
using CoordinateSharp;
6
using LenovoLegionToolkit.Lib.Settings;
7

8
namespace LenovoLegionToolkit.Lib.Utils;
9

10
public class SunriseSunset
11
{
12
    private readonly SunriseSunsetSettings _settings;
13
    private readonly HttpClientFactory _httpClientFactory;
14

15
    public SunriseSunset(SunriseSunsetSettings settings, HttpClientFactory httpClientFactory)
16
    {
17
        _settings = settings ?? throw new ArgumentNullException(nameof(settings));
18
        _httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory));
19
    }
20

21
    public async Task<(Time?, Time?)> GetSunriseSunsetAsync(CancellationToken token = default)
22
    {
23
        var (sunrise, sunset) = (_settings.Store.Sunrise, _settings.Store.Sunset);
24
        if (_settings.Store.LastCheckDateTime == DateTime.Today && sunrise is not null && sunset is not null)
25
            return (sunrise, sunset);
26

27
        var coordinate = await GetGeoLocationAsync(token).ConfigureAwait(false);
28

29
        if (coordinate is null)
30
            return (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

39
        return (sunrise, sunset);
40
    }
41

42
    private async Task<Coordinate?> GetGeoLocationAsync(CancellationToken token)
43
    {
44
        try
45
        {
46
            using var httpClient = _httpClientFactory.Create();
47
            var responseJson = await httpClient.GetStringAsync("http://ip-api.com/json?fields=lat,lon", token).ConfigureAwait(false);
48
            var responseJsonNode = JsonNode.Parse(responseJson);
49
            if (responseJsonNode is not null && double.TryParse(responseJsonNode["lat"]?.ToString(), out var lat) && double.TryParse(responseJsonNode["lon"]?.ToString(), out var lon))
50
                return new Coordinate(lat, lon, DateTime.UtcNow);
51
        }
52
        catch (Exception ex)
53
        {
54
            if (Log.Instance.IsTraceEnabled)
55
                Log.Instance.Trace($"Failed to get geolocation.", ex);
56
        }
57

58
        return null;
59
    }
60

61
    private static (Time?, Time?) CalculateSunriseSunset(Coordinate coordinate)
62
    {
63
        var sunrise = coordinate.CelestialInfo.SunRise;
64
        var sunset = coordinate.CelestialInfo.SunSet;
65

66
        if (sunrise == null || sunset == null)
67
            return (null, null);
68

69
        return (new Time { Hour = sunrise.Value.Hour, Minute = sunrise.Value.Minute }, new Time { Hour = sunset.Value.Hour, Minute = sunset.Value.Minute });
70
    }
71
}
72

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.