Files
OpsLog/internal/awardref/dxcciota.go
T
rouggy a8bca8c316 feat(awards): an entity that IS one island group fills its own IOTA reference
QRZ carries <iota> only for the operators who filled it in, and most have not.
But for 99 entities the reference follows from the entity alone — a station in
Ascension is on AF-003 whatever its callbook record says — and the entity is
known for every callsign from cty.dat, with no callbook at all.

So this reaches the operator with no QRZ subscription and the station that has
never touched a callbook, and it lands before the contact is logged, which is
when a reference is worth having.

Filled ONLY when the callbook gave nothing: an operator who typed a reference
knows something a table cannot — an IOTA-heavy entity, a rare island being
activated — and that still wins, as does one picked by hand on the entry.

The table is the IOTA programme's own dxcc_matches_one_iota.json, which lists
exactly the entities that map to ONE reference. France is not among them: a
French station is usually on the mainland and on no island, and guessing would
put a reference on hundreds of contacts that earn none.

Held as a table rather than a download — 3.5 kB that changes when an entity
appears, so fetching it daily would buy nothing and would fail exactly where a
portable station usually is. The header says where it came from and how to
refresh it.

Follows 747c2b9 and eab11db, which read the callbook's own tag.
2026-08-17 02:26:52 +02:00

130 lines
4.8 KiB
Go

package awardref
// One-IOTA DXCC entities: a table of the entities that ARE a single IOTA group.
//
// WHY IT EXISTS. QRZ.com carries <iota> for an operator who fills it in, and
// most do not. But for a great many entities the island reference follows from
// the entity alone — a station in Ascension Island is on AF-003, there is
// nothing else it could be — and the entity is known for every callsign, from
// cty.dat, without any callbook at all. So the reference can be filled for an
// operator with no QRZ subscription, on a station that has never touched a
// callbook, before the contact is logged.
//
// Only entities that map to EXACTLY ONE reference are here. France is not: a
// French station is usually on the mainland and on no island at all, and
// guessing would put a reference on hundreds of contacts that earn none.
//
// SOURCE: dxcc_matches_one_iota.json from the IOTA programme
// (www.iota-world.org/islands-on-the-air/downloads/), fetched 2026-08-17,
// 99 entities. It changes only when an entity appears or IOTA re-maps one, so
// it is a table here rather than a download: it then works offline, which is
// where a portable station usually is. To refresh, fetch that file again and
// re-emit this map, sorted by entity number.
//
// Entity names are comments only, joined from internal/dxcc for readability.
var iotaByDXCC = map[int]string{
5: "EU-002", // Aland Islands
10: "AF-002", // Amsterdam & St. Paul Is.
12: "NA-022", // Anguilla
17: "NA-020", // Aves Island
20: "OC-089", // Baker & Howland Islands
21: "EU-004", // Balearic Islands
24: "AN-002", // Bouvet
29: "AF-004", // Canary Islands
34: "OC-038", // Chatham Islands
35: "OC-002", // Christmas Island
36: "NA-011", // Clipperton Island
37: "NA-012", // Cocos Island
38: "OC-003", // Cocos (Keeling) Islands
41: "AF-008", // Crozet Island
43: "NA-095", // Desecheo Island
45: "EU-001", // Dodecanese
62: "NA-021", // Barbados
64: "NA-005", // Bermuda
65: "NA-023", // British Virgin Islands
69: "NA-016", // Cayman Islands
71: "SA-004", // Galapagos Islands
82: "NA-097", // Jamaica
84: "NA-107", // Martinique
91: "SA-036", // Aruba
94: "NA-100", // Antigua & Barbuda
95: "NA-101", // Dominica
96: "NA-103", // Montserrat
97: "NA-108", // St. Lucia
99: "AF-011", // Glorioso Islands
103: "OC-026", // Guam
105: "NA-015", // Guantanamo Bay
106: "EU-114", // Guernsey
111: "AN-003", // Heard Island
114: "EU-116", // Isle Of Man
118: "EU-022", // Jan Mayen
123: "OC-023", // Johnston Island
131: "AF-048", // Kerguelen Islands
133: "OC-039", // Kermadec Islands
138: "OC-020", // Kure Island
141: "SA-002", // Falkland Islands
147: "OC-004", // Lord Howe Island
153: "AN-005", // Macquarie Island
157: "OC-031", // Nauru
159: "AS-013", // Maldives
161: "SA-007", // Malpelo Island
165: "AF-049", // Mauritius
166: "OC-086", // Mariana Islands
167: "EU-053", // Market Reef
169: "AF-027", // Mayotte
171: "OC-072", // Mellish Reef
174: "OC-030", // Midway Island
177: "OC-073", // Minami Torishima
182: "NA-098", // Navassa Island
188: "OC-040", // Niue
189: "OC-005", // Norfolk Island
190: "OC-097", // Samoa
195: "AF-039", // Annobon Island
199: "AN-004", // Peter 1 Island
201: "AF-021", // Pr. Edward & Marion Is.
205: "AF-003", // Ascension Island
207: "AF-017", // Rodriguez Island
211: "NA-063", // Sable Island
217: "SA-013", // San Felix & San Ambrosio
222: "EU-018", // Faroe Islands
238: "AN-008", // South Orkney Islands
240: "AN-009", // South Sandwich Islands
241: "AN-010", // South Shetland Islands
247: "AS-051", // Spratly Islands
249: "NA-104", // St. Kitts & Nevis
250: "AF-022", // St. Helena
252: "NA-094", // St. Paul Island
253: "SA-014", // St. Peter & St. Paul
257: "EU-023", // Malta
270: "OC-048", // Tokelau Islands
273: "SA-010", // Trindade & Martim Vaz
276: "AF-031", // Tromelin Island
277: "NA-032", // St. Pierre & Miquelon
282: "OC-015", // Tuvalu
283: "AS-004", // Uk Base Areas On Cyprus
285: "NA-106", // Us Virgin Islands
297: "OC-053", // Wake Island
301: "OC-017", // Western Kiribati
303: "OC-007", // Willis Island
381: "AS-019", // Singapore
411: "AF-007", // Comoros
453: "AF-016", // Reunion Island
460: "OC-060", // Rotuma Island
489: "OC-112", // Conway Reef
490: "OC-018", // Banaba Island
505: "AS-110", // Pratas Island
506: "AS-116", // Scarborough Reef
509: "OC-027", // Marquesas Islands
512: "OC-176", // Chesterfield Islands
513: "OC-182", // Ducie Island
515: "OC-200", // Swains Island
516: "NA-146", // St. Barthelemy
517: "SA-099", // Curacao
519: "NA-145", // Saba & St. Eustatius
520: "SA-006", // Bonaire
}
// IOTAForDXCC returns the island reference of a DXCC entity that is a single
// IOTA group, or "" for an entity that holds several islands or none.
func IOTAForDXCC(dxcc int) string { return iotaByDXCC[dxcc] }