chore: release v021.4
This commit is contained in:
@@ -138,7 +138,30 @@ func (m *Manager) SetConfig(cfg ExternalServices) {
|
||||
cfg.LoTW = cfg.LoTW.normalised()
|
||||
cfg.HRDLog = cfg.HRDLog.normalised()
|
||||
cfg.EQSL = cfg.EQSL.normalised()
|
||||
cfg.Cloudlog = cfg.Cloudlog.normalised()
|
||||
m.cfg = cfg
|
||||
|
||||
// Summary of what is armed, written at startup and on every settings save.
|
||||
// It answers "is the service even switched on for this profile?" — the
|
||||
// settings are per-profile, so a service configured under another profile
|
||||
// looks enabled in the UI of the one and silent in the other.
|
||||
var on []string
|
||||
for _, s := range []struct {
|
||||
name string
|
||||
cfg ServiceConfig
|
||||
}{
|
||||
{"qrz", cfg.QRZ}, {"clublog", cfg.Clublog}, {"lotw", cfg.LoTW},
|
||||
{"hrdlog", cfg.HRDLog}, {"eqsl", cfg.EQSL}, {"cloudlog", cfg.Cloudlog},
|
||||
} {
|
||||
if s.cfg.AutoUpload {
|
||||
on = append(on, fmt.Sprintf("%s(%s)", s.name, s.cfg.UploadMode))
|
||||
}
|
||||
}
|
||||
if len(on) == 0 {
|
||||
m.logf("extsvc: auto-upload disabled for every service")
|
||||
} else {
|
||||
m.logf("extsvc: auto-upload armed for %s", strings.Join(on, " "))
|
||||
}
|
||||
}
|
||||
|
||||
// Config returns the current snapshot.
|
||||
@@ -182,6 +205,28 @@ func (m *Manager) OnQSOLogged(id int64) {
|
||||
if e := cfg.EQSL; e.AutoUpload && e.Username != "" && e.Password != "" {
|
||||
m.route(ServiceEQSL, id, e)
|
||||
}
|
||||
// Cloudlog / Wavelog — the instance URL, an API key and the station id.
|
||||
if c := cfg.Cloudlog; c.AutoUpload {
|
||||
// Say WHY nothing happens when the toggle is on but a field is missing.
|
||||
// Without this the whole path was silent — the operator saw no upload and
|
||||
// no log line, with no way to tell "disabled" from "broken".
|
||||
var missing []string
|
||||
if c.URL == "" {
|
||||
missing = append(missing, "URL")
|
||||
}
|
||||
if c.APIKey == "" {
|
||||
missing = append(missing, "API key")
|
||||
}
|
||||
if c.StationID == "" {
|
||||
missing = append(missing, "station ID")
|
||||
}
|
||||
if len(missing) > 0 {
|
||||
m.logf("extsvc: cloudlog auto-upload is ON but not configured — missing %s (QSO %d not sent)",
|
||||
strings.Join(missing, ", "), id)
|
||||
} else {
|
||||
m.route(ServiceCloudlog, id, c)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// route sends a logged QSO down the configured timing path: queue it for the
|
||||
@@ -229,6 +274,9 @@ func (m *Manager) onCloseServices() []Service {
|
||||
if e := cfg.EQSL; e.AutoUpload && e.UploadMode == ModeOnClose && e.Username != "" && e.Password != "" {
|
||||
out = append(out, ServiceEQSL)
|
||||
}
|
||||
if c := cfg.Cloudlog; c.AutoUpload && c.UploadMode == ModeOnClose && c.URL != "" && c.APIKey != "" && c.StationID != "" {
|
||||
out = append(out, ServiceCloudlog)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
@@ -288,6 +336,12 @@ func (m *Manager) FlushOnClose() int {
|
||||
uploaded++
|
||||
}
|
||||
}
|
||||
case ServiceCloudlog:
|
||||
for _, id := range ids {
|
||||
if ok, _ := m.upload(svc, id, cfg.Cloudlog); ok {
|
||||
uploaded++
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return uploaded
|
||||
@@ -376,6 +430,11 @@ func (m *Manager) upload(svc Service, id int64, cfg ServiceConfig) (ok bool, ret
|
||||
}
|
||||
}
|
||||
|
||||
// One line per attempt, BEFORE the request: a failure that never returns
|
||||
// (hung TCP connect to a self-hosted instance) otherwise leaves no trace at
|
||||
// all, and "did it even try?" is the first question when an upload is missing.
|
||||
m.logf("extsvc: %s uploading QSO %d…", svc, id)
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
||||
defer cancel()
|
||||
|
||||
@@ -426,6 +485,15 @@ func (m *Manager) upload(svc Service, id int64, cfg ServiceConfig) (ok bool, ret
|
||||
return false, false
|
||||
}
|
||||
res, err = UploadEQSL(ctx, m.deps.Client, cfg.Username, cfg.Password, cfg.QTHNickname, record)
|
||||
case ServiceCloudlog:
|
||||
// Cloudlog/Wavelog file the QSO under a station profile chosen by id,
|
||||
// so the ADIF keeps the QSO's own station call (no override).
|
||||
record, ok := m.deps.BuildADIF(id, "")
|
||||
if !ok {
|
||||
m.logf("extsvc: %s upload of QSO %d skipped (no record)", svc, id)
|
||||
return false, false
|
||||
}
|
||||
res, err = UploadCloudlog(ctx, m.deps.Client, cfg, record)
|
||||
default:
|
||||
return false, false
|
||||
}
|
||||
@@ -441,7 +509,7 @@ func (m *Manager) upload(svc Service, id int64, cfg ServiceConfig) (ok bool, ret
|
||||
return false, true // transient (rate-limit / network) → worth a retry
|
||||
}
|
||||
|
||||
m.logf("extsvc: %s upload of QSO %d OK (logid=%q)", svc, id, res.LogID)
|
||||
m.logf("extsvc: %s upload of QSO %d OK (logid=%q) %s", svc, id, res.LogID, res.Message)
|
||||
if m.deps.MarkUploaded != nil {
|
||||
m.deps.MarkUploaded(svc, id, res.LogID)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user