cwtch/model/message.go

65 lines
1.2 KiB
Go
Raw Normal View History

2018-03-09 20:44:13 +00:00
package model
import (
"sort"
"sync"
2018-03-09 20:44:13 +00:00
"time"
)
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 {
Timestamp time.Time
PeerID string
Message string
Signature []byte
Verified bool
PreviousMessageSig []byte
}
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) Len() int {
return len(t.Messages)
}
func (t Timeline) Swap(i, j int) {
t.Messages[i], t.Messages[j] = t.Messages[j], t.Messages[i]
}
func (t Timeline) Less(i, j int) bool {
if compareSignatures(t.Messages[i].PreviousMessageSig, []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) {
return true
}
if t.Messages[i].Timestamp.Before(t.Messages[j].Timestamp) {
return true
}
if compareSignatures(t.Messages[i].Signature, t.Messages[j].PreviousMessageSig) {
return true
}
return false
}
func (t *Timeline) Insert(mi *Message) {
t.lock.Lock()
t.Messages = append(t.Messages, *mi)
sort.Sort(t)
t.lock.Unlock()
2018-03-09 20:44:13 +00:00
}