feat(checker): checker
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
package checker
|
||||
|
||||
import (
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"github.com/ssdomei232/goodBaby/handler/db"
|
||||
"github.com/ssdomei232/goodBaby/handler/reminder"
|
||||
"github.com/ssdomei232/goodBaby/handler/runner"
|
||||
"github.com/ssdomei232/goodBaby/model"
|
||||
)
|
||||
|
||||
// 定时检查所有 timers 是否需要被触发
|
||||
//
|
||||
// 同时向即将被触发的 timers 发送通知
|
||||
func CheckTimers() {
|
||||
gormDB, err := db.GetGormDB()
|
||||
if err != nil {
|
||||
log.Printf("failed to get gorm db: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
// 1. 获取所有 timers
|
||||
var timers []model.Timer
|
||||
if err := gormDB.Find(&timers).Error; err != nil {
|
||||
log.Printf("failed to get timers: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
// 2. 检查每个 timer 是否需要被触发
|
||||
for _, timer := range timers {
|
||||
// 计算下次触发时间
|
||||
nextSignTime := timer.LastSign + timer.SignDerationSeconds
|
||||
|
||||
// 计算提醒时间
|
||||
remindTime := nextSignTime - timer.RemindTimeSeconds
|
||||
|
||||
// 获取当前时间
|
||||
currentTime := time.Now().Unix()
|
||||
|
||||
if currentTime >= remindTime && currentTime < nextSignTime {
|
||||
// 发送通知
|
||||
reminder.Reminder(&timer)
|
||||
}
|
||||
|
||||
if currentTime >= nextSignTime {
|
||||
// 触发 timer
|
||||
runner.Runner(&timer)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package reminder
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"github.com/ssdomei232/goodBaby/drivers/dingtalk"
|
||||
"github.com/ssdomei232/goodBaby/handler/db"
|
||||
"github.com/ssdomei232/goodBaby/model"
|
||||
)
|
||||
|
||||
// reminder 负责在 checker 检查到 timer 即将被触发时,向用户发送提醒
|
||||
func Reminder(timer *model.Timer) {
|
||||
gormDB, err := db.GetGormDB()
|
||||
if err != nil {
|
||||
log.Printf("failed to get gorm db: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
// 1. 获取 timer 对应的 user
|
||||
var user model.User
|
||||
if err := gormDB.Where("id = ?", timer.UID).First(&user).Error; err != nil {
|
||||
log.Printf("failed to get user: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
// 2. 向用户发送提醒
|
||||
dingtalk.SendDingTalkMsg(&user, "您的 goodbaby timer 即将被触发", "您的 goodbaby timer 即将被触发")
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package runner
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"github.com/ssdomei232/goodBaby/drivers/bilibili"
|
||||
"github.com/ssdomei232/goodBaby/drivers/email"
|
||||
"github.com/ssdomei232/goodBaby/drivers/github"
|
||||
"github.com/ssdomei232/goodBaby/drivers/onebot"
|
||||
"github.com/ssdomei232/goodBaby/handler/db"
|
||||
"github.com/ssdomei232/goodBaby/model"
|
||||
)
|
||||
|
||||
// runner 执行需要被执行的 Rule
|
||||
func Runner(timer *model.Timer) {
|
||||
gormDB, err := db.GetGormDB()
|
||||
if err != nil {
|
||||
log.Printf("failed to get gorm db: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
// 1. 获取所有需要执行的 Rule
|
||||
var rules []model.Rule
|
||||
if err := gormDB.Where("timer_id = ?", timer.ID).Find(&rules).Error; err != nil {
|
||||
log.Printf("failed to get rules: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
// 2. 执行每个 Rule
|
||||
for _, rule := range rules {
|
||||
// 执行 rule
|
||||
go executeRule(&rule)
|
||||
}
|
||||
}
|
||||
|
||||
// super switch
|
||||
func executeRule(rule *model.Rule) {
|
||||
switch rule.Type {
|
||||
case "bilibili-dynamic":
|
||||
bilibili.SendBiliDynamicMsg(rule)
|
||||
case "email":
|
||||
email.SendMail(rule)
|
||||
case "github-make-repo-public":
|
||||
github.MakeRepositoryPublic(rule)
|
||||
case "onebot":
|
||||
onebot.SendOneBotMsg(rule)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user