package model import ( "sort" "sync" "time" ) type Timeline struct { Messages []Message lock sync.Mutex } // Message is a local representation of a given message sent over a group chat channel. type Message struct { Timestamp time.Time Received 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 t.Messages[i].Timestamp.Before(t.Messages[j].Timestamp) { return true } 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 compareSignatures(t.Messages[i].Signature, t.Messages[j].PreviousMessageSig) { return true } return false } func (t *Timeline) Insert(mi *Message) { t.lock.Lock() for _, m := range t.Messages { if compareSignatures(m.Signature, mi.Signature) { t.lock.Unlock() return } } t.Messages = append(t.Messages, *mi) sort.Sort(t) t.lock.Unlock() }