bbgo_origin/pkg/livenote/livenote.go

81 lines
1.3 KiB
Go
Raw Normal View History

package livenote
import "sync"
type Object interface {
ObjectID() string
}
type LiveNote struct {
// MessageID is the unique identifier of the message
// for slack, it's the timestamp of the message
MessageID string `json:"messageId"`
ChannelID string `json:"channelId"`
Object Object
2024-11-05 09:04:59 +00:00
cachedObjID string
}
func NewLiveNote(object Object) *LiveNote {
return &LiveNote{
Object: object,
}
}
func (n *LiveNote) ObjectID() string {
2024-11-05 09:04:59 +00:00
if n.cachedObjID != "" {
return n.cachedObjID
}
n.cachedObjID = n.Object.ObjectID()
return n.cachedObjID
}
func (n *LiveNote) SetMessageID(messageID string) {
n.MessageID = messageID
}
func (n *LiveNote) SetChannelID(channelID string) {
n.ChannelID = channelID
}
type Pool struct {
notes map[string]*LiveNote
mu sync.Mutex
}
func NewPool() *Pool {
return &Pool{
notes: make(map[string]*LiveNote, 100),
}
}
func (p *Pool) Update(obj Object) *LiveNote {
objID := obj.ObjectID()
p.mu.Lock()
defer p.mu.Unlock()
for _, note := range p.notes {
if note.ObjectID() == objID {
return note
}
}
note := NewLiveNote(obj)
p.add(objID, note)
return note
}
func (p *Pool) add(id string, note *LiveNote) {
p.notes[id] = note
}
func (p *Pool) Add(note *LiveNote) {
p.mu.Lock()
p.add(note.ObjectID(), note)
p.mu.Unlock()
}