54 lines
1.2 KiB
Go
54 lines
1.2 KiB
Go
package notify
|
|
|
|
import (
|
|
"github.com/kercylan98/minotaur/utils/log"
|
|
"reflect"
|
|
)
|
|
|
|
// NewManager 通过指定的 Sender 创建一个通知管理器, senders 包中提供了一些内置的 Sender
|
|
func NewManager(senders ...Sender) *Manager {
|
|
manager := &Manager{
|
|
senders: senders,
|
|
closeChannel: make(chan struct{}),
|
|
notifyChannel: make(chan Notify, 48),
|
|
}
|
|
|
|
go func() {
|
|
for {
|
|
select {
|
|
case <-manager.closeChannel:
|
|
close(manager.closeChannel)
|
|
close(manager.notifyChannel)
|
|
log.Info("m", log.String("state", "release"))
|
|
return
|
|
case notify := <-manager.notifyChannel:
|
|
for _, sender := range manager.senders {
|
|
if err := sender.Push(notify); err != nil {
|
|
log.Error("m", log.String("sender", reflect.TypeOf(sender).String()), log.Err(err))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}()
|
|
|
|
log.Info("m", log.String("state", "running"))
|
|
return manager
|
|
}
|
|
|
|
// Manager 通知管理器,可用于将通知同时发送至多个渠道
|
|
type Manager struct {
|
|
senders []Sender
|
|
notifyChannel chan Notify
|
|
closeChannel chan struct{}
|
|
}
|
|
|
|
// PushNotify 推送通知
|
|
func (slf *Manager) PushNotify(notify Notify) {
|
|
slf.notifyChannel <- notify
|
|
}
|
|
|
|
// Release 释放通知管理器
|
|
func (slf *Manager) Release() {
|
|
slf.closeChannel <- struct{}{}
|
|
}
|