remove frontend message storage #228
2
go.mod
2
go.mod
|
@ -3,7 +3,7 @@ module cwtch.im/ui
|
||||||
go 1.12
|
go 1.12
|
||||||
|
|
||||||
require (
|
require (
|
||||||
cwtch.im/cwtch v0.3.1
|
cwtch.im/cwtch v0.3.2
|
||||||
git.openprivacy.ca/openprivacy/libricochet-go v1.0.6
|
git.openprivacy.ca/openprivacy/libricochet-go v1.0.6
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f // indirect
|
github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f // indirect
|
||||||
github.com/kr/pretty v0.1.0 // indirect
|
github.com/kr/pretty v0.1.0 // indirect
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -2,8 +2,12 @@ cwtch.im/cwtch v0.3.0 h1:RFZyc2m9BowFNdngBs7GcQE41w75jMp3Ku5zEE92v9I=
|
||||||
cwtch.im/cwtch v0.3.0/go.mod h1:8tmtp3c7fccWw9H7s9u6E8GD2PKI3ar21i0fjN8pzd0=
|
cwtch.im/cwtch v0.3.0/go.mod h1:8tmtp3c7fccWw9H7s9u6E8GD2PKI3ar21i0fjN8pzd0=
|
||||||
cwtch.im/cwtch v0.3.1 h1:C0DLIrOqpNs5aecKTjNJZhpMq4/EvWNmLiKklIS8RTM=
|
cwtch.im/cwtch v0.3.1 h1:C0DLIrOqpNs5aecKTjNJZhpMq4/EvWNmLiKklIS8RTM=
|
||||||
cwtch.im/cwtch v0.3.1/go.mod h1:8tmtp3c7fccWw9H7s9u6E8GD2PKI3ar21i0fjN8pzd0=
|
cwtch.im/cwtch v0.3.1/go.mod h1:8tmtp3c7fccWw9H7s9u6E8GD2PKI3ar21i0fjN8pzd0=
|
||||||
|
cwtch.im/cwtch v0.3.2 h1:JxoauToMckHjmQz3QCmI7XG9pun1tF3pV/o5ziuqV1A=
|
||||||
|
cwtch.im/cwtch v0.3.2/go.mod h1:4b2qGW5bZKm4CwYxqc0+4pgpDU0LjjyoihC8a/ezOoQ=
|
||||||
cwtch.im/tapir v0.1.10 h1:V+TkmwXNd6gySZqlVw468wMYEkmDwMSyvhkkpOfUw7w=
|
cwtch.im/tapir v0.1.10 h1:V+TkmwXNd6gySZqlVw468wMYEkmDwMSyvhkkpOfUw7w=
|
||||||
cwtch.im/tapir v0.1.10/go.mod h1:EuRYdVrwijeaGBQ4OijDDRHf7R2MDSypqHkSl5DxI34=
|
cwtch.im/tapir v0.1.10/go.mod h1:EuRYdVrwijeaGBQ4OijDDRHf7R2MDSypqHkSl5DxI34=
|
||||||
|
cwtch.im/tapir v0.1.11 h1:JLm1MIYq4VXKzhj68+P8OuVPllAU9U6G0DtUor2fbc4=
|
||||||
|
cwtch.im/tapir v0.1.11/go.mod h1:EuRYdVrwijeaGBQ4OijDDRHf7R2MDSypqHkSl5DxI34=
|
||||||
git.openprivacy.ca/openprivacy/libricochet-go v1.0.4/go.mod h1:yMSG1gBaP4f1U+RMZXN85d29D39OK5s8aTpyVRoH5FY=
|
git.openprivacy.ca/openprivacy/libricochet-go v1.0.4/go.mod h1:yMSG1gBaP4f1U+RMZXN85d29D39OK5s8aTpyVRoH5FY=
|
||||||
git.openprivacy.ca/openprivacy/libricochet-go v1.0.6 h1:5o4K2qn3otEE1InC5v5CzU0yL7Wl7DhVp4s8H3K6mXY=
|
git.openprivacy.ca/openprivacy/libricochet-go v1.0.6 h1:5o4K2qn3otEE1InC5v5CzU0yL7Wl7DhVp4s8H3K6mXY=
|
||||||
git.openprivacy.ca/openprivacy/libricochet-go v1.0.6/go.mod h1:yMSG1gBaP4f1U+RMZXN85d29D39OK5s8aTpyVRoH5FY=
|
git.openprivacy.ca/openprivacy/libricochet-go v1.0.6/go.mod h1:yMSG1gBaP4f1U+RMZXN85d29D39OK5s8aTpyVRoH5FY=
|
||||||
|
|
|
@ -41,16 +41,8 @@ func IncomingListener(uiState *gothings.InterfaceState, subscribed chan bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
case event.PeerAcknowledgement:
|
case event.PeerAcknowledgement:
|
||||||
ackI, ok := the.AcknowledgementIDs.Load(e.Data[event.EventID])
|
uiState.Acknowledge(e.Data[event.EventID])
|
||||||
if ok {
|
|
||||||
ack := ackI.(*the.AckId)
|
|
||||||
if ack.Peer == e.Data[event.RemotePeer] {
|
|
||||||
ack.Ack = true
|
|
||||||
uiState.Acknowledge(e.Data[event.EventID])
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log.Debugf("Received Ack ID for unknown message or peer: %v", e)
|
|
||||||
case event.NewMessageFromGroup: //event.TimestampReceived, event.TimestampSent, event.Data, event.GroupID, event.RemotePeer
|
case event.NewMessageFromGroup: //event.TimestampReceived, event.TimestampSent, event.Data, event.GroupID, event.RemotePeer
|
||||||
var name string
|
var name string
|
||||||
var exists bool
|
var exists bool
|
||||||
|
@ -92,7 +84,7 @@ func IncomingListener(uiState *gothings.InterfaceState, subscribed chan bool) {
|
||||||
case event.SendMessageToGroupError:
|
case event.SendMessageToGroupError:
|
||||||
uiState.AddSendMessageError(e.Data[event.GroupServer], e.Data[event.Signature], e.Data[event.Error])
|
uiState.AddSendMessageError(e.Data[event.GroupServer], e.Data[event.Signature], e.Data[event.Error])
|
||||||
case event.SendMessageToPeerError:
|
case event.SendMessageToPeerError:
|
||||||
uiState.AddSendMessageError(e.Data[event.RemotePeer], e.Data[event.Signature], e.Data[event.Error])
|
uiState.AddSendMessageError(e.Data[event.RemotePeer], e.Data[event.EventID], e.Data[event.Error])
|
||||||
case event.PeerStateChange:
|
case event.PeerStateChange:
|
||||||
cxnState := connections.ConnectionStateToType[e.Data[event.ConnectionState]]
|
cxnState := connections.ConnectionStateToType[e.Data[event.ConnectionState]]
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
package constants
|
||||||
|
|
||||||
|
const Nick = "nick"
|
||||||
|
const LastRead = "last-read"
|
|
@ -5,7 +5,7 @@ type Contact struct {
|
||||||
DisplayName string
|
DisplayName string
|
||||||
Image string
|
Image string
|
||||||
Server string
|
Server string
|
||||||
Badge int
|
Badge int // # of unread
|
||||||
Status int
|
Status int
|
||||||
Trusted bool
|
Trusted bool
|
||||||
Blocked bool
|
Blocked bool
|
||||||
|
|
|
@ -148,12 +148,6 @@ func (this *GrandCentralDispatcher) sendMessage(message string, mID string) {
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
})
|
})
|
||||||
|
|
||||||
ackID := new(the.AckId)
|
|
||||||
ackID.ID = mID
|
|
||||||
ackID.Ack = false
|
|
||||||
ackID.Peer = to
|
|
||||||
the.AcknowledgementIDs.Store(mID, ackID)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -232,42 +226,48 @@ func (this *GrandCentralDispatcher) loadMessagesPaneHelper(handle string) {
|
||||||
} // ELSE LOAD CONTACT
|
} // ELSE LOAD CONTACT
|
||||||
|
|
||||||
contact, _ := the.Peer.GetProfile().GetContact(handle)
|
contact, _ := the.Peer.GetProfile().GetContact(handle)
|
||||||
|
var nick string
|
||||||
if contact != nil {
|
if contact != nil {
|
||||||
nick, _ := contact.GetAttribute("nick")
|
nick, _ = contact.GetAttribute("nick")
|
||||||
if nick == "" {
|
if nick == "" {
|
||||||
this.SetToolbarTitle(handle)
|
nick = handle
|
||||||
} else {
|
|
||||||
this.SetToolbarTitle(nick)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.SetToolbarTitle(nick)
|
||||||
|
|
||||||
messages := this.UIState.GetMessages(handle)
|
peer := the.Peer.GetContact(handle)
|
||||||
|
messages := peer.Timeline.GetMessages()
|
||||||
for i := range messages {
|
for i := range messages {
|
||||||
from := messages[i].From
|
from := messages[i].PeerID
|
||||||
if messages[i].FromMe {
|
fromMe := messages[i].PeerID == the.Peer.GetProfile().Onion
|
||||||
|
if fromMe {
|
||||||
from = "me"
|
from = "me"
|
||||||
}
|
}
|
||||||
|
|
||||||
ackI, ok := the.AcknowledgementIDs.Load(messages[i].MessageID)
|
var displayname string
|
||||||
acked := false
|
ctc := the.Peer.GetContact(messages[i].PeerID)
|
||||||
if ok {
|
if ctc != nil {
|
||||||
ack := ackI.(*the.AckId)
|
var exists bool
|
||||||
acked = ack.Ack
|
displayname, exists = ctc.GetAttribute("nick")
|
||||||
|
if !exists || displayname == "" {
|
||||||
|
displayname = messages[i].PeerID
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
displayname = messages[i].PeerID
|
||||||
}
|
}
|
||||||
|
|
||||||
this.AppendMessage(
|
this.AppendMessage(
|
||||||
messages[i].Handle,
|
|
||||||
from,
|
from,
|
||||||
messages[i].DisplayName,
|
messages[i].PeerID,
|
||||||
|
displayname,
|
||||||
messages[i].Message,
|
messages[i].Message,
|
||||||
cwutil.RandomProfileImage(handle),
|
cwutil.RandomProfileImage(handle),
|
||||||
messages[i].MessageID,
|
string(messages[i].Signature),
|
||||||
messages[i].FromMe,
|
fromMe,
|
||||||
messages[i].Timestamp.Format(constants.TIME_FORMAT),
|
messages[i].Timestamp.Format(constants.TIME_FORMAT),
|
||||||
acked,
|
messages[i].Acknowledged,
|
||||||
messages[i].Error,
|
messages[i].Error != "",
|
||||||
)
|
)
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,11 +14,10 @@ import (
|
||||||
type InterfaceState struct {
|
type InterfaceState struct {
|
||||||
parentGcd *GrandCentralDispatcher
|
parentGcd *GrandCentralDispatcher
|
||||||
contacts sync.Map // string : *gobjects.Contact
|
contacts sync.Map // string : *gobjects.Contact
|
||||||
messages sync.Map
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewUIState(gcd *GrandCentralDispatcher) (uis InterfaceState) {
|
func NewUIState(gcd *GrandCentralDispatcher) (uis InterfaceState) {
|
||||||
uis = InterfaceState{gcd, sync.Map{}, sync.Map{}}
|
uis = InterfaceState{gcd, sync.Map{}}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,20 +108,6 @@ func (this *InterfaceState) GetContact(handle string) *gobjects.Contact {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *InterfaceState) AddSendMessageError(peer string, signature string, err string) {
|
func (this *InterfaceState) AddSendMessageError(peer string, signature string, err string) {
|
||||||
ackI, ok := the.AcknowledgementIDs.Load(signature)
|
|
||||||
if ok {
|
|
||||||
ack := ackI.(*the.AckId)
|
|
||||||
ack.Error = true
|
|
||||||
}
|
|
||||||
|
|
||||||
messages, _ := this.messages.Load(peer)
|
|
||||||
messageList, _ := messages.([]*gobjects.Message)
|
|
||||||
|
|
||||||
for _, message := range messageList {
|
|
||||||
if message.MessageID == signature {
|
|
||||||
message.Error = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log.Debugf("Received Error Sending Message: %v", err)
|
log.Debugf("Received Error Sending Message: %v", err)
|
||||||
// FIXME: Sometimes, for the first Peer message we send our error beats our message to the UI
|
// FIXME: Sometimes, for the first Peer message we send our error beats our message to the UI
|
||||||
time.Sleep(time.Second * 1)
|
time.Sleep(time.Second * 1)
|
||||||
|
@ -132,18 +117,6 @@ func (this *InterfaceState) AddSendMessageError(peer string, signature string, e
|
||||||
func (this *InterfaceState) AddMessage(m *gobjects.Message) {
|
func (this *InterfaceState) AddMessage(m *gobjects.Message) {
|
||||||
this.GetContact(m.From)
|
this.GetContact(m.From)
|
||||||
|
|
||||||
_, found := this.messages.Load(m.Handle)
|
|
||||||
if !found {
|
|
||||||
this.messages.Store(m.Handle, make([]*gobjects.Message, 0))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ack message sent to group
|
|
||||||
this.parentGcd.Acknowledged(m.MessageID)
|
|
||||||
|
|
||||||
messages, _ := this.messages.Load(m.Handle)
|
|
||||||
messageList, _ := messages.([]*gobjects.Message)
|
|
||||||
this.messages.Store(m.Handle, append(messageList, m))
|
|
||||||
|
|
||||||
// If we have this group loaded already
|
// If we have this group loaded already
|
||||||
if this.parentGcd.CurrentOpenConversation() == m.Handle {
|
if this.parentGcd.CurrentOpenConversation() == m.Handle {
|
||||||
// If the message is not from the user then add it, otherwise, just acknowledge.
|
// If the message is not from the user then add it, otherwise, just acknowledge.
|
||||||
|
@ -159,34 +132,18 @@ func (this *InterfaceState) AddMessage(m *gobjects.Message) {
|
||||||
this.UpdateContact(c.Handle)
|
this.UpdateContact(c.Handle)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *InterfaceState) GetMessages(handle string) []*gobjects.Message {
|
|
||||||
_, found := this.messages.Load(handle)
|
|
||||||
if !found {
|
|
||||||
this.messages.Store(handle, make([]*gobjects.Message, 0))
|
|
||||||
}
|
|
||||||
messages, found := this.messages.Load(handle)
|
|
||||||
messageList, _ := messages.([]*gobjects.Message)
|
|
||||||
return messageList
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *InterfaceState) UpdateContact(handle string) {
|
func (this *InterfaceState) UpdateContact(handle string) {
|
||||||
contact := the.Peer.GetContact(handle)
|
contact := the.Peer.GetContact(handle)
|
||||||
if contact != nil {
|
cif, found := this.contacts.Load(handle)
|
||||||
cif, found := this.contacts.Load(handle)
|
if found {
|
||||||
if found {
|
c := cif.(*gobjects.Contact)
|
||||||
c := cif.(*gobjects.Contact)
|
if contact != nil {
|
||||||
c.Blocked = contact.Blocked
|
c.Blocked = contact.Blocked
|
||||||
this.parentGcd.UpdateContact(c.Handle, c.DisplayName, c.Image, c.Server, c.Badge, c.Status, c.Trusted, c.Blocked, c.Loading)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
cif, found := this.contacts.Load(handle)
|
|
||||||
if found {
|
|
||||||
c := cif.(*gobjects.Contact)
|
|
||||||
this.parentGcd.UpdateContact(c.Handle, c.DisplayName, c.Image, c.Server, c.Badge, c.Status, c.Trusted, c.Blocked, c.Loading)
|
|
||||||
}
|
}
|
||||||
|
this.parentGcd.UpdateContact(c.Handle, c.DisplayName, c.Image, c.Server, c.Badge, c.Status, c.Trusted, c.Blocked, c.Loading)
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ import (
|
||||||
"cwtch.im/cwtch/event"
|
"cwtch.im/cwtch/event"
|
||||||
libPeer "cwtch.im/cwtch/peer"
|
libPeer "cwtch.im/cwtch/peer"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/connectivity"
|
"git.openprivacy.ca/openprivacy/libricochet-go/connectivity"
|
||||||
"sync"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Terrible, to be replaced when proper profile/password management comes in ~ 0.2
|
// Terrible, to be replaced when proper profile/password management comes in ~ 0.2
|
||||||
|
@ -19,12 +18,3 @@ var ACN connectivity.ACN
|
||||||
var Peer libPeer.CwtchPeer
|
var Peer libPeer.CwtchPeer
|
||||||
var CwtchDir string
|
var CwtchDir string
|
||||||
var IPCBridge event.IPCBridge
|
var IPCBridge event.IPCBridge
|
||||||
|
|
||||||
type AckId struct {
|
|
||||||
ID string
|
|
||||||
Peer string
|
|
||||||
Ack bool
|
|
||||||
Error bool
|
|
||||||
}
|
|
||||||
|
|
||||||
var AcknowledgementIDs sync.Map
|
|
||||||
|
|
|
@ -131,8 +131,6 @@ ApplicationWindow {
|
||||||
running: true
|
running: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
RowLayout { // CONTAINS EVERYTHING EXCEPT THE TOOLBAR
|
RowLayout { // CONTAINS EVERYTHING EXCEPT THE TOOLBAR
|
||||||
/* anchors.left: ratio >= 0.92 ? parent.left : toolbar.right
|
/* anchors.left: ratio >= 0.92 ? parent.left : toolbar.right
|
||||||
anchors.top: ratio >= 0.92 ? toolbar.bottom : parent.top
|
anchors.top: ratio >= 0.92 ? toolbar.bottom : parent.top
|
||||||
|
|
Reference in New Issue