diff --git a/cmd/gocq/main.go b/cmd/gocq/main.go index bcedbbc..43798d3 100644 --- a/cmd/gocq/main.go +++ b/cmd/gocq/main.go @@ -71,8 +71,8 @@ func InitBase() { base.Init() } -// Main 启动主程序,必须在 InitBase 之后执行 -func Main() { +// PrepareData 准备 log, 缓存, 数据库, 必须在 InitBase 之后执行 +func PrepareData() { rotateOptions := []rotatelogs.Option{ rotatelogs.WithRotationTime(time.Hour * 24), } @@ -108,7 +108,10 @@ func Main() { if err := db.Open(); err != nil { log.Fatalf("打开数据库失败: %v", err) } +} +// LoginInteract 登录交互, 可能需要键盘输入, 必须在 InitBase, PrepareData 之后执行 +func LoginInteract() { var byteKey []byte arg := os.Args if len(arg) > 1 { @@ -336,7 +339,13 @@ func Main() { servers.Run(coolq.NewQQBot(cli)) log.Info("资源初始化完成, 开始处理信息.") log.Info("アトリは、高性能ですから!") +} +// WaitSignal 在新线程检查更新和网络并等待信号, 必须在 InitBase, PrepareData, LoginInteract 之后执行 +// +// - 直接返回: os.Interrupt, syscall.SIGTERM +// - dump stack: syscall.SIGQUIT, syscall.SIGUSR1 +func WaitSignal() { go func() { selfupdate.CheckUpdate() selfdiagnosis.NetworkDiagnosis(cli) diff --git a/global/signal_unix.go b/global/signal_unix.go index 96e623d..6ee65dc 100644 --- a/global/signal_unix.go +++ b/global/signal_unix.go @@ -14,9 +14,9 @@ import ( func SetupMainSignalHandler() <-chan struct{} { mainOnce.Do(func() { mainStopCh = make(chan struct{}) - mc := make(chan os.Signal, 3) + mc := make(chan os.Signal, 4) closeOnce := sync.Once{} - signal.Notify(mc, os.Interrupt, syscall.SIGTERM, syscall.SIGUSR1) + signal.Notify(mc, os.Interrupt, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGUSR1) go func() { for { switch <-mc { @@ -24,7 +24,7 @@ func SetupMainSignalHandler() <-chan struct{} { closeOnce.Do(func() { close(mainStopCh) }) - case syscall.SIGUSR1: + case syscall.SIGQUIT, syscall.SIGUSR1: dumpStack() } } diff --git a/main.go b/main.go index 90f5b20..b3dcdf1 100644 --- a/main.go +++ b/main.go @@ -15,8 +15,10 @@ import ( func main() { gocq.InitBase() + gocq.PrepareData() + gocq.LoginInteract() _ = terminal.DisableQuickEdit() _ = terminal.EnableVT100() - gocq.Main() + gocq.WaitSignal() _ = terminal.RestoreInputMode() }