65 lines
2.1 KiB
C#
65 lines
2.1 KiB
C#
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;
|
||
|
|
}
|
||
|
|
}
|