mirror of
https://github.com/nezhahq/nezha.git
synced 2025-01-23 13:18:13 -05:00
82 lines
1.9 KiB
Go
82 lines
1.9 KiB
Go
|
package dao
|
||
|
|
||
|
import (
|
||
|
"crypto/md5"
|
||
|
"encoding/hex"
|
||
|
"sync"
|
||
|
"time"
|
||
|
|
||
|
"github.com/naiba/nezha/model"
|
||
|
)
|
||
|
|
||
|
const firstNotificationDelay = time.Minute * 15
|
||
|
|
||
|
// 通知方式
|
||
|
var notifications []model.Notification
|
||
|
var notificationsLock sync.RWMutex
|
||
|
|
||
|
func OnRefreshOrAddNotification(n model.Notification) {
|
||
|
notificationsLock.Lock()
|
||
|
defer notificationsLock.Unlock()
|
||
|
var isEdit bool
|
||
|
for i := 0; i < len(notifications); i++ {
|
||
|
if notifications[i].ID == n.ID {
|
||
|
notifications[i] = n
|
||
|
isEdit = true
|
||
|
}
|
||
|
}
|
||
|
if !isEdit {
|
||
|
notifications = append(notifications, n)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func OnDeleteNotification(id uint64) {
|
||
|
notificationsLock.Lock()
|
||
|
defer notificationsLock.Unlock()
|
||
|
for i := 0; i < len(notifications); i++ {
|
||
|
if notifications[i].ID == id {
|
||
|
notifications = append(notifications[:i], notifications[i+1:]...)
|
||
|
i--
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func SendNotification(desc string, muteable bool) {
|
||
|
if muteable {
|
||
|
// 通知防骚扰策略
|
||
|
nID := hex.EncodeToString(md5.New().Sum([]byte(desc)))
|
||
|
var flag bool
|
||
|
if cacheN, has := Cache.Get(nID); has {
|
||
|
nHistory := cacheN.(NotificationHistory)
|
||
|
// 每次提醒都增加一倍等待时间,最后每天最多提醒一次
|
||
|
if time.Now().After(nHistory.Until) {
|
||
|
flag = true
|
||
|
nHistory.Duration *= 2
|
||
|
if nHistory.Duration > time.Hour*24 {
|
||
|
nHistory.Duration = time.Hour * 24
|
||
|
}
|
||
|
nHistory.Until = time.Now().Add(nHistory.Duration)
|
||
|
// 缓存有效期加 10 分钟
|
||
|
Cache.Set(nID, nHistory, nHistory.Duration+time.Minute*10)
|
||
|
}
|
||
|
} else {
|
||
|
// 新提醒直接通知
|
||
|
flag = true
|
||
|
Cache.Set(nID, NotificationHistory{
|
||
|
Duration: firstNotificationDelay,
|
||
|
Until: time.Now().Add(firstNotificationDelay),
|
||
|
}, firstNotificationDelay+time.Minute*10)
|
||
|
}
|
||
|
|
||
|
if !flag {
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
// 发出通知
|
||
|
notificationsLock.RLock()
|
||
|
defer notificationsLock.RUnlock()
|
||
|
for i := 0; i < len(notifications); i++ {
|
||
|
notifications[i].Send(desc)
|
||
|
}
|
||
|
}
|