main.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package main
  2. import (
  3. "fmt"
  4. "net"
  5. "os"
  6. "strings"
  7. "time"
  8. )
  9. const appVersion = "2.0.0"
  10. const mutexName = "Global\\DeepSeekTraySingleton"
  11. func main() {
  12. args := os.Args[1:]
  13. cfg := loadConfig()
  14. log := NewLogger()
  15. defer log.Close()
  16. log.Printf("=== deepseek-tray %s 启动 args=%v ===", appVersion, args)
  17. if len(args) > 0 {
  18. switch strings.ToLower(strings.TrimLeft(args[0], "-/")) {
  19. case "version":
  20. attachConsole()
  21. fmt.Println(appVersion)
  22. return
  23. case "status":
  24. attachConsole()
  25. printStatus(cfg, log)
  26. return
  27. case "daemon":
  28. runDaemon(cfg, log)
  29. return
  30. }
  31. }
  32. inst, ok := acquireSingleInstance(mutexName)
  33. if !ok {
  34. attachConsole()
  35. fmt.Println("deepseek-tray 已在运行(托盘或守护进程)")
  36. return
  37. }
  38. defer inst.release()
  39. runTray(cfg, log)
  40. }
  41. // runDaemon 无 UI 守护模式(适合 NSSM 注册为 Windows 服务)。
  42. func runDaemon(cfg *Config, log *Logger) {
  43. log.Printf("以守护模式启动(无托盘)")
  44. inst, ok := acquireSingleInstance(mutexName)
  45. if !ok {
  46. log.Printf("已有实例在运行,退出")
  47. return
  48. }
  49. defer inst.release()
  50. sup := NewSupervisor(cfg, log)
  51. sup.Start()
  52. if cfg.AutoUpdate {
  53. sup.startAutoUpdate()
  54. }
  55. select {}
  56. }
  57. // printStatus 命令行状态查询。
  58. func printStatus(cfg *Config, log *Logger) {
  59. sup := NewSupervisor(cfg, log)
  60. version := sup.installedVersion()
  61. if version == "" {
  62. version = "未知(未找到 dsh)"
  63. }
  64. url := fmt.Sprintf("http://%s:%d", cfg.WebHost, cfg.WebPort)
  65. fmt.Printf("deepseek-tray %s\n", appVersion)
  66. fmt.Printf("DSH 版本 : %s\n", version)
  67. fmt.Printf("Web 地址 : %s\n", url)
  68. fmt.Printf("端口监听 : %v\n", portOpen(cfg.WebHost, cfg.WebPort))
  69. fmt.Printf("开机自启 : %v\n", isAutoStartEnabled())
  70. fmt.Printf("定期自动更新: %v(间隔 %d 小时)\n", cfg.AutoUpdate, cfg.UpdateIntervalH)
  71. fmt.Printf("配置文件 : %s\n", configPath())
  72. fmt.Printf("日志文件 : %s\n", log.Path())
  73. }
  74. func portOpen(host string, port int) bool {
  75. if host == "" {
  76. host = "127.0.0.1"
  77. }
  78. conn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", host, port), 1500*time.Millisecond)
  79. if err != nil {
  80. return false
  81. }
  82. _ = conn.Close()
  83. return true
  84. }