mirror of
https://github.com/gesellix/Bose-SoundTouch.git
synced 2026-08-18 08:36:13 +00:00
- Used 'golangci-lint run --fix' to automatically resolve formatting issues - Fixed all 52 remaining wsl_v5 (whitespace) issues automatically - Applied go fmt to ensure consistent formatting across codebase - Touched 49 files with automatic formatting improvements MAJOR PROGRESS: Reduced total issues from 79 to 27 (66% reduction!) Remaining issues: - gocyclo: 14 (complexity - requires manual refactoring) - revive: 5 (style/naming) - staticcheck: 5 (static analysis) - unparam: 3 (unused parameters)
387 lines
9.5 KiB
Go
387 lines
9.5 KiB
Go
package models
|
|
|
|
import (
|
|
"encoding/xml"
|
|
"fmt"
|
|
"net"
|
|
"strings"
|
|
)
|
|
|
|
// NetworkInformation represents network information from the /networkInfo endpoint
|
|
type NetworkInformation struct {
|
|
XMLName xml.Name `xml:"networkInfo"`
|
|
WifiProfileCount int `xml:"wifiProfileCount,attr,omitempty"`
|
|
Interfaces NetworkInterfaces `xml:"interfaces"`
|
|
}
|
|
|
|
// NetworkInterfaces represents the interfaces container
|
|
type NetworkInterfaces struct {
|
|
XMLName xml.Name `xml:"interfaces"`
|
|
Interfaces []NetworkInterface `xml:"interface"`
|
|
}
|
|
|
|
// NetworkInterface represents a single network interface
|
|
type NetworkInterface struct {
|
|
XMLName xml.Name `xml:"interface"`
|
|
Type string `xml:"type,attr"`
|
|
Name string `xml:"name,attr,omitempty"`
|
|
MacAddress string `xml:"macAddress,attr,omitempty"`
|
|
IPAddress string `xml:"ipAddress,attr,omitempty"`
|
|
SSID string `xml:"ssid,attr,omitempty"`
|
|
FrequencyKHz int `xml:"frequencyKHz,attr,omitempty"`
|
|
State string `xml:"state,attr,omitempty"`
|
|
Signal string `xml:"signal,attr,omitempty"`
|
|
Mode string `xml:"mode,attr,omitempty"`
|
|
}
|
|
|
|
// Interface types
|
|
const (
|
|
InterfaceTypeWiFi = "WIFI_INTERFACE"
|
|
InterfaceTypeEthernet = "ETHERNET_INTERFACE"
|
|
)
|
|
|
|
// Interface states
|
|
const (
|
|
StateWiFiConnected = "NETWORK_WIFI_CONNECTED"
|
|
StateWiFiDisconnected = "NETWORK_WIFI_DISCONNECTED"
|
|
StateEthernetConnected = "NETWORK_ETHERNET_CONNECTED"
|
|
StateEthernetDisconnected = "NETWORK_ETHERNET_DISCONNECTED"
|
|
)
|
|
|
|
// Signal strength levels
|
|
const (
|
|
SignalExcellent = "EXCELLENT_SIGNAL"
|
|
SignalGood = "GOOD_SIGNAL"
|
|
SignalFair = "FAIR_SIGNAL"
|
|
SignalPoor = "POOR_SIGNAL"
|
|
)
|
|
|
|
// WiFi modes
|
|
const (
|
|
ModeStation = "STATION"
|
|
ModeAccessPoint = "ACCESS_POINT"
|
|
)
|
|
|
|
// GetWifiProfileCount returns the number of WiFi profiles
|
|
func (n *NetworkInformation) GetWifiProfileCount() int {
|
|
return n.WifiProfileCount
|
|
}
|
|
|
|
// GetInterfaces returns all network interfaces
|
|
func (n *NetworkInformation) GetInterfaces() []NetworkInterface {
|
|
return n.Interfaces.Interfaces
|
|
}
|
|
|
|
// GetInterfaceByType returns the first interface of the specified type
|
|
func (n *NetworkInformation) GetInterfaceByType(interfaceType string) *NetworkInterface {
|
|
interfaces := n.GetInterfaces()
|
|
for i := range interfaces {
|
|
if strings.EqualFold(interfaces[i].Type, interfaceType) {
|
|
return &interfaces[i]
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// GetActiveInterfaces returns only active/connected interfaces
|
|
func (n *NetworkInformation) GetActiveInterfaces() []NetworkInterface {
|
|
var active []NetworkInterface
|
|
|
|
interfaces := n.GetInterfaces()
|
|
for i := range interfaces {
|
|
if interfaces[i].IsConnected() {
|
|
active = append(active, interfaces[i])
|
|
}
|
|
}
|
|
|
|
return active
|
|
}
|
|
|
|
// HasWiFi returns true if the device has WiFi connectivity
|
|
func (n *NetworkInformation) HasWiFi() bool {
|
|
return n.GetInterfaceByType(InterfaceTypeWiFi) != nil
|
|
}
|
|
|
|
// HasEthernet returns true if the device has Ethernet connectivity
|
|
func (n *NetworkInformation) HasEthernet() bool {
|
|
return n.GetInterfaceByType(InterfaceTypeEthernet) != nil
|
|
}
|
|
|
|
// GetConnectedWiFiInterface returns the connected WiFi interface if available
|
|
func (n *NetworkInformation) GetConnectedWiFiInterface() *NetworkInterface {
|
|
interfaces := n.GetInterfaces()
|
|
for i := range interfaces {
|
|
if interfaces[i].IsWiFi() && interfaces[i].IsConnected() {
|
|
return &interfaces[i]
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// GetConnectedEthernetInterface returns the connected Ethernet interface if available
|
|
func (n *NetworkInformation) GetConnectedEthernetInterface() *NetworkInterface {
|
|
interfaces := n.GetInterfaces()
|
|
for i := range interfaces {
|
|
if interfaces[i].IsEthernet() && interfaces[i].IsConnected() {
|
|
return &interfaces[i]
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// IsEmpty returns true if there's no network information
|
|
func (n *NetworkInformation) IsEmpty() bool {
|
|
return len(n.GetInterfaces()) == 0
|
|
}
|
|
|
|
// Interface methods
|
|
|
|
// GetType returns the interface type
|
|
func (ni *NetworkInterface) GetType() string {
|
|
return ni.Type
|
|
}
|
|
|
|
// GetName returns the interface name
|
|
func (ni *NetworkInterface) GetName() string {
|
|
return ni.Name
|
|
}
|
|
|
|
// GetMacAddress returns the MAC address
|
|
func (ni *NetworkInterface) GetMacAddress() string {
|
|
return ni.MacAddress
|
|
}
|
|
|
|
// GetIPAddress returns the IP address
|
|
func (ni *NetworkInterface) GetIPAddress() string {
|
|
return ni.IPAddress
|
|
}
|
|
|
|
// GetSSID returns the WiFi SSID (only for WiFi interfaces)
|
|
func (ni *NetworkInterface) GetSSID() string {
|
|
return ni.SSID
|
|
}
|
|
|
|
// GetFrequencyKHz returns the WiFi frequency in kHz
|
|
func (ni *NetworkInterface) GetFrequencyKHz() int {
|
|
return ni.FrequencyKHz
|
|
}
|
|
|
|
// GetFrequencyGHz returns the WiFi frequency in GHz
|
|
func (ni *NetworkInterface) GetFrequencyGHz() float64 {
|
|
if ni.FrequencyKHz == 0 {
|
|
return 0
|
|
}
|
|
|
|
return float64(ni.FrequencyKHz) / 1000000.0
|
|
}
|
|
|
|
// GetFrequencyBand returns the WiFi frequency band (2.4GHz or 5GHz)
|
|
func (ni *NetworkInterface) GetFrequencyBand() string {
|
|
ghz := ni.GetFrequencyGHz()
|
|
if ghz == 0 {
|
|
return ""
|
|
}
|
|
|
|
if ghz < 3.0 {
|
|
return "2.4GHz"
|
|
}
|
|
|
|
return "5GHz"
|
|
}
|
|
|
|
// GetState returns the interface state
|
|
func (ni *NetworkInterface) GetState() string {
|
|
return ni.State
|
|
}
|
|
|
|
// GetSignal returns the signal strength
|
|
func (ni *NetworkInterface) GetSignal() string {
|
|
return ni.Signal
|
|
}
|
|
|
|
// GetMode returns the WiFi mode
|
|
func (ni *NetworkInterface) GetMode() string {
|
|
return ni.Mode
|
|
}
|
|
|
|
// IsConnected returns true if the interface is connected
|
|
func (ni *NetworkInterface) IsConnected() bool {
|
|
state := ni.GetState()
|
|
return state == StateWiFiConnected || state == StateEthernetConnected
|
|
}
|
|
|
|
// IsDisconnected returns true if the interface is disconnected
|
|
func (ni *NetworkInterface) IsDisconnected() bool {
|
|
state := ni.GetState()
|
|
return state == StateWiFiDisconnected || state == StateEthernetDisconnected
|
|
}
|
|
|
|
// IsWiFi returns true if this is a WiFi interface
|
|
func (ni *NetworkInterface) IsWiFi() bool {
|
|
return ni.Type == InterfaceTypeWiFi
|
|
}
|
|
|
|
// IsEthernet returns true if this is an Ethernet interface
|
|
func (ni *NetworkInterface) IsEthernet() bool {
|
|
return ni.Type == InterfaceTypeEthernet
|
|
}
|
|
|
|
// ValidateIP returns true if the IP address is valid
|
|
func (ni *NetworkInterface) ValidateIP() bool {
|
|
if ni.IPAddress == "" {
|
|
return false
|
|
}
|
|
|
|
return net.ParseIP(ni.IPAddress) != nil
|
|
}
|
|
|
|
// ValidateMAC returns true if the MAC address is valid
|
|
func (ni *NetworkInterface) ValidateMAC() bool {
|
|
if ni.MacAddress == "" {
|
|
return false
|
|
}
|
|
|
|
_, err := net.ParseMAC(ni.MacAddress)
|
|
|
|
return err == nil
|
|
}
|
|
|
|
// HasWiFiInfo returns true if the interface has WiFi-specific information
|
|
func (ni *NetworkInterface) HasWiFiInfo() bool {
|
|
return ni.SSID != "" || ni.FrequencyKHz > 0 || ni.Signal != ""
|
|
}
|
|
|
|
// GetSignalQuality returns a normalized signal quality percentage (0-100)
|
|
func (ni *NetworkInterface) GetSignalQuality() int {
|
|
switch ni.Signal {
|
|
case SignalExcellent:
|
|
return 90
|
|
case SignalGood:
|
|
return 70
|
|
case SignalFair:
|
|
return 50
|
|
case SignalPoor:
|
|
return 30
|
|
default:
|
|
return 0
|
|
}
|
|
}
|
|
|
|
// GetSignalDescription returns a user-friendly signal description
|
|
func (ni *NetworkInterface) GetSignalDescription() string {
|
|
switch ni.Signal {
|
|
case SignalExcellent:
|
|
return "Excellent"
|
|
case SignalGood:
|
|
return "Good"
|
|
case SignalFair:
|
|
return "Fair"
|
|
case SignalPoor:
|
|
return "Poor"
|
|
default:
|
|
return "Unknown"
|
|
}
|
|
}
|
|
|
|
// GetStateDescription returns a user-friendly state description
|
|
func (ni *NetworkInterface) GetStateDescription() string {
|
|
switch ni.State {
|
|
case StateWiFiConnected:
|
|
return "WiFi Connected"
|
|
case StateWiFiDisconnected:
|
|
return "WiFi Disconnected"
|
|
case StateEthernetConnected:
|
|
return "Ethernet Connected"
|
|
case StateEthernetDisconnected:
|
|
return "Ethernet Disconnected"
|
|
default:
|
|
return "Unknown State"
|
|
}
|
|
}
|
|
|
|
// GetModeDescription returns a user-friendly mode description
|
|
func (ni *NetworkInterface) GetModeDescription() string {
|
|
switch ni.Mode {
|
|
case ModeStation:
|
|
return "Station (Client)"
|
|
case ModeAccessPoint:
|
|
return "Access Point"
|
|
default:
|
|
return "Unknown Mode"
|
|
}
|
|
}
|
|
|
|
// FormatFrequency returns a formatted frequency string
|
|
func (ni *NetworkInterface) FormatFrequency() string {
|
|
if ni.FrequencyKHz == 0 {
|
|
return ""
|
|
}
|
|
|
|
ghz := ni.GetFrequencyGHz()
|
|
if ghz >= 1.0 {
|
|
return fmt.Sprintf("%.1f GHz", ghz)
|
|
}
|
|
|
|
mhz := float64(ni.FrequencyKHz) / 1000.0
|
|
|
|
return fmt.Sprintf("%.0f MHz", mhz)
|
|
}
|
|
|
|
// GetNetworkSummary returns a summary string of the network interface
|
|
func (ni *NetworkInterface) GetNetworkSummary() string {
|
|
switch {
|
|
case ni.IsWiFi() && ni.IsConnected():
|
|
ssid := ni.GetSSID()
|
|
if ssid == "" {
|
|
ssid = "Hidden Network"
|
|
}
|
|
|
|
signal := ni.GetSignalDescription()
|
|
|
|
band := ni.GetFrequencyBand()
|
|
if band != "" {
|
|
return fmt.Sprintf("%s (%s, %s)", ssid, signal, band)
|
|
}
|
|
|
|
return fmt.Sprintf("%s (%s)", ssid, signal)
|
|
case ni.IsEthernet() && ni.IsConnected():
|
|
return "Wired Connection"
|
|
case ni.IsConnected():
|
|
return "Connected"
|
|
default:
|
|
return "Disconnected"
|
|
}
|
|
}
|
|
|
|
// String returns a string representation of the network interface
|
|
func (ni *NetworkInterface) String() string {
|
|
var parts []string
|
|
|
|
parts = append(parts, fmt.Sprintf("Type: %s", ni.GetType()))
|
|
|
|
if ni.GetName() != "" {
|
|
parts = append(parts, fmt.Sprintf("Name: %s", ni.GetName()))
|
|
}
|
|
|
|
if ni.GetIPAddress() != "" {
|
|
parts = append(parts, fmt.Sprintf("IP: %s", ni.GetIPAddress()))
|
|
}
|
|
|
|
if ni.GetMacAddress() != "" {
|
|
parts = append(parts, fmt.Sprintf("MAC: %s", ni.GetMacAddress()))
|
|
}
|
|
|
|
if ni.IsWiFi() && ni.GetSSID() != "" {
|
|
parts = append(parts, fmt.Sprintf("SSID: %s", ni.GetSSID()))
|
|
}
|
|
|
|
if ni.GetState() != "" {
|
|
parts = append(parts, fmt.Sprintf("State: %s", ni.GetStateDescription()))
|
|
}
|
|
|
|
return strings.Join(parts, ", ")
|
|
}
|