2024-11-05 09:02:06 +00:00
|
|
|
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
|
2024-11-05 09:02:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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
|
2024-11-05 09:02:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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()
|
|
|
|
}
|