//go:build tray // +build tray package main import ( "log" "os" "os/signal" "syscall" "time" "github.com/getlantern/systray" ) var TRAY = true func RunTray() { systray.Run(onReady, onExit) } func QuitTray() { systray.Quit() } func onExit() { if RUNNING { QUIT = true RESTART <- true // Safety Sleep (Ensure shutdown tasks get done) time.Sleep(time.Second) } os.Remove(SOCK) } func onReady() { icon, err := localFS.ReadFile("web/favicon.ico") if err != nil { log.Fatalf("Failed to load favicon: %v", err) } systray.SetIcon(icon) systray.SetTitle("jfa-go") mStart := systray.AddMenuItem("Start", "Start jfa-go") mStop := systray.AddMenuItem("Stop", "Stop jfa-go") mRestart := systray.AddMenuItem("Restart", "Restart jfa-go") mOpenLogs := systray.AddMenuItem("Open logs", "Open jfa-go log file.") as := NewAutostart("jfa-go", "A user management system for Jellyfin", "Run on login", "Run jfa-go on user login.") mQuit := systray.AddMenuItem("Quit", "Quit jfa-go") c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { <-c systray.Quit() os.Exit(1) }() defer func() { systray.Quit() }() RESTART = make(chan bool, 1) TRAYRESTART = make(chan bool, 1) go start(false, true) mStart.Disable() mStop.Enable() mRestart.Enable() go as.HandleCheck() trayRestart := func() { if RUNNING { RESTART <- true mStop.Disable() mStart.Enable() mRestart.Disable() for { if !RUNNING { break } } go start(false, false) mStart.Disable() mStop.Enable() mRestart.Enable() } } for { select { case <-mStart.ClickedCh: if !RUNNING { go start(false, false) mStart.Disable() mStop.Enable() mRestart.Enable() } case <-mStop.ClickedCh: if RUNNING { RESTART <- true mStop.Disable() mStart.Enable() mRestart.Disable() } case <-TRAYRESTART: trayRestart() case <-mRestart.ClickedCh: trayRestart() case <-mOpenLogs.ClickedCh: log.Printf("Opening %s\n", logPath) OpenFile(logPath) case <-mQuit.ClickedCh: systray.Quit() } } }