Add wifi, license and email checks

This commit is contained in:
NeilClack
2026-03-29 23:41:16 -05:00
parent 7339a30cca
commit 6e28b90ee8
+73 -2
View File
@@ -18,6 +18,7 @@ import (
"rhemawavetech.com/rhemawave/internal/license"
"rhemawavetech.com/rhemawave/internal/logger"
"rhemawavetech.com/rhemawave/internal/mixer"
"rhemawavetech.com/rhemawave/internal/network"
"rhemawavetech.com/rhemawave/internal/page"
"rhemawavetech.com/rhemawave/internal/shaderManager"
"rhemawavetech.com/rhemawave/internal/sync"
@@ -31,6 +32,15 @@ const (
apiURL = "https://portal.rhemawavetech.com/api/v1"
)
type State int
const (
NEEDS_INTERNET State = iota
NEEDS_LICENSE_KEY
NEEDS_EMAIL_ADDRESS
READY
)
type Application struct {
Window *sdl.Window
License *license.Response
@@ -40,8 +50,12 @@ type Application struct {
DB *gorm.DB
Config atomic.Pointer[db.AppConfig]
PageRouter *page.Router
state State
}
var lastNetworkCheckTime time.Time
var networkIsUp bool
// ----------------------------------------------------------------------------
// Main Entry Point
// ----------------------------------------------------------------------------
@@ -54,6 +68,8 @@ func Run() {
var initialConfig db.AppConfig
var result *gorm.DB
networkIsUp = false
logger.Info("Starting Application")
homeDir, err = os.UserHomeDir()
@@ -145,6 +161,62 @@ func Run() {
app.runEventLoop()
}
func (app *Application) checkState() {
if app.state == READY {
return
}
// app.state = 0 means that there is no state set
// Check for an internet connection first
if !networkIsUp {
if lastNetworkCheckTime.IsZero() || time.Since(lastNetworkCheckTime) >= time.Second {
networkManager, err := network.New()
if err != nil {
logger.Error("error obtaining a network manager %v", err)
return
}
lastNetworkCheckTime = time.Now()
status, err := networkManager.CheckInternetConnection()
if err != nil {
logger.Error("error checking for internet connection %v", err)
return
}
if status.StatusCode != network.StatusWifiConnectedInternetUp &&
status.StatusCode != network.StatusEthernetConnectedInternetUp {
if app.state != NEEDS_INTERNET {
app.PageRouter.NavigateTo(page.WIFI)
app.state = NEEDS_INTERNET
}
return
}
networkIsUp = true // ← internet confirmed, don't check again
} else {
return // throttled, and we don't yet know if network is up — can't proceed
}
}
// Then check for a license key
if app.Config.Load().LicenseKey == "" {
if app.state != NEEDS_LICENSE_KEY {
app.PageRouter.NavigateTo(page.LICENSE_KEY)
app.state = NEEDS_LICENSE_KEY
}
return
}
// Finally, check for an email address
if app.Config.Load().EmailAddress == "" {
if app.state != NEEDS_EMAIL_ADDRESS {
app.PageRouter.NavigateTo(page.EMAIL_ADDRESS)
app.state = NEEDS_EMAIL_ADDRESS
}
return
}
app.state = READY
app.PageRouter.NavigateTo(page.HOME)
}
func (app *Application) refreshCache() {
var freshConfig db.AppConfig
if result := app.DB.First(&freshConfig); result.Error != nil {
@@ -277,16 +349,15 @@ func (app *Application) runEventLoop() {
if app.PageRouter == nil || app.PageRouter.ActivePage == nil {
logger.Fatal("No initial page loaded, Router is empty")
}
const frameDelay = time.Second / targetFPS
app.running = true
lastTime := time.Now()
logger.Info("Entering event loop")
for app.running {
frameStart := time.Now()
app.checkState()
app.handleEvents()
if !app.running {
break