mirror of
https://github.com/komari-monitor/komari.git
synced 2025-10-23 03:31:56 +00:00
feat: 更新通知机制,使用事件消息替代文本消息
This commit is contained in:
@@ -9,6 +9,7 @@ import (
|
||||
"github.com/komari-monitor/komari/database/config"
|
||||
"github.com/komari-monitor/komari/database/dbcore"
|
||||
"github.com/komari-monitor/komari/database/models"
|
||||
messageevent "github.com/komari-monitor/komari/database/models/messageEvent"
|
||||
"github.com/komari-monitor/komari/utils"
|
||||
"github.com/komari-monitor/komari/utils/geoip"
|
||||
"github.com/komari-monitor/komari/utils/messageSender"
|
||||
@@ -46,7 +47,12 @@ func CreateSession(uuid string, expires int, userAgent, ip, login_method string)
|
||||
if ipinfo != nil {
|
||||
loc = ipinfo.Name
|
||||
}
|
||||
messageSender.SendTextMessage(fmt.Sprintf("From: %s,(%s)\nMethod: %s\nUser Agent: %s\n\n%s", ip, loc, login_method, userAgent, time.Now().Format(time.RFC3339)), "New Login on Komari")
|
||||
messageSender.SendEvent(models.EventMessage{
|
||||
Event: messageevent.Login,
|
||||
Time: time.Now(),
|
||||
Message: fmt.Sprintf("%s: %s (%s)\n%s", login_method, ip, loc, userAgent),
|
||||
Emoji: "🔑",
|
||||
})
|
||||
}
|
||||
|
||||
err := db.Create(&sessionRecord).Error
|
||||
|
@@ -7,6 +7,8 @@ import (
|
||||
|
||||
"github.com/komari-monitor/komari/database/clients"
|
||||
"github.com/komari-monitor/komari/database/config"
|
||||
"github.com/komari-monitor/komari/database/models"
|
||||
messageevent "github.com/komari-monitor/komari/database/models/messageEvent"
|
||||
"github.com/komari-monitor/komari/utils/messageSender"
|
||||
"github.com/komari-monitor/komari/utils/renewal"
|
||||
)
|
||||
@@ -67,11 +69,16 @@ func CheckExpireScheduledWork() {
|
||||
}
|
||||
|
||||
if len(clientLeadToExpire) > 0 {
|
||||
message := "The following clients are about to expire: \n\n"
|
||||
message := ""
|
||||
for _, clientInfo := range clientLeadToExpire {
|
||||
message += fmt.Sprintf("• %s in %d days\n", clientInfo.Name, clientInfo.DaysLeft)
|
||||
message += fmt.Sprintf("• %s (%dd)\n", clientInfo.Name, clientInfo.DaysLeft)
|
||||
}
|
||||
messageSender.SendTextMessage(message, "Komari Expiration Notification")
|
||||
messageSender.SendEvent(models.EventMessage{
|
||||
Event: messageevent.Expire,
|
||||
Time: time.Now(),
|
||||
Message: message,
|
||||
Emoji: "⏳",
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,7 +1,6 @@
|
||||
package notifier
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"reflect"
|
||||
"sync"
|
||||
@@ -10,6 +9,7 @@ import (
|
||||
"github.com/komari-monitor/komari/database/clients"
|
||||
"github.com/komari-monitor/komari/database/dbcore"
|
||||
"github.com/komari-monitor/komari/database/models"
|
||||
messageevent "github.com/komari-monitor/komari/database/models/messageEvent"
|
||||
"github.com/komari-monitor/komari/database/records"
|
||||
"github.com/komari-monitor/komari/utils/messageSender"
|
||||
)
|
||||
@@ -189,20 +189,24 @@ func getMetricValue(record models.Record, metric string) float32 {
|
||||
|
||||
// sendLoadNotification 发送负载通知
|
||||
func sendLoadNotification(clientUUIDs []string, task models.LoadNotification) {
|
||||
message := "The following clients have exceeded the load threshold:\n\n"
|
||||
ex_clients := []models.Client{}
|
||||
for _, clientUUID := range clientUUIDs {
|
||||
client, err := clients.GetClientByUUID(clientUUID)
|
||||
if err != nil {
|
||||
log.Printf("Failed to get client info for %s: %v", clientUUID, err)
|
||||
continue
|
||||
cl, err := clients.GetClientByUUID(clientUUID)
|
||||
if err == nil {
|
||||
ex_clients = append(ex_clients, cl)
|
||||
}
|
||||
message += fmt.Sprintf("%s\n", client.Name)
|
||||
}
|
||||
if len(clientUUIDs) == 0 {
|
||||
if len(ex_clients) == 0 {
|
||||
return
|
||||
}
|
||||
go func() {
|
||||
messageSender.SendTextMessage(message, fmt.Sprintf("%s - Komari Load Alert", task.Name))
|
||||
messageSender.SendEvent(models.EventMessage{
|
||||
Event: messageevent.Alert,
|
||||
Clients: ex_clients,
|
||||
Time: time.Now(),
|
||||
Emoji: "⚠️",
|
||||
Message: task.Name,
|
||||
})
|
||||
}()
|
||||
}
|
||||
|
||||
|
@@ -10,6 +10,7 @@ import (
|
||||
"github.com/komari-monitor/komari/database/config"
|
||||
"github.com/komari-monitor/komari/database/dbcore"
|
||||
"github.com/komari-monitor/komari/database/models"
|
||||
messageevent "github.com/komari-monitor/komari/database/models/messageEvent"
|
||||
"github.com/komari-monitor/komari/utils/messageSender"
|
||||
"github.com/komari-monitor/komari/utils/renewal"
|
||||
)
|
||||
@@ -95,7 +96,7 @@ func OfflineNotification(clientID string, endedConnectionID int64) {
|
||||
// 若为零值,说明客户端已重连。
|
||||
// 当前的 connectionID 是否还是我们触发离线时的那个ID。如果不是,说明客户端重连过,本次离线通知已失效。
|
||||
if state.pendingOfflineSince.IsZero() || state.connectionID != expectedConnectionID {
|
||||
log.Println("%s is reconnected new connID: %d, old connID: %d", clientID, state.connectionID, expectedConnectionID)
|
||||
log.Printf("%s is reconnected new connID: %d, old connID: %d", clientID, state.connectionID, expectedConnectionID)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -107,7 +108,13 @@ func OfflineNotification(clientID string, endedConnectionID int64) {
|
||||
// Send notification
|
||||
message := fmt.Sprintf("🔴%s is offline", client.Name)
|
||||
go func(msg string) {
|
||||
if err := messageSender.SendTextMessage(msg, "Komari Offline Notification"); err != nil {
|
||||
if err := messageSender.SendEvent(models.EventMessage{
|
||||
Event: messageevent.Offline,
|
||||
Clients: []models.Client{client},
|
||||
Time: time.Now(),
|
||||
//Message: msg,
|
||||
Emoji: "🔴",
|
||||
}); err != nil {
|
||||
log.Println("Failed to send offline notification:", err)
|
||||
}
|
||||
}(message)
|
||||
@@ -161,7 +168,7 @@ func OnlineNotification(clientID string, connectionID int64) {
|
||||
// 规则3: 没断开后重连, 不通知
|
||||
// 为了解决OfflineNotify中不是全程加锁
|
||||
if state.isConnExist {
|
||||
log.Println("%s has connection exist: %d", clientID, connectionID)
|
||||
log.Printf("%s has connection exist: %d", clientID, connectionID)
|
||||
return
|
||||
} else {
|
||||
state.isConnExist = true
|
||||
@@ -170,7 +177,13 @@ func OnlineNotification(clientID string, connectionID int64) {
|
||||
// 规则4:客户端离线足够久已通知(或未待离线),现在重新上线,发送上线通知。
|
||||
message := fmt.Sprintf("🟢%s is online", client.Name)
|
||||
go func(msg string) {
|
||||
if err := messageSender.SendTextMessage(msg, "Komari Online Notification"); err != nil {
|
||||
if err := messageSender.SendEvent(models.EventMessage{
|
||||
Event: messageevent.Online,
|
||||
Clients: []models.Client{client},
|
||||
Time: time.Now(),
|
||||
//Message: msg,
|
||||
Emoji: "🟢",
|
||||
}); err != nil {
|
||||
log.Println("Failed to send online notification:", err)
|
||||
}
|
||||
}(message)
|
||||
|
@@ -8,6 +8,7 @@ import (
|
||||
|
||||
"github.com/komari-monitor/komari/database/clients"
|
||||
"github.com/komari-monitor/komari/database/config"
|
||||
"github.com/komari-monitor/komari/database/models"
|
||||
"github.com/komari-monitor/komari/utils/messageSender"
|
||||
"github.com/komari-monitor/komari/ws"
|
||||
cache "github.com/patrickmn/go-cache"
|
||||
@@ -87,10 +88,15 @@ func CheckTraffic() {
|
||||
if curStep > lastStep { // 只在进入新步进时提醒一次
|
||||
trafficCache.SetDefault(key, curStep)
|
||||
|
||||
title := "Komari Traffic Alert"
|
||||
msg := fmt.Sprintf("%s traffic used %d%% (%s / %s), type=%s", c.Name, curStep, humanBytes(used), humanBytes(c.TrafficLimit), strings.ToLower(c.TrafficLimitType))
|
||||
msg := fmt.Sprintf("used %d%% (%s / %s), type=%s", curStep, humanBytes(used), humanBytes(c.TrafficLimit), strings.ToLower(c.TrafficLimitType))
|
||||
// 发送通知(内部会检查 NotificationEnabled)
|
||||
_ = messageSender.SendTextMessage(msg, title)
|
||||
_ = messageSender.SendEvent(models.EventMessage{
|
||||
Event: "Traffic",
|
||||
Clients: []models.Client{c},
|
||||
Time: time.Now(),
|
||||
Emoji: "⚠️",
|
||||
Message: msg,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -7,17 +7,18 @@ import (
|
||||
"github.com/komari-monitor/komari/database/auditlog"
|
||||
"github.com/komari-monitor/komari/database/clients"
|
||||
"github.com/komari-monitor/komari/database/models"
|
||||
messageevent "github.com/komari-monitor/komari/database/models/messageEvent"
|
||||
"github.com/komari-monitor/komari/utils/messageSender"
|
||||
"github.com/komari-monitor/komari/ws"
|
||||
)
|
||||
|
||||
func CheckAndAutoRenewal(client models.Client) {
|
||||
// 自动续费检查
|
||||
type renewedClient struct {
|
||||
Name string
|
||||
NewExpireTime time.Time
|
||||
}
|
||||
var renewedClients []renewedClient
|
||||
//type renewedClient struct {
|
||||
// Name string
|
||||
// NewExpireTime time.Time
|
||||
//}
|
||||
//var renewedClients []renewedClient
|
||||
|
||||
if !client.AutoRenewal {
|
||||
return
|
||||
@@ -96,22 +97,36 @@ func CheckAndAutoRenewal(client models.Client) {
|
||||
return
|
||||
}
|
||||
|
||||
renewedClients = append(renewedClients, renewedClient{
|
||||
Name: client.Name,
|
||||
NewExpireTime: newExpireTime,
|
||||
})
|
||||
//renewedClients = append(renewedClients, renewedClient{
|
||||
// Name: client.Name,
|
||||
// NewExpireTime: newExpireTime,
|
||||
//})
|
||||
|
||||
auditlog.EventLog("renewal", fmt.Sprintf("Auto-renewed client: %s until %s",
|
||||
client.Name, newExpireTime.Format("2006-01-02")))
|
||||
|
||||
messageSender.SendEvent(models.EventMessage{
|
||||
Event: messageevent.Renew,
|
||||
Clients: []models.Client{client},
|
||||
Time: time.Now(),
|
||||
Emoji: "🔄",
|
||||
Message: fmt.Sprintf("• %s until %s\n", client.Name, newExpireTime.Format("2006-01-02")),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// 发送续费通知
|
||||
if len(renewedClients) > 0 {
|
||||
message := "The following clients have been automatically renewed: \n\n"
|
||||
for _, clientInfo := range renewedClients {
|
||||
message += fmt.Sprintf("• %s until %s\n", clientInfo.Name, clientInfo.NewExpireTime.Format("2006-01-02"))
|
||||
}
|
||||
messageSender.SendTextMessage(message, "Komari Auto-Renewal Notification")
|
||||
}
|
||||
// if len(renewedClients) > 0 {
|
||||
// message := ""
|
||||
// for _, clientInfo := range renewedClients {
|
||||
// message += fmt.Sprintf("• %s until %s\n", clientInfo.Name, clientInfo.NewExpireTime.Format("2006-01-02"))
|
||||
// }
|
||||
// messageSender.SendEvent(models.EventMessage{
|
||||
// Event: messageevent.Renew,
|
||||
// Clients: []models.Client{client},
|
||||
// Time: time.Now(),
|
||||
// Emoji: "🔄",
|
||||
// Message: message,
|
||||
// })
|
||||
// }
|
||||
}
|
||||
|
Reference in New Issue
Block a user