cwtch/model/message.go

74 lines
1.3 KiB
Go
Raw Normal View History

2018-03-09 20:44:13 +00:00
package model
import (
"log"
"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 (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
}