ui/go/gothings/uistate.go

134 lines
3.3 KiB
Go
Raw Normal View History

2018-11-22 00:01:17 +00:00
package gothings
import (
2018-11-28 22:14:02 +00:00
"cwtch.im/ui/go/constants"
2019-02-05 21:09:38 +00:00
"cwtch.im/ui/go/cwutil"
2018-11-28 22:14:02 +00:00
"cwtch.im/ui/go/gobjects"
"cwtch.im/ui/go/the"
2018-11-22 00:01:17 +00:00
"encoding/base32"
"git.openprivacy.ca/openprivacy/libricochet-go/log"
2019-02-04 23:00:12 +00:00
"runtime/debug"
2018-11-28 20:34:49 +00:00
"strings"
2018-11-22 00:01:17 +00:00
)
type InterfaceState struct {
parentGcd *GrandCentralDispatcher
2018-11-28 20:34:49 +00:00
contacts map[string]*gobjects.Contact
messages map[string][]*gobjects.Message
2018-11-22 00:01:17 +00:00
}
func NewUIState(gcd *GrandCentralDispatcher) (uis InterfaceState) {
uis = InterfaceState{gcd, make(map[string]*gobjects.Contact), make(map[string][]*gobjects.Message)}
return
}
func (this *InterfaceState) AddContact(c *gobjects.Contact) {
if len(c.Handle) == 32 { // ADD GROUP
if _, found := this.contacts[c.Handle]; !found {
this.parentGcd.AddContact(c.Handle, c.DisplayName, c.Image, c.Server, c.Badge, c.Status, c.Trusted)
2019-02-13 03:08:23 +00:00
this.contacts[c.Handle] = c
2018-11-22 00:01:17 +00:00
}
return
} else if len(c.Handle) != 56 {
log.Errorf("sorry, unable to handle AddContact(%v)", c.Handle)
2019-02-04 23:00:12 +00:00
debug.PrintStack()
2018-11-22 00:01:17 +00:00
return
}
if _, found := this.contacts[c.Handle]; !found {
this.contacts[c.Handle] = c
this.parentGcd.AddContact(c.Handle, c.DisplayName, c.Image, c.Server, c.Badge, c.Status, c.Trusted)
2019-02-13 03:08:23 +00:00
if the.Peer.GetContact(c.Handle) == nil {
decodedPub, _ := base32.StdEncoding.DecodeString(strings.ToUpper(c.Handle))
the.Peer.AddContact(c.DisplayName, c.Handle, decodedPub, c.Trusted)
go the.Peer.PeerWithOnion(c.Handle)
}
2018-11-22 00:01:17 +00:00
}
}
func (this *InterfaceState) GetContact(handle string) *gobjects.Contact {
2019-02-05 21:09:38 +00:00
if _, found := this.contacts[handle]; !found {
2019-02-13 03:08:23 +00:00
if len(handle) == 32 {
this.AddContact(&gobjects.Contact{
handle,
handle,
cwutil.RandomGroupImage(handle),
"",
0,
0,
false,
})
group := the.Peer.GetGroup(handle)
go the.Peer.JoinServer(group.GroupServer)
} else {
this.AddContact(&gobjects.Contact{
handle,
handle,
cwutil.RandomProfileImage(handle),
"",
0,
0,
false,
})
go the.Peer.PeerWithOnion(handle)
2019-02-05 21:09:38 +00:00
}
}
2018-11-22 00:01:17 +00:00
return this.contacts[handle]
}
func (this *InterfaceState) AddMessage(m *gobjects.Message) {
_, found := this.contacts[m.Handle]
if !found {
this.AddContact(&gobjects.Contact{
m.Handle,
2019-02-05 21:48:24 +00:00
m.Handle,
cwutil.RandomProfileImage(m.Handle),
2018-11-22 00:01:17 +00:00
"",
2019-02-05 21:48:24 +00:00
0,
2018-11-22 00:01:17 +00:00
0,
false,
})
}
_, found = this.messages[m.Handle]
if !found {
this.messages[m.Handle] = make([]*gobjects.Message, 0)
}
2019-02-04 22:22:58 +00:00
if m.Message == "ack" {
// If an ack, swallow the message and ack from the list.
acklist := the.AcknowledgementIDs[m.From]
for _,ack := range acklist {
2019-02-11 21:05:01 +00:00
ack.Ack = true
this.parentGcd.Acknowledged(ack.ID)
2018-11-22 00:01:17 +00:00
}
} else {
2019-02-04 22:22:58 +00:00
this.messages[m.Handle] = append(this.messages[m.Handle], m)
if this.parentGcd.CurrentOpenConversation() == m.Handle {
this.parentGcd.AppendMessage(m.Handle, m.From, m.DisplayName, m.Message, m.Image, uint(m.MessageID), m.FromMe, m.Timestamp.Format(constants.TIME_FORMAT))
} else {
c := this.GetContact(m.Handle)
c.Badge++
this.UpdateContact(c.Handle)
}
2018-11-22 00:01:17 +00:00
}
2019-02-04 22:22:58 +00:00
2018-11-22 00:01:17 +00:00
}
func (this *InterfaceState) GetMessages(handle string) []*gobjects.Message {
_, found := this.messages[handle]
if !found {
this.messages[handle] = make([]*gobjects.Message, 0)
}
return this.messages[handle]
}
func (this *InterfaceState) UpdateContact(handle string) {
c, found := this.contacts[handle]
if found {
this.parentGcd.UpdateContact(c.Handle, c.DisplayName, c.Image, c.Server, c.Badge, c.Status, c.Trusted)
}
2018-11-28 20:34:49 +00:00
}