58 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using MaxMind.GeoIP2;
 | 
						|
using Microsoft.Extensions.Options;
 | 
						|
 | 
						|
namespace DysonNetwork.Shared.GeoIp;
 | 
						|
 | 
						|
public class GeoIpOptions
 | 
						|
{
 | 
						|
    public string DatabasePath { get; set; } = null!;
 | 
						|
}
 | 
						|
 | 
						|
public class GeoIpService(IOptions<GeoIpOptions> options)
 | 
						|
{
 | 
						|
    private readonly string _databasePath = options.Value.DatabasePath;
 | 
						|
    
 | 
						|
    public GeoPoint? GetPointFromIp(string? ipAddress)
 | 
						|
    {
 | 
						|
        if (string.IsNullOrEmpty(ipAddress))
 | 
						|
            return null;
 | 
						|
 | 
						|
        try
 | 
						|
        {
 | 
						|
            using var reader = new DatabaseReader(_databasePath);
 | 
						|
            var city = reader.City(ipAddress);
 | 
						|
            
 | 
						|
            if (city?.Location is not { HasCoordinates: true })
 | 
						|
                return null;
 | 
						|
 | 
						|
            return new GeoPoint()
 | 
						|
            {
 | 
						|
                City = city.City.Name,
 | 
						|
                Country = city.Country.Name,
 | 
						|
                CountryCode = city.Country.IsoCode,
 | 
						|
                Longitude = city.Location.Longitude,
 | 
						|
                Latitude = city.Location.Latitude,
 | 
						|
            };
 | 
						|
        }
 | 
						|
        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;
 | 
						|
        }
 | 
						|
    }
 | 
						|
} |