mirror of
https://github.com/0xJacky/nginx-ui.git
synced 2025-05-10 18:05:48 +02:00
100 lines
2.2 KiB
Go
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
|
|
}
|