utils.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. "log"
  6. "reflect"
  7. "strings"
  8. "github.com/honwen/golibs/cip"
  9. "github.com/honwen/ip2loc"
  10. )
  11. var funcs = map[string]interface{}{
  12. "myip": cip.MyIPv4,
  13. "reslove": cip.ResloveIPv4,
  14. }
  15. func contains(slice []string, item string) bool {
  16. set := make(map[string]struct{}, len(slice))
  17. for _, s := range slice {
  18. set[s] = struct{}{}
  19. }
  20. _, ok := set[item]
  21. return ok
  22. }
  23. func ip2locCN(ip string) (str string) {
  24. if strings.Count(ip, `.`) < 3 {
  25. return
  26. }
  27. if loc, err := ip2loc.IP2loc(ip); err != nil {
  28. log.Printf("%+v", err)
  29. } else {
  30. str = fmt.Sprintf("[%s %s %s %s]", loc.CountryName, loc.RegionName, loc.CityName, loc.IspDomain)
  31. for strings.Contains(str, " ]") {
  32. str = strings.ReplaceAll(str, " ]", "]")
  33. }
  34. for strings.Contains(str, " ") {
  35. str = strings.ReplaceAll(str, " ", " ")
  36. }
  37. }
  38. return
  39. }
  40. func Call(m map[string]interface{}, name string, params ...interface{}) (result []reflect.Value, err error) {
  41. f := reflect.ValueOf(m[name])
  42. if len(params) != f.Type().NumIn() {
  43. err = errors.New("The number of params is not adapted.")
  44. return
  45. }
  46. in := make([]reflect.Value, len(params))
  47. for k, param := range params {
  48. in[k] = reflect.ValueOf(param)
  49. }
  50. result = f.Call(in)
  51. return
  52. }
  53. func myip() (ip string) {
  54. if result, err := Call(funcs, "myip"); err == nil {
  55. for _, r := range result {
  56. return r.String()
  57. }
  58. }
  59. return
  60. }
  61. func reslove(domain string) (ip string) {
  62. if result, err := Call(funcs, "reslove", domain); err == nil {
  63. for _, r := range result {
  64. return r.String()
  65. }
  66. }
  67. return
  68. }