Use BM repeaters to filter for real repeaters

This commit is contained in:
Marcus Kida 2026-02-09 09:37:23 +01:00
parent 71be66c5b4
commit 9a08f34e72
4 changed files with 39 additions and 2 deletions

View file

@ -10,5 +10,6 @@ WORKDIR /app
COPY --from=builder /build/dmrmap . COPY --from=builder /build/dmrmap .
COPY static/ ./static/ COPY static/ ./static/
COPY rptrs.json . COPY rptrs.json .
COPY bmrptrs.json .
EXPOSE 8080 EXPOSE 8080
CMD ["./dmrmap"] CMD ["./dmrmap"]

2
bmrptrs.json Normal file

File diff suppressed because one or more lines are too long

View file

@ -9,13 +9,14 @@ import (
func main() { func main() {
dbPath := envOr("DB_PATH", "data/repeaters.db") dbPath := envOr("DB_PATH", "data/repeaters.db")
jsonPath := envOr("JSON_PATH", "rptrs.json") jsonPath := envOr("JSON_PATH", "rptrs.json")
bmrptrsPath := envOr("BMRPTRS_PATH", "bmrptrs.json")
addr := envOr("LISTEN_ADDR", ":8080") addr := envOr("LISTEN_ADDR", ":8080")
if err := os.MkdirAll("data", 0755); err != nil { if err := os.MkdirAll("data", 0755); err != nil {
log.Fatalf("Failed to create data directory: %v", err) log.Fatalf("Failed to create data directory: %v", err)
} }
if err := seedDatabase(dbPath, jsonPath); err != nil { if err := seedDatabase(dbPath, jsonPath, bmrptrsPath); err != nil {
log.Fatalf("Failed to seed database: %v", err) log.Fatalf("Failed to seed database: %v", err)
} }

35
seed.go
View file

@ -32,7 +32,35 @@ type rawData struct {
Rptrs []rawRepeater `json:"rptrs"` Rptrs []rawRepeater `json:"rptrs"`
} }
func seedDatabase(dbPath, jsonPath string) error { type bmRepeater struct {
ID int `json:"ID"`
Call string `json:"Call"`
Owner string `json:"Owner"`
}
func loadBMRepeaters(path string) map[string]bool {
f, err := os.Open(path)
if err != nil {
log.Printf("Warning: could not open BM repeaters file %s: %v", path, err)
return map[string]bool{}
}
defer f.Close()
var rptrs []bmRepeater
if err := json.NewDecoder(f).Decode(&rptrs); err != nil {
log.Printf("Warning: could not decode BM repeaters file %s: %v", path, err)
return map[string]bool{}
}
set := make(map[string]bool, len(rptrs))
for _, r := range rptrs {
set[strings.ToUpper(strings.TrimSpace(r.Call))] = true
}
log.Printf("Loaded %d BM repeater callsigns from %s", len(set), path)
return set
}
func seedDatabase(dbPath, jsonPath, bmrptrsPath string) error {
db, err := openDB(dbPath) db, err := openDB(dbPath)
if err != nil { if err != nil {
return fmt.Errorf("open db: %w", err) return fmt.Errorf("open db: %w", err)
@ -63,6 +91,8 @@ func seedDatabase(dbPath, jsonPath string) error {
return fmt.Errorf("decode json: %w", err) return fmt.Errorf("decode json: %w", err)
} }
bmSet := loadBMRepeaters(bmrptrsPath)
tx, err := db.Begin() tx, err := db.Begin()
if err != nil { if err != nil {
return fmt.Errorf("begin tx: %w", err) return fmt.Errorf("begin tx: %w", err)
@ -97,6 +127,9 @@ func seedDatabase(dbPath, jsonPath string) error {
if isHotspot(r.Offset, r.City, r.MapInfo, r.Callsign, r.Country, r.Trustee) { if isHotspot(r.Offset, r.City, r.MapInfo, r.Callsign, r.Country, r.Trustee) {
hotspot = 1 hotspot = 1
hotspots++ hotspots++
} else if network == "Brandmeister" && len(bmSet) > 0 && !bmSet[strings.ToUpper(strings.TrimSpace(r.Callsign))] {
hotspot = 1
hotspots++
} }
if _, err := stmt.Exec(r.ID, r.Callsign, freq, band, lat, lng, if _, err := stmt.Exec(r.ID, r.Callsign, freq, band, lat, lng,
r.City, r.State, r.Country, r.ColorCode, r.Offset, r.City, r.State, r.Country, r.ColorCode, r.Offset,