138 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package main
 | 
						|
 | 
						|
import (
 | 
						|
	_ "embed"
 | 
						|
	"encoding/xml"
 | 
						|
	"regexp"
 | 
						|
	"strings"
 | 
						|
	"unicode/utf8"
 | 
						|
)
 | 
						|
 | 
						|
//go:embed country.xml
 | 
						|
var countryXMLData []byte
 | 
						|
 | 
						|
type Countries struct {
 | 
						|
	XMLName   xml.Name  `xml:"Countries"`
 | 
						|
	Countries []Country `xml:"Country"`
 | 
						|
}
 | 
						|
 | 
						|
type Country struct {
 | 
						|
	XMLName           xml.Name          `xml:"Country"`
 | 
						|
	ArrlPrefix        string            `xml:"ArrlPrefix"`
 | 
						|
	Comment           string            `xml:"Comment"`
 | 
						|
	Continent         string            `xml:"Continent"`
 | 
						|
	CountryName       string            `xml:"CountryName"`
 | 
						|
	CqZone            string            `xml:"CqZone"`
 | 
						|
	CqZoneList        string            `xml:"CqZoneList"`
 | 
						|
	Dxcc              string            `xml:"Dxcc"`
 | 
						|
	ItuZone           string            `xml:"ItuZone"`
 | 
						|
	IaruRegion        string            `xml:"IaruRegion"`
 | 
						|
	ItuZoneList       string            `xml:"ItuZoneList"`
 | 
						|
	Latitude          string            `xml:"Latitude"`
 | 
						|
	Longitude         string            `xml:"Longitude"`
 | 
						|
	Active            string            `xml:"Active"`
 | 
						|
	CountryTag        string            `xml:"CountryTag"`
 | 
						|
	CountryPrefixList CountryPrefixList `xml:"CountryPrefixList"`
 | 
						|
}
 | 
						|
 | 
						|
type CountryPrefixList struct {
 | 
						|
	XMLName           xml.Name        `xml:"CountryPrefixList"`
 | 
						|
	CountryPrefixList []CountryPrefix `xml:"CountryPrefix"`
 | 
						|
}
 | 
						|
 | 
						|
type CountryPrefix struct {
 | 
						|
	XMLName    xml.Name `xml:"CountryPrefix"`
 | 
						|
	PrefixList string   `xml:"PrefixList"`
 | 
						|
	StartDate  string   `xml:"StartDate"`
 | 
						|
	EndDate    string   `xml:"EndDate"`
 | 
						|
}
 | 
						|
 | 
						|
type DXCC struct {
 | 
						|
	Callsign        string
 | 
						|
	CountryName     string
 | 
						|
	DXCC            string
 | 
						|
	RegEx           string
 | 
						|
	RegExSplit      []string
 | 
						|
	RegExCharacters int
 | 
						|
	Ended           bool
 | 
						|
}
 | 
						|
 | 
						|
func LoadCountryFile() Countries {
 | 
						|
	var countries Countries
 | 
						|
 | 
						|
	// Utiliser les données embarquées
 | 
						|
	err := xml.Unmarshal(countryXMLData, &countries)
 | 
						|
	if err != nil {
 | 
						|
		Log.Fatalf("Failed to parse embedded country.xml: %v", err)
 | 
						|
	}
 | 
						|
 | 
						|
	return countries
 | 
						|
}
 | 
						|
 | 
						|
func GetDXCC(dxCall string, Countries Countries) DXCC {
 | 
						|
	DXCCList := []DXCC{}
 | 
						|
	d := DXCC{}
 | 
						|
 | 
						|
	// Get all the matching DXCC for current callsign
 | 
						|
	for i := 0; i < len(Countries.Countries); i++ {
 | 
						|
		if len(Countries.Countries[i].CountryPrefixList.CountryPrefixList) == 0 {
 | 
						|
			continue
 | 
						|
		}
 | 
						|
 | 
						|
		lastPrefix := Countries.Countries[i].CountryPrefixList.CountryPrefixList[len(Countries.Countries[i].CountryPrefixList.CountryPrefixList)-1]
 | 
						|
		regExp := regexp.MustCompile(lastPrefix.PrefixList)
 | 
						|
 | 
						|
		match := regExp.FindStringSubmatch(dxCall)
 | 
						|
		if len(match) != 0 {
 | 
						|
			d = DXCC{
 | 
						|
				Callsign:    dxCall,
 | 
						|
				CountryName: Countries.Countries[i].CountryName,
 | 
						|
				DXCC:        Countries.Countries[i].Dxcc,
 | 
						|
				RegEx:       lastPrefix.PrefixList,
 | 
						|
			}
 | 
						|
 | 
						|
			if lastPrefix.EndDate == "" {
 | 
						|
				d.Ended = false
 | 
						|
			} else {
 | 
						|
				d.Ended = true
 | 
						|
			}
 | 
						|
 | 
						|
			DXCCList = append(DXCCList, d)
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	for i := 0; i < len(DXCCList); i++ {
 | 
						|
		DXCCList[i].RegExSplit = strings.Split(DXCCList[i].RegEx, "|")
 | 
						|
 | 
						|
		for j := 0; j < len(DXCCList[i].RegExSplit); j++ {
 | 
						|
			regExp := regexp.MustCompile(DXCCList[i].RegExSplit[j])
 | 
						|
			matched := regExp.FindStringSubmatch(dxCall)
 | 
						|
			if len(matched) > 0 {
 | 
						|
				DXCCList[i].RegExCharacters = utf8.RuneCountInString(DXCCList[i].RegExSplit[j])
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if len(DXCCList) > 0 {
 | 
						|
		DXCCMatch := DXCCList[0]
 | 
						|
		higherMatch := 0
 | 
						|
 | 
						|
		if len(DXCCList) > 1 {
 | 
						|
			for i := 0; i < len(DXCCList); i++ {
 | 
						|
				if DXCCList[i].RegExCharacters > higherMatch && !DXCCList[i].Ended {
 | 
						|
					DXCCMatch = DXCCList[i]
 | 
						|
					higherMatch = DXCCList[i].RegExCharacters
 | 
						|
				}
 | 
						|
			}
 | 
						|
		} else {
 | 
						|
			DXCCMatch = DXCCList[0]
 | 
						|
		}
 | 
						|
 | 
						|
		return DXCCMatch
 | 
						|
	} else {
 | 
						|
		Log.Warnf("Could not find %s in country list", dxCall)
 | 
						|
	}
 | 
						|
 | 
						|
	return DXCC{}
 | 
						|
}
 |