From 0359e2a9d5be977ff5d32f42070464ed304d9859 Mon Sep 17 00:00:00 2001 From: mei Date: Tue, 7 Oct 2025 14:49:00 +0800 Subject: [PATCH] feat(internal/timermanger): timermanger --- .gitignore | 1 + README.md | 1 + config.example.json | 1 + configs/config.go | 1 + internal/basicInfo.go | 10 ++++-- internal/bilibili.go | 16 ++++++++++ internal/timer.go | 53 ++++++++++++++++++++++++++++++++ main.go | 71 ++++++++++++++++++------------------------- 8 files changed, 111 insertions(+), 43 deletions(-) create mode 100644 internal/timer.go diff --git a/.gitignore b/.gitignore index a6b7772..ab50bec 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,4 @@ config.json cookies.txt tmp/qrcode.png tmp/cookies.txt +bye.json \ No newline at end of file diff --git a/README.md b/README.md index 5aa2960..c1c1f06 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ "basic": { "name": "xx", // 你的名字 "qq_number": "123", // QQ号 + "nickname": "", // 网名 "age": 16, // 你的年龄 "cause_stop": "自杀" // 你最可能的死因 }, diff --git a/config.example.json b/config.example.json index 065c4f4..8c317a2 100644 --- a/config.example.json +++ b/config.example.json @@ -2,6 +2,7 @@ "basic": { "name": "xx", "qq_number": "123", + "nickname": "", "age": 16, "cause_stop": "自杀" }, diff --git a/configs/config.go b/configs/config.go index e52d252..10a7a7e 100644 --- a/configs/config.go +++ b/configs/config.go @@ -40,6 +40,7 @@ type GithubConfig struct { type Basic struct { Name string `json:"name"` Age int `json:"age"` + NickName string `json:"nickname"` QQNumber string `json:"qq_number"` CauseStop string `json:"cause_stop"` } diff --git a/internal/basicInfo.go b/internal/basicInfo.go index 4848ba5..0718961 100644 --- a/internal/basicInfo.go +++ b/internal/basicInfo.go @@ -18,6 +18,12 @@ func GetBasicInfo() string { now := time.Now() lastSignalTime := now.Add(-time.Duration(config.DisconnectDuration) * time.Hour).Format("2006-01-02 15:04:05") - return fmt.Sprintf("%s(QQ号:%s)已于%s至%s(UTC+8)之间去世,享年%d岁,死因可能为%s(此死因为推测最可能的死因,请勿完全相信,请等待后续消息)", - config.Basic.Name, config.Basic.QQNumber, lastSignalTime, time.Now().Format("2006-01-02 15:04:05"), config.Basic.Age, config.Basic.CauseStop) + if config.Debug { + return fmt.Sprintf("此消息为测试消息\n\n%s(QQ号:%s)已于%s至%s(UTC+8)之间去世,享年%d岁,死因可能为%s(此死因为推测最可能的死因,请勿完全相信,请等待后续消息)", + config.Basic.Name, config.Basic.QQNumber, lastSignalTime, time.Now().Format("2006-01-02 15:04:05"), config.Basic.Age, config.Basic.CauseStop) + } else { + return fmt.Sprintf("%s(QQ号:%s,网名:%s)已于%s至%s(UTC+8)之间去世,享年%d岁,死因可能为%s(此死因为推测最可能的死因,请勿完全相信,请等待后续消息)", + config.Basic.Name, config.Basic.NickName, config.Basic.QQNumber, lastSignalTime, time.Now().Format("2006-01-02 15:04:05"), config.Basic.Age, config.Basic.CauseStop) + } + } diff --git a/internal/bilibili.go b/internal/bilibili.go index 02a7460..607c83d 100644 --- a/internal/bilibili.go +++ b/internal/bilibili.go @@ -12,6 +12,22 @@ import ( "github.com/ssdomei232/goodBaby/configs" ) +func EnsureTmpDirectory() error { + _, err := os.Stat("tmp") + if os.IsNotExist(err) { + err = os.Mkdir("tmp", 0755) + if err != nil { + return err + } + log.Println("已创建tmp目录") + } else if err != nil { + return err + } else { + log.Println("tmp目录已存在") + } + return nil +} + func isCookiesExpired(cookiesString string) bool { // 解析cookie中的过期时间 lines := strings.SplitSeq(cookiesString, "\n") diff --git a/internal/timer.go b/internal/timer.go new file mode 100644 index 0000000..7fd06f1 --- /dev/null +++ b/internal/timer.go @@ -0,0 +1,53 @@ +// internal/timer_manager.go +package internal + +import ( + "net/http" + "sync" + "time" + + "github.com/gin-gonic/gin" +) + +type TimerManager struct { + duration time.Duration + resetTime time.Time + mutex sync.RWMutex +} + +var GlobalTimerManager *TimerManager + +func InitTimerManager(duration time.Duration) { + GlobalTimerManager = &TimerManager{ + duration: duration, + resetTime: time.Now(), + } +} + +func (tm *TimerManager) Reset() { + tm.mutex.Lock() + defer tm.mutex.Unlock() + tm.resetTime = time.Now() +} + +func (tm *TimerManager) GetRemainingTime() time.Duration { + tm.mutex.RLock() + defer tm.mutex.RUnlock() + + elapsed := time.Since(tm.resetTime) + remaining := tm.duration - elapsed + if remaining < 0 { + return 0 + } + return remaining +} + +func HandleTimerStatus(c *gin.Context) { + remainingTime := GlobalTimerManager.GetRemainingTime() + + c.JSON(http.StatusOK, gin.H{ + "code": 200, + "remaining_time": remainingTime.Seconds(), // 返回剩余秒数 + "message": "ok", + }) +} diff --git a/main.go b/main.go index 44b02c7..b089bdd 100644 --- a/main.go +++ b/main.go @@ -2,7 +2,6 @@ package main import ( "log" - "os" "time" "github.com/CuteReimu/bilibili/v2" @@ -29,7 +28,7 @@ func init() { } // 检查并创建tmp目录 - if err := ensureTmpDirectory(); err != nil { + if err := internal.EnsureTmpDirectory(); err != nil { log.Printf("创建tmp目录失败: %v", err) } @@ -38,6 +37,7 @@ func init() { initBilibili() startCookieChecker() // 启动定期检查cookie有效性 + internal.InitTimerManager(duration) timer = time.NewTimer(duration) go func() { <-timer.C @@ -45,55 +45,21 @@ func init() { }() } -// ensureTmpDirectory 检查tmp目录是否存在,如果不存在则创建 -func ensureTmpDirectory() error { - _, err := os.Stat("tmp") - if os.IsNotExist(err) { - err = os.Mkdir("tmp", 0755) - if err != nil { - return err - } - log.Println("已创建tmp目录") - } else if err != nil { - return err - } else { - log.Println("tmp目录已存在") - } - return nil -} - func trigger(config configs.Config) { if config.EnableQQ { go internal.SendQQ() } go internal.SendMail() go internal.Github() - go internal.SendBili(biliClient) + if !config.Debug { + go internal.SendBili(biliClient) + } } func main() { - config, err := configs.GetConfig() - if err != nil { - log.Printf("获取配置文件失败: %v", err) - } - r := gin.Default() - r.GET("/signal", func(c *gin.Context) { - secret := c.Query("secret") - if secret != config.SignalSecret { - c.JSON(403, gin.H{ - "code": 403, - "message": "secret error", - }) - return - } - timer.Reset(duration) - c.JSON(200, gin.H{ - "code": 200, - "message": "ok", - }) - log.Println("触发信号") - }) + r.GET("/signal", handleSignal) + r.GET("/timer/status", internal.HandleTimerStatus) r.Run(":8088") } @@ -118,3 +84,26 @@ func startCookieChecker() { } }() } + +func handleSignal(c *gin.Context) { + config, err := configs.GetConfig() + if err != nil { + log.Printf("获取配置文件失败: %v", err) + } + + secret := c.Query("secret") + if secret != config.SignalSecret { + c.JSON(403, gin.H{ + "code": 403, + "message": "secret error", + }) + return + } + timer.Reset(duration) + internal.GlobalTimerManager.Reset() + c.JSON(200, gin.H{ + "code": 200, + "message": "ok", + }) + log.Println("触发信号") +}