mirror of
https://github.com/yusing/godoxy.git
synced 2026-04-23 00:38:33 +02:00
refactor and fix duplicate notification
This commit is contained in:
@@ -192,9 +192,10 @@ func (cfg *Config) initNotification(notifCfg []types.NotificationConfig) (err E.
|
|||||||
if len(notifCfg) == 0 {
|
if len(notifCfg) == 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
dispatcher := notif.StartNotifDispatcher(cfg.task)
|
||||||
errs := E.NewBuilder("notification providers load errors")
|
errs := E.NewBuilder("notification providers load errors")
|
||||||
for i, notifier := range notifCfg {
|
for i, notifier := range notifCfg {
|
||||||
_, err := notif.RegisterProvider(cfg.task.Subtask("notifier"), notifier)
|
_, err := dispatcher.RegisterProvider(notifier)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,24 +35,21 @@ var (
|
|||||||
|
|
||||||
const dispatchErr = "notification dispatch error"
|
const dispatchErr = "notification dispatch error"
|
||||||
|
|
||||||
func init() {
|
func StartNotifDispatcher(parent task.Task) *Dispatcher {
|
||||||
dispatcher = newNotifDispatcher()
|
dispatcher = &Dispatcher{
|
||||||
go dispatcher.start()
|
task: parent.Subtask("notification dispatcher"),
|
||||||
}
|
|
||||||
|
|
||||||
func newNotifDispatcher() *Dispatcher {
|
|
||||||
return &Dispatcher{
|
|
||||||
task: task.GlobalTask("notif dispatcher"),
|
|
||||||
logCh: make(chan *LogMessage),
|
logCh: make(chan *LogMessage),
|
||||||
providers: F.NewSet[Provider](),
|
providers: F.NewSet[Provider](),
|
||||||
}
|
}
|
||||||
}
|
go dispatcher.start()
|
||||||
|
|
||||||
func GetDispatcher() *Dispatcher {
|
|
||||||
return dispatcher
|
return dispatcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func RegisterProvider(configSubTask task.Task, cfg types.NotificationConfig) (Provider, E.Error) {
|
func Notify(msg *LogMessage) {
|
||||||
|
dispatcher.logCh <- msg
|
||||||
|
}
|
||||||
|
|
||||||
|
func (disp *Dispatcher) RegisterProvider(cfg types.NotificationConfig) (Provider, E.Error) {
|
||||||
providerName, ok := cfg["provider"]
|
providerName, ok := cfg["provider"]
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, ErrMissingNotifProvider
|
return nil, ErrMissingNotifProvider
|
||||||
@@ -69,10 +66,7 @@ func RegisterProvider(configSubTask task.Task, cfg types.NotificationConfig) (Pr
|
|||||||
|
|
||||||
provider, err := createFunc(cfg)
|
provider, err := createFunc(cfg)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
dispatcher.providers.Add(provider)
|
disp.providers.Add(provider)
|
||||||
configSubTask.OnCancel("remove provider", func() {
|
|
||||||
dispatcher.providers.Remove(provider)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
return provider, err
|
return provider, err
|
||||||
default:
|
default:
|
||||||
@@ -81,7 +75,11 @@ func RegisterProvider(configSubTask task.Task, cfg types.NotificationConfig) (Pr
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (disp *Dispatcher) start() {
|
func (disp *Dispatcher) start() {
|
||||||
defer dispatcher.task.Finish("dispatcher stopped")
|
defer func() {
|
||||||
|
disp.providers.Clear()
|
||||||
|
close(disp.logCh)
|
||||||
|
disp.task.Finish("dispatcher stopped")
|
||||||
|
}()
|
||||||
|
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
@@ -123,7 +121,3 @@ func (disp *Dispatcher) dispatch(msg *LogMessage) {
|
|||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
func Notify(msg *LogMessage) {
|
|
||||||
dispatcher.logCh <- msg
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -22,6 +22,10 @@ func (set Set[T]) Remove(v T) {
|
|||||||
set.m.Delete(v)
|
set.m.Delete(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (set Set[T]) Clear() {
|
||||||
|
set.m.Clear()
|
||||||
|
}
|
||||||
|
|
||||||
func (set Set[T]) Contains(v T) bool {
|
func (set Set[T]) Contains(v T) bool {
|
||||||
_, ok := set.m.Load(v)
|
_, ok := set.m.Load(v)
|
||||||
return ok
|
return ok
|
||||||
|
|||||||
Reference in New Issue
Block a user