Files
waf-platform/EdgeCommon/pkg/iplibrary/reader_result.go
2026-02-04 20:27:13 +08:00

435 lines
9.6 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
package iplibrary
import (
"github.com/iwind/TeaGo/lists"
"strings"
)
type QueryResult struct {
item any
meta *Meta
}
func (this *QueryResult) IsOk() bool {
return this.item != nil
}
func (this *QueryResult) CountryId() int64 {
return int64(this.realCountryId())
}
func (this *QueryResult) CountryName() string {
if this.item == nil {
return ""
}
// MaxMind 结果:直接使用名称
if maxItem, ok := this.item.(*maxMindItem); ok {
// 优先使用中文名称
if len(maxItem.Record.Country.Names["zh-CN"]) > 0 {
return maxItem.Record.Country.Names["zh-CN"]
}
// 其次使用英文名称
if len(maxItem.Record.Country.Names["en"]) > 0 {
return maxItem.Record.Country.Names["en"]
}
// 使用任何可用的名称
for _, name := range maxItem.Record.Country.Names {
if len(name) > 0 {
return name
}
}
return ""
}
// 原有逻辑
var countryId = this.realCountryId()
if countryId > 0 {
var country = this.meta.CountryWithId(countryId)
if country != nil {
return country.Name
}
}
return ""
}
func (this *QueryResult) CountryCodes() []string {
if this.item == nil {
return nil
}
// MaxMind 结果:使用 Country.IsoCodeISO 3166-1 alpha-2供智能 DNS 线路解析等使用
if maxItem, ok := this.item.(*maxMindItem); ok {
if len(maxItem.Record.Country.IsoCode) > 0 {
return []string{maxItem.Record.Country.IsoCode}
}
return nil
}
var countryId = this.realCountryId()
if countryId > 0 {
var country = this.meta.CountryWithId(countryId)
if country != nil {
return country.Codes
}
}
return nil
}
func (this *QueryResult) ProvinceId() int64 {
return int64(this.realProvinceId())
}
func (this *QueryResult) ProvinceName() string {
if this.item == nil {
return ""
}
// MaxMind 结果:使用 Subdivisions省份/州)
if maxItem, ok := this.item.(*maxMindItem); ok {
if len(maxItem.Record.Subdivisions) > 0 {
subdivision := maxItem.Record.Subdivisions[0]
// 优先使用中文名称
if len(subdivision.Names["zh-CN"]) > 0 {
return subdivision.Names["zh-CN"]
}
// 其次使用英文名称
if len(subdivision.Names["en"]) > 0 {
return subdivision.Names["en"]
}
// 使用任何可用的名称
for _, name := range subdivision.Names {
if len(name) > 0 {
return name
}
}
}
return ""
}
// 原有逻辑
var provinceId = this.realProvinceId()
if provinceId > 0 {
var province = this.meta.ProvinceWithId(provinceId)
if province != nil {
return province.Name
}
}
return ""
}
func (this *QueryResult) ProvinceCodes() []string {
if this.item == nil {
return nil
}
var provinceId = this.realProvinceId()
if provinceId > 0 {
var province = this.meta.ProvinceWithId(provinceId)
if province != nil {
return province.Codes
}
}
return nil
}
func (this *QueryResult) CityId() int64 {
return int64(this.realCityId())
}
func (this *QueryResult) CityName() string {
if this.item == nil {
return ""
}
// MaxMind 结果:直接使用名称
if maxItem, ok := this.item.(*maxMindItem); ok {
// 优先使用中文名称
if len(maxItem.Record.City.Names["zh-CN"]) > 0 {
return maxItem.Record.City.Names["zh-CN"]
}
// 其次使用英文名称
if len(maxItem.Record.City.Names["en"]) > 0 {
return maxItem.Record.City.Names["en"]
}
// 使用任何可用的名称
for _, name := range maxItem.Record.City.Names {
if len(name) > 0 {
return name
}
}
return ""
}
// 原有逻辑
var cityId = this.realCityId()
if cityId > 0 {
var city = this.meta.CityWithId(cityId)
if city != nil {
return city.Name
}
}
return ""
}
func (this *QueryResult) TownId() int64 {
return int64(this.realTownId())
}
func (this *QueryResult) TownName() string {
if this.item == nil {
return ""
}
var townId = this.realTownId()
if townId > 0 {
var town = this.meta.TownWithId(townId)
if town != nil {
return town.Name
}
}
return ""
}
func (this *QueryResult) ProviderId() int64 {
return int64(this.realProviderId())
}
func (this *QueryResult) ProviderName() string {
if this.item == nil {
return ""
}
// MaxMind 结果:使用 ASN 组织作为 ISP
if maxItem, ok := this.item.(*maxMindItem); ok {
if len(maxItem.ASNOrg) > 0 {
return maxItem.ASNOrg
}
return ""
}
// 原有逻辑
var providerId = this.realProviderId()
if providerId > 0 {
var provider = this.meta.ProviderWithId(providerId)
if provider != nil {
return provider.Name
}
}
return ""
}
func (this *QueryResult) ProviderCodes() []string {
if this.item == nil {
return nil
}
var providerId = this.realProviderId()
if providerId > 0 {
var provider = this.meta.ProviderWithId(providerId)
if provider != nil {
return provider.Codes
}
}
return nil
}
func (this *QueryResult) Summary() string {
if this.item == nil {
return ""
}
var pieces = []string{}
var countryName = this.CountryName()
var provinceName = this.ProvinceName()
var cityName = this.CityName()
var townName = this.TownName()
var providerName = this.ProviderName()
if len(countryName) > 0 {
pieces = append(pieces, countryName)
}
if len(provinceName) > 0 && !lists.ContainsString(pieces, provinceName) {
pieces = append(pieces, provinceName)
}
if len(cityName) > 0 && !lists.ContainsString(pieces, cityName) && !lists.ContainsString(pieces, strings.TrimSuffix(cityName, "市")) {
pieces = append(pieces, cityName)
}
if len(townName) > 0 && !lists.ContainsString(pieces, townName) && !lists.ContainsString(pieces, strings.TrimSuffix(townName, "县")) {
pieces = append(pieces, townName)
}
if len(providerName) > 0 && !lists.ContainsString(pieces, providerName) {
if len(pieces) > 0 {
pieces = append(pieces, "|")
}
pieces = append(pieces, providerName)
}
return strings.Join(pieces, " ")
}
func (this *QueryResult) RegionSummary() string {
if this.item == nil {
return ""
}
var pieces = []string{}
var countryName = this.CountryName()
var provinceName = this.ProvinceName()
var cityName = this.CityName()
var townName = this.TownName()
if len(countryName) > 0 {
pieces = append(pieces, countryName)
}
if len(provinceName) > 0 && !lists.ContainsString(pieces, provinceName) {
pieces = append(pieces, provinceName)
}
if len(cityName) > 0 && !lists.ContainsString(pieces, cityName) && !lists.ContainsString(pieces, strings.TrimSuffix(cityName, "市")) {
pieces = append(pieces, cityName)
}
if len(townName) > 0 && !lists.ContainsString(pieces, townName) && !lists.ContainsString(pieces, strings.TrimSuffix(townName, "县")) {
pieces = append(pieces, townName)
}
return strings.Join(pieces, " ")
}
func (this *QueryResult) realCountryId() uint16 {
if this.item != nil {
switch item := this.item.(type) {
case *ipv4ItemV1:
return item.Region.CountryId
case ipv4ItemV1:
return item.Region.CountryId
case *ipv6ItemV1:
return item.Region.CountryId
case ipv6ItemV1:
return item.Region.CountryId
case *ipv4ItemV2:
return item.Region.CountryId
case ipv4ItemV2:
return item.Region.CountryId
case *ipv6ItemV2:
return item.Region.CountryId
case ipv6ItemV2:
return item.Region.CountryId
case *maxMindItem:
// MaxMind 不使用 ID返回 0
return 0
}
}
return 0
}
func (this *QueryResult) realProvinceId() uint16 {
if this.item != nil {
switch item := this.item.(type) {
case *ipv4ItemV1:
return item.Region.ProvinceId
case ipv4ItemV1:
return item.Region.ProvinceId
case *ipv6ItemV1:
return item.Region.ProvinceId
case ipv6ItemV1:
return item.Region.ProvinceId
case *ipv4ItemV2:
return item.Region.ProvinceId
case ipv4ItemV2:
return item.Region.ProvinceId
case *ipv6ItemV2:
return item.Region.ProvinceId
case ipv6ItemV2:
return item.Region.ProvinceId
case *maxMindItem:
// MaxMind 不使用 ID返回 0
return 0
}
}
return 0
}
func (this *QueryResult) realCityId() uint32 {
if this.item != nil {
switch item := this.item.(type) {
case *ipv4ItemV1:
return item.Region.CityId
case ipv4ItemV1:
return item.Region.CityId
case *ipv6ItemV1:
return item.Region.CityId
case ipv6ItemV1:
return item.Region.CityId
case *ipv4ItemV2:
return item.Region.CityId
case ipv4ItemV2:
return item.Region.CityId
case *ipv6ItemV2:
return item.Region.CityId
case ipv6ItemV2:
return item.Region.CityId
case *maxMindItem:
// MaxMind 不使用 ID返回 0
return 0
}
}
return 0
}
func (this *QueryResult) realTownId() uint32 {
if this.item != nil {
switch item := this.item.(type) {
case *ipv4ItemV1:
return item.Region.TownId
case ipv4ItemV1:
return item.Region.TownId
case *ipv6ItemV1:
return item.Region.TownId
case ipv6ItemV1:
return item.Region.TownId
case *ipv4ItemV2:
return item.Region.TownId
case ipv4ItemV2:
return item.Region.TownId
case *ipv6ItemV2:
return item.Region.TownId
case ipv6ItemV2:
return item.Region.TownId
case *maxMindItem:
// MaxMind 不使用 ID返回 0
return 0
}
}
return 0
}
func (this *QueryResult) realProviderId() uint16 {
if this.item != nil {
switch item := this.item.(type) {
case *ipv4ItemV1:
return item.Region.ProviderId
case ipv4ItemV1:
return item.Region.ProviderId
case *ipv6ItemV1:
return item.Region.ProviderId
case ipv6ItemV1:
return item.Region.ProviderId
case *ipv4ItemV2:
return item.Region.ProviderId
case ipv4ItemV2:
return item.Region.ProviderId
case *ipv6ItemV2:
return item.Region.ProviderId
case ipv6ItemV2:
return item.Region.ProviderId
case *maxMindItem:
// MaxMind 不使用 ID返回 0
return 0
}
}
return 0
}