chore: release v0.11
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
// Single source of truth for the app version shown in the UI (header + About).
|
// Single source of truth for the app version shown in the UI (header + About).
|
||||||
// Bump this on a release (the release script updates it alongside telemetry.go).
|
// Bump this on a release (the release script updates it alongside telemetry.go).
|
||||||
export const APP_VERSION = '0.1';
|
export const APP_VERSION = '0.11';
|
||||||
|
|
||||||
// Author / credits, shown in Help → About.
|
// Author / credits, shown in Help → About.
|
||||||
export const APP_AUTHOR = 'F4BPO';
|
export const APP_AUTHOR = 'F4BPO';
|
||||||
|
|||||||
+16
-14
@@ -278,36 +278,38 @@ func stripAnnotation(s string, open, close rune, cb func(string)) string {
|
|||||||
|
|
||||||
// suffixModifiers are non-DXCC-relevant callsign suffixes we strip before
|
// suffixModifiers are non-DXCC-relevant callsign suffixes we strip before
|
||||||
// matching. /P /M /QRP /A and single-digit area changes (/5 …) all keep the
|
// matching. /P /M /QRP /A and single-digit area changes (/5 …) all keep the
|
||||||
// operator's home DXCC. NOTE: "MM" and "AM" are NOT here — a TRAILING /MM or
|
// operator's home DXCC. A TRAILING /MM or /AM (maritime/aeronautical mobile) is
|
||||||
// /AM (maritime/aeronautical mobile) means "no DXCC entity", while a LEADING
|
// handled in normalizeCallsign (stripped, home entity kept) so a LEADING "MM"
|
||||||
// "MM" is the Scotland operating prefix; both are handled in normalizeCallsign.
|
// (the Scotland prefix) isn't mistaken for it.
|
||||||
var suffixModifiers = map[string]bool{
|
var suffixModifiers = map[string]bool{
|
||||||
"P": true, "M": true, "QRP": true, "A": true,
|
"P": true, "M": true, "QRP": true, "A": true,
|
||||||
"PM": true, "LH": true,
|
"PM": true, "LH": true,
|
||||||
}
|
}
|
||||||
|
|
||||||
// normalizeCallsign uppercases, trims, and resolves the "active" call when
|
// normalizeCallsign uppercases, trims, and resolves the "active" call when the
|
||||||
// the operator uses slashes (DL/F4NIE → DL; F4NIE/P → F4NIE). Returns "" for
|
// operator uses slashes (DL/F4NIE → DL; F4NIE/P → F4NIE). A trailing /MM or /AM
|
||||||
// maritime/aeronautical mobile (.../MM, .../AM), which count for no DXCC.
|
// (maritime/aeronautical mobile) is stripped so the home entity still resolves
|
||||||
|
// (YB1SCY/AM → YB1SCY → Indonesia) — strict DXCC says no entity, but the log
|
||||||
|
// should still show the operator's country.
|
||||||
func normalizeCallsign(s string) string {
|
func normalizeCallsign(s string) string {
|
||||||
s = strings.ToUpper(strings.TrimSpace(s))
|
s = strings.ToUpper(strings.TrimSpace(s))
|
||||||
if !strings.ContainsRune(s, '/') {
|
if !strings.ContainsRune(s, '/') {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
parts := strings.Split(s, "/")
|
parts := strings.Split(s, "/")
|
||||||
// A trailing /MM or /AM is maritime/aeronautical mobile → no DXCC entity.
|
|
||||||
// (A leading "MM" is the Scotland prefix and must NOT trigger this.)
|
|
||||||
for i, p := range parts {
|
|
||||||
if i > 0 && (p == "MM" || p == "AM") {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
keep := parts[:0]
|
keep := parts[:0]
|
||||||
var areaDigit byte // a single-digit "/N" re-homes the call to call area N
|
var areaDigit byte // a single-digit "/N" re-homes the call to call area N
|
||||||
for _, p := range parts {
|
for i, p := range parts {
|
||||||
if p == "" {
|
if p == "" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
// A TRAILING /MM (maritime) or /AM (aeronautical) mobile is stripped and
|
||||||
|
// the operator's home entity is kept, so the contact still resolves to a
|
||||||
|
// country in the log (e.g. YB1SCY/AM → Indonesia). A LEADING "MM" is the
|
||||||
|
// Scotland operating prefix (MM/F4NIE) and must NOT be stripped.
|
||||||
|
if i > 0 && (p == "MM" || p == "AM") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
if suffixModifiers[p] {
|
if suffixModifiers[p] {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-4
@@ -1,4 +1,4 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
@@ -13,15 +13,15 @@ import (
|
|||||||
"hamlog/internal/applog"
|
"hamlog/internal/applog"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Anonymous usage telemetry — a once-a-day "app_opened" heartbeat to PostHog so
|
// Anonymous usage telemetry — a once-a-day "app_opened" heartbeat to PostHog so
|
||||||
// the OpsLog author can see how many people actively use it. Privacy by design:
|
// the OpsLog author can see how many people actively use it. Privacy by design:
|
||||||
// only a random install ID + app version + OS are sent (no callsign, no QSO
|
// only a random install ID + app version + OS are sent (no callsign, no QSO
|
||||||
// data, no IP beyond what any HTTP request reveals). Users can disable it in
|
// data, no IP beyond what any HTTP request reveals). Users can disable it in
|
||||||
// Preferences → General. See [[user-analytics-posthog]] notes in MEMORY.
|
// Preferences → General. See [[user-analytics-posthog]] notes in MEMORY.
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// appVersion is stamped on every heartbeat (and could feed the About box).
|
// appVersion is stamped on every heartbeat (and could feed the About box).
|
||||||
appVersion = "0.1"
|
appVersion = "0.11"
|
||||||
|
|
||||||
// posthogHost is the PostHog ingestion endpoint. EU cloud by default; change
|
// posthogHost is the PostHog ingestion endpoint. EU cloud by default; change
|
||||||
// to https://us.i.posthog.com for a US project.
|
// to https://us.i.posthog.com for a US project.
|
||||||
|
|||||||
Reference in New Issue
Block a user