2018-03-09 20:44:13 +00:00
|
|
|
package model
|
|
|
|
|
|
|
|
import (
|
2018-04-02 21:10:29 +00:00
|
|
|
"log"
|
|
|
|
"sync"
|
2018-03-09 20:44:13 +00:00
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
2018-04-02 21:10:29 +00:00
|
|
|
type Timeline struct {
|
|
|
|
Messages []Message
|
|
|
|
lock sync.Mutex
|
|
|
|
}
|
|
|
|
|
2018-03-15 16:33:26 +00:00
|
|
|
// Message is a local representation of a given message sent over a group chat channel.
|
2018-03-09 20:44:13 +00:00
|
|
|
type Message struct {
|
2018-04-02 21:10:29 +00:00
|
|
|
Timestamp time.Time
|
|
|
|
PeerID string
|
|
|
|
Message string
|
|
|
|
Signature []byte
|
|
|
|
Verified bool
|
|
|
|
PreviousMessageSig []byte
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *Message) IsBefore(message *Message) bool {
|
|
|
|
if m.Timestamp.Before(message.Timestamp) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func compareSignatures(a []byte, b []byte) bool {
|
|
|
|
if len(a) != len(b) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
for i := range a {
|
|
|
|
if a[i] != b[i] {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *Timeline) Insert(mi *Message) {
|
|
|
|
t.lock.Lock()
|
|
|
|
insert := false
|
|
|
|
place := len(t.Messages)
|
|
|
|
for i, m := range t.Messages {
|
|
|
|
|
|
|
|
if compareSignatures(m.Signature, mi.PreviousMessageSig) {
|
|
|
|
log.Printf("comp %d %v %v %x %x", place, mi.Message, m.Message, m.Signature[0:3], mi.PreviousMessageSig[0:3])
|
|
|
|
insert = true
|
|
|
|
place = i + 1
|
|
|
|
break
|
|
|
|
}
|
|
|
|
|
|
|
|
if mi.IsBefore(&m) {
|
|
|
|
place = i
|
|
|
|
insert = true
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if insert == false {
|
|
|
|
t.Messages = append(t.Messages, *mi)
|
|
|
|
} else {
|
|
|
|
temp := make([]Message, len(t.Messages)+1)
|
|
|
|
copy(temp[0:place], t.Messages[0:place])
|
|
|
|
temp[place] = *mi
|
|
|
|
copy(temp[place+1:], t.Messages[place:])
|
|
|
|
t.Messages = temp
|
|
|
|
}
|
|
|
|
t.lock.Unlock()
|
2018-03-09 20:44:13 +00:00
|
|
|
}
|