Files
MeWeb/src/MeWeb.Core/Knowledge/Providers.cs
T

65 lines
2.1 KiB
C#
Raw Normal View History

using System.Text.Json;
using System.Text.Json.Serialization;
namespace MeWeb.Core.Knowledge;
public class ProviderFact
{
public string Value { get; set; }
public decimal? Price { get; set; }
public string Currency { get; set; }
public string Basis { get; set; }
public string Source { get; set; }
public string Date { get; set; }
}
public class ProviderProfile
{
public string Name { get; set; }
public string Country { get; set; }
public List<uint> Asns { get; set; } = [];
public string Sheet { get; set; }
public ProviderFact Ipv4 { get; set; }
public ProviderFact PublicAddress { get; set; }
public ProviderFact Ipv6 { get; set; }
public ProviderFact Port25 { get; set; }
}
[JsonSourceGenerationOptions(JsonSerializerDefaults.Web)]
[JsonSerializable(typeof(ProviderProfile))]
public partial class KnowledgeJsonContext : JsonSerializerContext
{
}
public sealed class KnowledgeBase
{
readonly Lazy<AsnTable> asn = new(LoadAsn);
readonly Lazy<List<ProviderProfile>> providers = new(LoadProviders);
public bool HasAsnTable => typeof(KnowledgeBase).Assembly.GetManifestResourceInfo("ip2asn.bin") is not null;
public AsnTable Asn => asn.Value;
public IReadOnlyList<ProviderProfile> Providers => providers.Value;
public ProviderProfile ProviderFor(uint number) => number == 0 ? null : Providers.FirstOrDefault(p => p.Asns.Contains(number));
static AsnTable LoadAsn()
{
using var stream = typeof(KnowledgeBase).Assembly.GetManifestResourceStream("ip2asn.bin");
return stream is null ? null : AsnTable.Read(stream);
}
static List<ProviderProfile> LoadProviders()
{
var assembly = typeof(KnowledgeBase).Assembly;
var list = new List<ProviderProfile>();
foreach (var name in assembly.GetManifestResourceNames().Where(n => n.StartsWith("isp.", StringComparison.Ordinal)).Order(StringComparer.Ordinal))
{
using var stream = assembly.GetManifestResourceStream(name);
var profile = JsonSerializer.Deserialize(stream, KnowledgeJsonContext.Default.ProviderProfile);
if (profile is not null) list.Add(profile);
}
return list;
}
}