mirror of
https://github.com/Li4n0/revsuit.git
synced 2026-09-26 16:41:53 +08:00
feat(ipinfo): support GeoIP (#26)
Co-authored-by: E99p1ant <[email protected]>
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
package qqwry
|
||||
|
||||
import (
|
||||
"os"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/sinlov/qqwry-golang/qqwry"
|
||||
log "unknwon.dev/clog/v2"
|
||||
)
|
||||
|
||||
type Database struct {
|
||||
wry *qqwry.QQwry
|
||||
}
|
||||
|
||||
// Area returns IpArea according to ip
|
||||
func (db *Database) Area(ip string) string {
|
||||
defer func() {
|
||||
_ = recover()
|
||||
}()
|
||||
if db.wry == nil {
|
||||
return ""
|
||||
}
|
||||
ipData := db.wry.SearchByIPv4(ip)
|
||||
if ipData.Area == " CZ88.NET" {
|
||||
return ipData.Country
|
||||
}
|
||||
return ipData.Country + " " + ipData.Area
|
||||
}
|
||||
|
||||
var wry *qqwry.QQwry
|
||||
var once sync.Once
|
||||
|
||||
func checkUpdate() {
|
||||
info, err := os.Stat("qqwry.dat")
|
||||
if err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
err := download()
|
||||
if err != nil {
|
||||
log.Warn("Download qqwry.dat failed, caused by:%v, recommend to download it by yourself otherwise the `IpArea` will be null", err)
|
||||
}
|
||||
}
|
||||
} else if -time.Until(info.ModTime()) > 7*24*time.Hour {
|
||||
log.Info("Updating qqwry.dat...")
|
||||
err := download()
|
||||
if err != nil {
|
||||
log.Warn("Update qqwry.dat failed, please download qqwry.dat by yourself")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func New() *Database {
|
||||
once.Do(func() {
|
||||
checkUpdate()
|
||||
qqwry.DatData.FilePath = "qqwry.dat"
|
||||
init := qqwry.DatData.InitDatFile()
|
||||
if v, ok := init.(error); ok {
|
||||
if v != nil {
|
||||
log.Warn("qqwry init failed")
|
||||
wry = nil
|
||||
}
|
||||
}
|
||||
wry = qqwry.NewQQwry()
|
||||
})
|
||||
return &Database{wry: wry}
|
||||
}
|
||||
Reference in New Issue
Block a user