bbgo_origin/pkg/livenote/livenote.go
2024-11-05 17:34:26 +08:00

87 lines
1.4 KiB
Go

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
cachedObjID string
}
func NewLiveNote(object Object) *LiveNote {
return &LiveNote{
Object: object,
}
}
func (n *LiveNote) ObjectID() string {
if n.cachedObjID != "" {
return n.cachedObjID
}
n.cachedObjID = n.Object.ObjectID()
return n.cachedObjID
}
func (n *LiveNote) SetObject(object Object) {
n.Object = object
}
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(size int64) *Pool {
return &Pool{
notes: make(map[string]*LiveNote, size),
}
}
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 {
// update the object inside the note
note.SetObject(obj)
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()
}