reminderservice.go 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // ============================================================================
  2. // reminderservice.go — 定时提醒
  3. //
  4. // 「工具」页定时提醒:设置提醒信息和间隔分钟数,每 xx 分钟广播一次
  5. // periodicReminder 事件(前端弹窗显示)并唤出主窗口,直到手动取消。
  6. // ============================================================================
  7. package main
  8. import (
  9. "fmt"
  10. "strings"
  11. "sync"
  12. "time"
  13. )
  14. // 定时提醒运行状态
  15. var (
  16. reminderMu sync.Mutex
  17. reminderStop chan struct{} // 停止信号(取消定时提醒时 close)
  18. reminderText string // 当前提醒信息
  19. reminderEvery time.Duration // 当前间隔
  20. reminderNext time.Time // 下次提醒时刻
  21. reminderRun bool // 是否在运行
  22. )
  23. // StartReminder 启动(或更新)定时提醒:每 every 分钟提醒一次,直到取消。
  24. // message 为提醒信息,minutes 为间隔分钟数(必须 >=1)。
  25. // 返回启动状态描述(含下次提醒时刻),供前端提示。
  26. func (s *SettingsService) StartReminder(message string, minutes int) string {
  27. msg := strings.TrimSpace(message)
  28. if msg == "" {
  29. return "请输入提醒信息"
  30. }
  31. if minutes < 1 {
  32. return "间隔分钟数必须 ≥ 1"
  33. }
  34. reminderMu.Lock()
  35. defer reminderMu.Unlock()
  36. // 已运行则先停止旧定时器
  37. if reminderRun {
  38. close(reminderStop)
  39. }
  40. reminderText = msg
  41. reminderEvery = time.Duration(minutes) * time.Minute
  42. reminderStop = make(chan struct{})
  43. reminderRun = true
  44. reminderNext = time.Now().Add(reminderEvery)
  45. go reminderLoop(reminderStop, msg, reminderEvery)
  46. return fmt.Sprintf("已启动:每 %d 分钟提醒「%s」,下次 %s", minutes, msg, reminderNext.Format("15:04:05"))
  47. }
  48. // StopReminder 取消定时提醒。返回是否在运行过。
  49. func (s *SettingsService) StopReminder() string {
  50. reminderMu.Lock()
  51. defer reminderMu.Unlock()
  52. if !reminderRun {
  53. return "定时提醒未运行"
  54. }
  55. close(reminderStop)
  56. reminderRun = false
  57. reminderText = ""
  58. reminderEvery = 0
  59. reminderNext = time.Time{}
  60. return "已取消定时提醒"
  61. }
  62. // ReminderStatus 查询当前定时提醒状态(运行中 / 间隔 / 下次时刻)。
  63. func (s *SettingsService) ReminderStatus() string {
  64. reminderMu.Lock()
  65. defer reminderMu.Unlock()
  66. if !reminderRun {
  67. return ""
  68. }
  69. return fmt.Sprintf("运行中|每 %d 分钟|下次 %s",
  70. int(reminderEvery.Minutes()), reminderNext.Format("15:04:05"))
  71. }
  72. // reminderLoop 每间隔提醒一次:广播 periodicReminder 事件并唤出主窗口。
  73. // stop 关闭时退出循环。
  74. func reminderLoop(stop chan struct{}, msg string, every time.Duration) {
  75. ticker := time.NewTicker(every)
  76. defer ticker.Stop()
  77. for {
  78. select {
  79. case <-stop:
  80. return // 已取消
  81. case now := <-ticker.C:
  82. payload := msg + "\n" + now.Format("2006-01-02 15:04:05")
  83. app.Event.Emit("periodicReminder", payload)
  84. showMainWindow()
  85. }
  86. }
  87. }