-
Notifications
You must be signed in to change notification settings - Fork 1
/
jurisdiction.go
150 lines (145 loc) · 4.29 KB
/
jurisdiction.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
package analyze
import (
"context"
"encoding/json"
"log"
"net/http"
"time"
)
// TestForceJurisdiction is normally an empty string. When set to a nonempty
// value by tests, it disables the web requests to fetch ham information and
// instead sets all jurisdictions to the value of TestForceJurisdiction.
var TestForceJurisdiction string
var jurisdictionMap = map[string]string{
"Alameda County": "XAL",
"American Red Cross": "ARC",
"CalFIRE Santa Clara Unit": "SCU",
"CalOES Coastal Region": "COS",
"Campbell": "CBL",
"Contra Costa County": "XCC",
"Cupertino": "CUP",
"Gilroy": "GIL",
"Hospitals": "HOS",
"Loma Prieta": "LMP",
"Los Altos": "LOS",
"Los Altos Hills": "LAH",
"Los Gatos": "LGT",
"Los Gatos/Monte Sereno": "LGT", // per N6PWD 2023-08-20
"Marin County": "XMR",
"Milpitas": "MLP",
"Monte Sereno": "MSO",
"Monterey County": "XMY",
"Morgan Hill": "MRG",
"Mountain View": "MTV",
"NASA/AMES": "NAM",
"Palo Alto": "PAF",
"San Benito County": "XBE",
"San Francisco County": "XSF",
"San Jose": "SJC",
"San Jose Water Co": "SJW",
"San Mateo County": "XSM",
"Santa Clara": "SNC",
"Santa Clara County": "XSC",
"Santa Clara Valley Water District": "VWD",
"Santa Cruz County": "XCZ",
"Saratoga": "SAR",
"Stanford University": "STU",
"Sunnyvale": "SNY",
"Unincorporated": "XSC",
// Plus the identity mappings:
"ARC": "ARC",
"CBL": "CBL",
"COS": "COS",
"CUP": "CUP",
"GIL": "GIL",
"HOS": "HOS",
"LAH": "LAH",
"LGT": "LGT",
"LMP": "LMP",
"LOS": "LOS",
"MLP": "MLP",
"MRG": "MRG",
"MSO": "MSO",
"MTV": "MTV",
"NAM": "NAM",
"PAF": "PAF",
"SAR": "SAR",
"SCU": "SCU",
"SJC": "SJC",
"SJW": "SJW",
"SNC": "SNC",
"SNY": "SNY",
"STU": "STU",
"VWD": "VWD",
"XAL": "XAL",
"XBE": "XBE",
"XCC": "XCC",
"XCZ": "XCZ",
"XMR": "XMR",
"XMY": "XMY",
"XSC": "XSC",
"XSF": "XSF",
"XSM": "XSM",
}
type getHamInfoResponse struct {
CallSign string
Last string
First string
HomeAgency string
OtherAgencies []string
}
func (a *Analysis) fetchJurisdiction() {
var (
timeout context.Context
cancel context.CancelFunc
req *http.Request
resp *http.Response
ghis []*getHamInfoResponse
err error
)
if a.sm.FromCallSign == "" {
return
}
if !fccCallSignRE.MatchString(a.sm.FromCallSign) {
a.sm.Jurisdiction = a.sm.FromCallSign[:3]
return
}
if TestForceJurisdiction != "" {
a.sm.Jurisdiction = TestForceJurisdiction
return
}
timeout, cancel = context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
req, err = http.NewRequestWithContext(timeout, http.MethodGet,
"https://www.scc-ares-races.org/activities/getHamInfo.php?id="+a.sm.FromCallSign, nil)
if err != nil {
panic(err)
}
resp, err = http.DefaultClient.Do(req)
if err != nil {
log.Printf("ERROR: unable to fetch SCCo database info for %s: %s", a.sm.FromCallSign, err)
return
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
log.Printf("ERROR: unable to fetch SCCo database info for %s: status code %d", a.sm.FromCallSign, resp.StatusCode)
return
}
if err = json.NewDecoder(resp.Body).Decode(&ghis); err != nil {
log.Printf("ERROR: unable to fetch SCCo database info for %s: json.Decode: %s", a.sm.FromCallSign, err)
return
}
if len(ghis) != 1 {
log.Printf("ERROR: unable to fetch SCCo database info for %s: %d responses", a.sm.FromCallSign, len(ghis))
return
}
a.sm.Jurisdiction = jurisdictionMap[ghis[0].HomeAgency]
if a.sm.Jurisdiction == "" || a.sm.Jurisdiction == "XSC" || a.sm.Jurisdiction == "HOS" {
for _, other := range ghis[0].OtherAgencies {
if juris := jurisdictionMap[other]; juris != "" && juris != "XSC" && juris != "HOS" {
a.sm.Jurisdiction = juris
break
}
}
}
}