mirror of
https://github.com/TeaOSLab/EdgeCommon.git
synced 2025-11-03 04:10:25 +08:00
337 lines
7.2 KiB
Go
337 lines
7.2 KiB
Go
// Copyright 2022 GoEdge CDN goedge.cdn@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 ""
|
|
}
|
|
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
|
|
}
|
|
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 ""
|
|
}
|
|
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 ""
|
|
}
|
|
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 ""
|
|
}
|
|
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
|
|
}
|
|
|
|
}
|
|
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
|
|
}
|
|
|
|
}
|
|
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
|
|
}
|
|
|
|
}
|
|
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
|
|
}
|
|
|
|
}
|
|
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
|
|
}
|
|
|
|
}
|
|
return 0
|
|
}
|