Handle shutdown signals
This commit is contained in:
parent
9ee301fbeb
commit
123dc0160b
2 changed files with 122 additions and 13 deletions
|
|
@ -2,15 +2,19 @@ package main
|
|||
|
||||
import (
|
||||
"bufio"
|
||||
"context"
|
||||
"flag"
|
||||
"fmt"
|
||||
"log"
|
||||
"net"
|
||||
"os"
|
||||
"os/signal"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"lel/internal/aiprocess"
|
||||
"lel/internal/clip"
|
||||
"lel/internal/config"
|
||||
"lel/internal/daemon"
|
||||
|
|
@ -26,7 +30,7 @@ func main() {
|
|||
var configPath string
|
||||
var dryRun bool
|
||||
var noTray bool
|
||||
flag.StringVar(&configPath, "config", "", "path to config.toml")
|
||||
flag.StringVar(&configPath, "config", "", "path to config.json")
|
||||
flag.BoolVar(&dryRun, "dry-run", false, "register hotkey and log events without recording")
|
||||
flag.BoolVar(&noTray, "no-tray", false, "disable system tray icon")
|
||||
flag.Parse()
|
||||
|
|
@ -74,7 +78,21 @@ func main() {
|
|||
logger.Fatalf("backend error: %v", err)
|
||||
}
|
||||
|
||||
d := daemon.New(cfg, x, logger, backend)
|
||||
processor, err := aiprocess.New(aiprocess.Config{
|
||||
Enabled: cfg.AIEnabled,
|
||||
Provider: cfg.AIProvider,
|
||||
Model: cfg.AIModel,
|
||||
Temperature: cfg.AITemperature,
|
||||
SystemPromptFile: cfg.AISystemPromptFile,
|
||||
BaseURL: cfg.AIBaseURL,
|
||||
APIKey: cfg.AIAPIKey,
|
||||
TimeoutSec: cfg.AITimeoutSec,
|
||||
})
|
||||
if err != nil {
|
||||
logger.Fatalf("ai processor error: %v", err)
|
||||
}
|
||||
|
||||
d := daemon.New(cfg, x, logger, backend, processor)
|
||||
|
||||
sockPath := filepath.Join(runtimeDir, "ctl.sock")
|
||||
if err := os.RemoveAll(sockPath); err != nil {
|
||||
|
|
@ -95,6 +113,7 @@ func main() {
|
|||
logger.Printf("ready (hotkey: %s)", cfg.Hotkey)
|
||||
|
||||
if noTray {
|
||||
go handleSignals(logger, d)
|
||||
runX11Loop(logger, x, d, mods, keycode, dryRun)
|
||||
return
|
||||
}
|
||||
|
|
@ -119,6 +138,10 @@ func main() {
|
|||
systray.SetIcon(ui.IconTranscribing())
|
||||
systray.SetTooltip("lel: transcribing")
|
||||
status.SetTitle("Transcribing")
|
||||
case daemon.StateProcessing:
|
||||
systray.SetIcon(ui.IconProcessing())
|
||||
systray.SetTooltip("lel: ai processing")
|
||||
status.SetTitle("AI Processing")
|
||||
default:
|
||||
systray.SetIcon(ui.IconIdle())
|
||||
systray.SetTooltip("lel: idle")
|
||||
|
|
@ -133,6 +156,7 @@ func main() {
|
|||
}
|
||||
}()
|
||||
|
||||
go handleSignals(logger, d)
|
||||
go runX11Loop(logger, x, d, mods, keycode, dryRun)
|
||||
}
|
||||
|
||||
|
|
@ -164,6 +188,20 @@ func runX11Loop(logger *log.Logger, x *x11.Conn, d *daemon.Daemon, mods uint16,
|
|||
}
|
||||
}
|
||||
|
||||
func handleSignals(logger *log.Logger, d *daemon.Daemon) {
|
||||
sigCh := make(chan os.Signal, 2)
|
||||
signal.Notify(sigCh, os.Interrupt, syscall.SIGTERM)
|
||||
sig := <-sigCh
|
||||
logger.Printf("signal received: %v, shutting down", sig)
|
||||
d.StopRecording("signal")
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||
defer cancel()
|
||||
if !d.WaitForIdle(ctx) {
|
||||
logger.Printf("shutdown timeout, exiting")
|
||||
}
|
||||
os.Exit(0)
|
||||
}
|
||||
|
||||
func ensureRuntimeDir(logger *log.Logger) string {
|
||||
dir := os.Getenv("XDG_RUNTIME_DIR")
|
||||
if dir == "" {
|
||||
|
|
@ -242,11 +280,27 @@ func handleConn(logger *log.Logger, conn net.Conn, d *daemon.Daemon, cfg *config
|
|||
return
|
||||
}
|
||||
|
||||
processor, err := aiprocess.New(aiprocess.Config{
|
||||
Enabled: newCfg.AIEnabled,
|
||||
Provider: newCfg.AIProvider,
|
||||
Model: newCfg.AIModel,
|
||||
Temperature: newCfg.AITemperature,
|
||||
SystemPromptFile: newCfg.AISystemPromptFile,
|
||||
BaseURL: newCfg.AIBaseURL,
|
||||
APIKey: newCfg.AIAPIKey,
|
||||
TimeoutSec: newCfg.AITimeoutSec,
|
||||
})
|
||||
if err != nil {
|
||||
_, _ = fmt.Fprintf(conn, "reload error: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
*mods = newMods
|
||||
*keycode = newKeycode
|
||||
*cfg = newCfg
|
||||
d.UpdateConfig(newCfg)
|
||||
d.UpdateBackend(backend)
|
||||
d.UpdateAI(processor)
|
||||
|
||||
_, _ = fmt.Fprintf(conn, "reloaded\n")
|
||||
default:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue