123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- 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
- }
|