targeting.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package main
  2. import (
  3. "fmt"
  4. "net"
  5. "strings"
  6. )
  7. type TargetOptions int
  8. const (
  9. TargetGlobal = 1 << iota
  10. TargetContinent
  11. TargetCountry
  12. TargetRegionGroup
  13. TargetRegion
  14. )
  15. func (t TargetOptions) GetTargets(ip net.IP) ([]string, int) {
  16. targets := make([]string, 0)
  17. var country, continent string
  18. var netmask int
  19. switch {
  20. case t >= TargetRegionGroup:
  21. var region, regionGroup string
  22. country, continent, regionGroup, region, netmask = geoIP.GetCountryRegion(ip)
  23. if t&TargetRegion > 0 && len(region) > 0 {
  24. targets = append(targets, region)
  25. }
  26. if t&TargetRegionGroup > 0 && len(regionGroup) > 0 {
  27. targets = append(targets, regionGroup)
  28. }
  29. case t >= TargetContinent:
  30. country, continent, netmask = geoIP.GetCountry(ip)
  31. }
  32. if len(country) > 0 {
  33. if t&TargetCountry > 0 {
  34. targets = append(targets, country)
  35. }
  36. if t&TargetContinent > 0 && len(continent) > 0 {
  37. targets = append(targets, continent)
  38. }
  39. }
  40. if t&TargetGlobal > 0 {
  41. targets = append(targets, "@")
  42. }
  43. return targets, netmask
  44. }
  45. func (t TargetOptions) String() string {
  46. targets := make([]string, 0)
  47. if t&TargetGlobal > 0 {
  48. targets = append(targets, "@")
  49. }
  50. if t&TargetContinent > 0 {
  51. targets = append(targets, "continent")
  52. }
  53. if t&TargetCountry > 0 {
  54. targets = append(targets, "country")
  55. }
  56. if t&TargetRegionGroup > 0 {
  57. targets = append(targets, "regiongroup")
  58. }
  59. if t&TargetRegion > 0 {
  60. targets = append(targets, "region")
  61. }
  62. return strings.Join(targets, " ")
  63. }
  64. func parseTargets(v string) (tgt TargetOptions, err error) {
  65. targets := strings.Split(v, " ")
  66. for _, t := range targets {
  67. var x TargetOptions
  68. switch t {
  69. case "@":
  70. x = TargetGlobal
  71. case "country":
  72. x = TargetCountry
  73. case "continent":
  74. x = TargetContinent
  75. case "regiongroup":
  76. x = TargetRegionGroup
  77. case "region":
  78. x = TargetRegion
  79. default:
  80. err = fmt.Errorf("Unknown targeting option '%s'", t)
  81. }
  82. tgt = tgt | x
  83. }
  84. return
  85. }