67 lines
2.2 KiB
Kotlin
Executable File
67 lines
2.2 KiB
Kotlin
Executable File
package me.leon
|
|
|
|
import com.maxmind.db.CHMCache
|
|
import com.maxmind.geoip2.DatabaseReader
|
|
import java.net.InetAddress
|
|
import me.leon.GeoParser.cityReader
|
|
import me.leon.GeoParser.countryReader
|
|
import me.leon.support.*
|
|
|
|
object GeoParser {
|
|
// register at https://www.maxmind.com/, and download your file
|
|
// https://download.maxmind.com/geoip/databases/GeoLite2-Country/download?suffix=tar.gz
|
|
// todo change it to your own file
|
|
private const val geoDir = "C:/Users/Leon/Desktop/geo"
|
|
private val dbFile = "$geoDir/GeoLite2-City.mmdb".toFile()
|
|
private val dbCountryFile = javaClass.getResource("/GeoLite2-Country.mmdb").file.toFile()
|
|
|
|
val cityReader: DatabaseReader by lazy {
|
|
DatabaseReader.Builder(dbFile).withCache(CHMCache()).build()
|
|
}
|
|
val countryReader: DatabaseReader by lazy {
|
|
DatabaseReader.Builder(dbCountryFile).withCache(CHMCache()).build()
|
|
}
|
|
}
|
|
|
|
private const val CN = "zh-CN"
|
|
|
|
fun String.ipCountryZh() =
|
|
runCatching { countryReader.country(this.toInetAddress()).country.names[CN] }
|
|
.getOrElse {
|
|
println("ipCountryZh error ${it.message}")
|
|
ipInfo()
|
|
} ?: ipInfo()
|
|
|
|
fun InetAddress.ipCountryZh() =
|
|
runCatching { countryReader.country(this).country.names[CN] }.getOrDefault("未知")
|
|
|
|
fun Sub.ipCountryZh(): String =
|
|
runCatching { countryReader.country(SERVER.toInetAddress()).country.names[CN] }
|
|
.getOrDefault(SERVER.ipInfo())
|
|
?: SERVER.ipInfo()
|
|
|
|
private fun String.ipInfo() = runCatching { "CF中转".takeIf { ipCloudFlare() } ?: "未知" }.getOrElse { "未知" }
|
|
|
|
fun String.ipCountryEn(): String =
|
|
runCatching { countryReader.country(this.toInetAddress()).country.isoCode }
|
|
.getOrDefault("UNKNOWN")
|
|
|
|
fun InetAddress.ipCountryEn(): String =
|
|
runCatching { countryReader.country(this).country.isoCode }.getOrDefault("UNKNOWN")
|
|
|
|
fun String.ipCityZh() =
|
|
runCatching {
|
|
cityReader.city(this.toInetAddress()).run {
|
|
mostSpecificSubdivision.names[CN] ?: country.names[CN]
|
|
}
|
|
}
|
|
.getOrDefault("未知")
|
|
|
|
fun String.ipCityEn() =
|
|
runCatching {
|
|
cityReader.city(this.toInetAddress()).run {
|
|
mostSpecificSubdivision.names["en"] ?: country.names["en"]
|
|
}
|
|
}
|
|
.getOrDefault("未知")
|