56 lines
1.5 KiB
C#
56 lines
1.5 KiB
C#
using MaxMind.GeoIP2;
|
|
using NetTopologySuite.Geometries;
|
|
using Microsoft.Extensions.Options;
|
|
using Point = NetTopologySuite.Geometries.Point;
|
|
|
|
namespace DysonNetwork.Sphere.Connection;
|
|
|
|
public class GeoIpOptions
|
|
{
|
|
public string DatabasePath { get; set; } = null!;
|
|
}
|
|
|
|
public class GeoIpService(IOptions<GeoIpOptions> options)
|
|
{
|
|
private readonly string _databasePath = options.Value.DatabasePath;
|
|
private readonly GeometryFactory _geometryFactory = new(new PrecisionModel(), 4326); // 4326 is the SRID for WGS84
|
|
|
|
public Point? GetPointFromIp(string? ipAddress)
|
|
{
|
|
if (string.IsNullOrEmpty(ipAddress))
|
|
return null;
|
|
|
|
try
|
|
{
|
|
using var reader = new DatabaseReader(_databasePath);
|
|
var city = reader.City(ipAddress);
|
|
|
|
if (city?.Location == null || !city.Location.HasCoordinates)
|
|
return null;
|
|
|
|
return _geometryFactory.CreatePoint(new Coordinate(
|
|
city.Location.Longitude ?? 0,
|
|
city.Location.Latitude ?? 0));
|
|
}
|
|
catch (Exception)
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public MaxMind.GeoIP2.Responses.CityResponse? GetFromIp(string? ipAddress)
|
|
{
|
|
if (string.IsNullOrEmpty(ipAddress))
|
|
return null;
|
|
|
|
try
|
|
{
|
|
using var reader = new DatabaseReader(_databasePath);
|
|
return reader.City(ipAddress);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
} |