Clash.Meta/component/mmdb/reader.go

74 lines
1.5 KiB
Go
Raw Normal View History

2023-07-14 22:28:24 +08:00
package mmdb
import (
"fmt"
"net"
2024-03-08 22:45:10 +08:00
"strings"
2023-07-14 22:28:24 +08:00
"github.com/oschwald/maxminddb-golang"
)
type geoip2Country struct {
Country struct {
IsoCode string `maxminddb:"iso_code"`
} `maxminddb:"country"`
}
2024-03-12 03:14:25 +08:00
type IPReader struct {
2023-07-14 22:28:24 +08:00
*maxminddb.Reader
databaseType
}
2024-03-12 03:14:25 +08:00
type ASNReader struct {
*maxminddb.Reader
}
type ASNResult struct {
AutonomousSystemNumber uint32 `maxminddb:"autonomous_system_number"`
AutonomousSystemOrganization string `maxminddb:"autonomous_system_organization"`
}
func (r IPReader) LookupCode(ipAddress net.IP) []string {
2023-07-14 22:28:24 +08:00
switch r.databaseType {
case typeMaxmind:
var country geoip2Country
_ = r.Lookup(ipAddress, &country)
if country.Country.IsoCode == "" {
return []string{}
}
2024-03-08 22:45:10 +08:00
return []string{strings.ToLower(country.Country.IsoCode)}
2023-07-14 22:28:24 +08:00
case typeSing:
var code string
_ = r.Lookup(ipAddress, &code)
if code == "" {
return []string{}
}
return []string{code}
case typeMetaV0:
var record any
_ = r.Lookup(ipAddress, &record)
switch record := record.(type) {
case string:
return []string{record}
case []any: // lookup returned type of slice is []any
2024-03-02 17:41:04 +08:00
result := make([]string, 0, len(record))
for _, item := range record {
result = append(result, item.(string))
}
return result
}
return []string{}
2023-07-14 22:28:24 +08:00
default:
panic(fmt.Sprint("unknown geoip database type:", r.databaseType))
}
}
2024-03-12 03:14:25 +08:00
func (r ASNReader) LookupASN(ip net.IP) ASNResult {
var result ASNResult
r.Lookup(ip, &result)
return result
}