nginx-ui/internal/notification/external.go
2025-04-09 17:25:07 +08:00

100 lines
2.2 KiB
Go

package notification
import (
"context"
"sync"
"github.com/0xJacky/Nginx-UI/internal/translation"
"github.com/0xJacky/Nginx-UI/model"
"github.com/0xJacky/Nginx-UI/query"
"github.com/uozi-tech/cosy/logger"
)
var (
externalNotifierRegistry = make(map[string]ExternalNotifierHandlerFunc)
externalNotifierRegistryMutex = &sync.RWMutex{}
)
type ExternalNotifierHandlerFunc func(ctx context.Context, n *model.ExternalNotify, msg *ExternalMessage) error
func externalNotifierHandler(n *model.ExternalNotify, msg *model.Notification) (ExternalNotifierHandlerFunc, error) {
externalNotifierRegistryMutex.RLock()
defer externalNotifierRegistryMutex.RUnlock()
notifier, ok := externalNotifierRegistry[n.Type]
if !ok {
return nil, ErrNotifierNotFound
}
return notifier, nil
}
func RegisterExternalNotifier(name string, handler ExternalNotifierHandlerFunc) {
externalNotifierRegistryMutex.Lock()
defer externalNotifierRegistryMutex.Unlock()
externalNotifierRegistry[name] = handler
}
type ExternalMessage struct {
Notification *model.Notification
}
func (n *ExternalMessage) Send() {
en := query.ExternalNotify
externalNotifies, err := en.Find()
if err != nil {
logger.Error(err)
return
}
ctx := context.Background()
for _, externalNotify := range externalNotifies {
go func(externalNotify *model.ExternalNotify) {
notifier, err := externalNotifierHandler(externalNotify, n.Notification)
if err != nil {
logger.Error(err)
return
}
notifier(ctx, externalNotify, n)
}(externalNotify)
}
}
func (n *ExternalMessage) GetTitle(lang string) string {
if n.Notification == nil {
return ""
}
dict, ok := translation.Dict[lang]
if !ok {
dict = translation.Dict["en"]
}
title, err := dict.Translate(n.Notification.Title)
if err != nil {
logger.Error(err)
return n.Notification.Title
}
return title
}
func (n *ExternalMessage) GetContent(lang string) string {
if n.Notification == nil {
return ""
}
if n.Notification.Details == nil {
return n.Notification.Content
}
dict, ok := translation.Dict[lang]
if !ok {
dict = translation.Dict["en"]
}
content, err := dict.Translate(n.Notification.Content, n.Notification.Details)
if err != nil {
logger.Error(err)
return n.Notification.Content
}
return content
}