feat: upload to external services clublog qrz
This commit is contained in:
@@ -45,8 +45,7 @@ type Event struct {
|
||||
DXGrid string // ServiceWSJT (Status)
|
||||
Mode string // ServiceWSJT (Status)
|
||||
FreqHz int64 // ServiceWSJT (Status)
|
||||
LoggedADIF string // ServiceWSJT (LoggedADIF) or ServiceADIF
|
||||
RawText string // generic fallback (n1mm xml, etc.)
|
||||
LoggedADIF string // ServiceWSJT (LoggedADIF), ServiceADIF or ServiceN1MM
|
||||
}
|
||||
|
||||
// Server is a single inbound UDP listener.
|
||||
@@ -187,7 +186,17 @@ func (s *Server) handle(pkt []byte, remote *net.UDPAddr) {
|
||||
ev.FreqHz = w.FreqHz
|
||||
ev.LoggedADIF = w.LoggedADIF
|
||||
case ServiceADIF:
|
||||
ev.LoggedADIF = string(pkt)
|
||||
// JTAlert / GridTracker forward a text ADIF record after a QSO is
|
||||
// logged. Guard against keep-alive / non-ADIF chatter on the socket:
|
||||
// only forward payloads that actually carry a callsign field and a
|
||||
// record terminator.
|
||||
text := string(pkt)
|
||||
low := strings.ToLower(text)
|
||||
if !strings.Contains(low, "<call:") || !strings.Contains(low, "<eor") {
|
||||
applog.Printf("udp: [%s] ADIF payload ignored (no <call:>/<eor>)\n", s.cfg.Name)
|
||||
return
|
||||
}
|
||||
ev.LoggedADIF = text
|
||||
case ServiceRemoteCall:
|
||||
// Common payload shapes seen in the wild:
|
||||
// "F4XYZ" (bare callsign)
|
||||
@@ -217,12 +226,22 @@ func (s *Server) handle(pkt []byte, remote *net.UDPAddr) {
|
||||
}
|
||||
ev.DXCall = strings.ToUpper(parts[len(parts)-1])
|
||||
case ServiceN1MM:
|
||||
ev.RawText = string(pkt)
|
||||
adifText, ok, err := ParseN1MM(pkt)
|
||||
if err != nil {
|
||||
applog.Printf("udp: [%s] N1MM parse error: %v\n", s.cfg.Name, err)
|
||||
return
|
||||
}
|
||||
if !ok {
|
||||
applog.Printf("udp: [%s] N1MM datagram ignored (not a loggable contact)\n", s.cfg.Name)
|
||||
return
|
||||
}
|
||||
applog.Printf("udp: [%s] N1MM contact decoded (%d bytes ADIF)\n", s.cfg.Name, len(adifText))
|
||||
ev.LoggedADIF = adifText
|
||||
default:
|
||||
return
|
||||
}
|
||||
// Empty events are useless; skip.
|
||||
if ev.DXCall == "" && ev.LoggedADIF == "" && ev.RawText == "" {
|
||||
if ev.DXCall == "" && ev.LoggedADIF == "" {
|
||||
return
|
||||
}
|
||||
select {
|
||||
|
||||
Reference in New Issue
Block a user