add: WeatherModule
This commit is contained in:
parent
014fb2a44d
commit
e477c015af
26
Katheryne.Tests/Modules/WeatherModuleTests.cs
Normal file
26
Katheryne.Tests/Modules/WeatherModuleTests.cs
Normal file
|
@ -0,0 +1,26 @@
|
|||
using Katheryne.Modules;
|
||||
using Xunit.Abstractions;
|
||||
|
||||
namespace Katheryne.Tests.Modules;
|
||||
|
||||
public class WeatherModuleTests
|
||||
{
|
||||
private readonly ITestOutputHelper _output;
|
||||
|
||||
public WeatherModuleTests(ITestOutputHelper output)
|
||||
{
|
||||
_output = output;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void WeatherModuleTest()
|
||||
{
|
||||
var weather = new WeatherModule();
|
||||
|
||||
Assert.True(weather.ContainsParam("text"));
|
||||
Assert.True(weather.ContainsParam("temp"));
|
||||
|
||||
_output.WriteLine(weather["text"]);
|
||||
_output.WriteLine(weather["temp"]);
|
||||
}
|
||||
}
|
22
Katheryne/Exceptions/ModuleException.cs
Normal file
22
Katheryne/Exceptions/ModuleException.cs
Normal file
|
@ -0,0 +1,22 @@
|
|||
namespace Katheryne.Exceptions;
|
||||
|
||||
/// <summary>
|
||||
/// 调用模块中发生的异常
|
||||
/// </summary>
|
||||
public class ModuleException : Exception
|
||||
{
|
||||
public ModuleException() : base()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public ModuleException(string message) : base(message)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public ModuleException(string message, Exception innerException) : base(message, innerException)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
30
Katheryne/Modules/ModuleBase.cs
Normal file
30
Katheryne/Modules/ModuleBase.cs
Normal file
|
@ -0,0 +1,30 @@
|
|||
using System.Text.Json;
|
||||
using Katheryne.Abstractions;
|
||||
|
||||
namespace Katheryne.Modules;
|
||||
|
||||
public abstract class ModuleBase : IParamsModule
|
||||
{
|
||||
protected readonly Dictionary<string, Func<string>> Functions = new();
|
||||
|
||||
protected readonly JsonSerializerOptions JsonOptions = new()
|
||||
{
|
||||
PropertyNameCaseInsensitive = true
|
||||
};
|
||||
|
||||
public abstract string ModuleName { get; }
|
||||
|
||||
public string this[string param]
|
||||
{
|
||||
get
|
||||
{
|
||||
Func<string> func = Functions[param];
|
||||
return func();
|
||||
}
|
||||
}
|
||||
|
||||
public bool ContainsParam(string param)
|
||||
{
|
||||
return Functions.ContainsKey(param);
|
||||
}
|
||||
}
|
67
Katheryne/Modules/WeatherModule.cs
Normal file
67
Katheryne/Modules/WeatherModule.cs
Normal file
|
@ -0,0 +1,67 @@
|
|||
using System.Net.Http.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
using Katheryne.Exceptions;
|
||||
|
||||
namespace Katheryne.Modules;
|
||||
|
||||
public class WeatherModule : ModuleBase
|
||||
{
|
||||
private static readonly HttpClient s_httpClient = new();
|
||||
|
||||
private const string WeatherApi =
|
||||
"https://api.seniverse.com/v3/weather/now.json?key=S7s93MkxJ1q7mgHoj&location=beijing&language=zh-Hans&unit=c";
|
||||
|
||||
private WeatherDto? _weatherDto;
|
||||
|
||||
public override string ModuleName => "weather";
|
||||
|
||||
public WeatherModule()
|
||||
{
|
||||
Functions.Add("text", () => FetchWeatherDate().Now.Text);
|
||||
Functions.Add("temp", () => FetchWeatherDate().Now.Temperature);
|
||||
}
|
||||
|
||||
private WeatherDto FetchWeatherDate()
|
||||
{
|
||||
if (_weatherDto is not null)
|
||||
{
|
||||
if (DateTime.Now - _weatherDto.LastUpdate < TimeSpan.FromMinutes(5))
|
||||
{
|
||||
return _weatherDto;
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
Task<Dictionary<string, List<WeatherDto>>?> task = s_httpClient.GetFromJsonAsync<Dictionary<string, List<WeatherDto>>>(
|
||||
WeatherApi, JsonOptions);
|
||||
task.Wait();
|
||||
Dictionary<string, List<WeatherDto>>? response = task.Result;
|
||||
WeatherDto? weather = response?["results"][0];
|
||||
|
||||
_weatherDto = weather ?? throw new ModuleException("Failed to fetch weather data.");
|
||||
return _weatherDto;
|
||||
}
|
||||
catch (HttpRequestException e)
|
||||
{
|
||||
throw new ModuleException("Failed to fetch weather data.", e);
|
||||
}
|
||||
}
|
||||
|
||||
private class WeatherNowDto
|
||||
{
|
||||
public required string Text { get; set; }
|
||||
|
||||
public required string Code { get; set; }
|
||||
|
||||
public required string Temperature { get; set; }
|
||||
}
|
||||
|
||||
private class WeatherDto
|
||||
{
|
||||
public required WeatherNowDto Now { get; set; }
|
||||
|
||||
[JsonPropertyName("last_update")]
|
||||
public DateTime LastUpdate { get; set; }
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user