2019-01-21 21:17:51 +00:00
|
|
|
package characters
|
|
|
|
|
|
|
|
import (
|
|
|
|
"cwtch.im/cwtch/event"
|
|
|
|
"cwtch.im/ui/go/cwutil"
|
|
|
|
"cwtch.im/ui/go/gobjects"
|
|
|
|
"cwtch.im/ui/go/the"
|
2019-02-14 17:54:15 +00:00
|
|
|
"encoding/base32"
|
2019-02-11 20:23:31 +00:00
|
|
|
"git.openprivacy.ca/openprivacy/libricochet-go/log"
|
2019-02-14 17:54:15 +00:00
|
|
|
"strings"
|
2019-01-21 21:17:51 +00:00
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
2019-03-05 20:16:27 +00:00
|
|
|
func IncomingListener(callback func(*gobjects.Message), groupErrorCallback func(string, string,string)) {
|
2019-01-21 21:17:51 +00:00
|
|
|
q := event.NewEventQueue(1000)
|
|
|
|
the.CwtchApp.EventBus().Subscribe(event.NewMessageFromPeer, q.EventChannel)
|
|
|
|
the.CwtchApp.EventBus().Subscribe(event.NewMessageFromGroup, q.EventChannel)
|
2019-02-11 20:23:31 +00:00
|
|
|
the.CwtchApp.EventBus().Subscribe(event.NewGroupInvite, q.EventChannel)
|
2019-02-20 21:45:42 +00:00
|
|
|
the.CwtchApp.EventBus().Subscribe(event.SendMessageToGroupError, q.EventChannel)
|
2019-03-04 22:02:11 +00:00
|
|
|
the.CwtchApp.EventBus().Subscribe(event.SendMessageToPeerError, q.EventChannel)
|
2019-01-21 21:17:51 +00:00
|
|
|
|
|
|
|
for {
|
|
|
|
e := q.Next()
|
|
|
|
|
|
|
|
switch e.EventType {
|
2019-01-22 19:12:20 +00:00
|
|
|
case event.NewMessageFromPeer://event.TimestampReceived, event.RemotePeer, event.Data
|
|
|
|
ts, _ := time.Parse(time.RFC3339Nano, e.Data[event.TimestampReceived])
|
2019-01-21 21:17:51 +00:00
|
|
|
callback(&gobjects.Message{
|
2019-01-22 19:12:20 +00:00
|
|
|
Handle: e.Data[event.RemotePeer],
|
|
|
|
From: e.Data[event.RemotePeer],
|
|
|
|
Message: e.Data[event.Data],
|
|
|
|
Image: cwutil.RandomProfileImage(e.Data[event.RemotePeer]),
|
|
|
|
Timestamp: ts,
|
2019-01-21 21:17:51 +00:00
|
|
|
})
|
2019-02-14 17:54:15 +00:00
|
|
|
if the.Peer.GetContact(e.Data[event.RemotePeer]) == nil {
|
|
|
|
decodedPub, _ := base32.StdEncoding.DecodeString(strings.ToUpper(e.Data[event.RemotePeer]))
|
|
|
|
the.Peer.AddContact(e.Data[event.RemotePeer], e.Data[event.RemotePeer], decodedPub, false)
|
|
|
|
}
|
2019-02-04 22:22:58 +00:00
|
|
|
the.Peer.PeerWithOnion(e.Data[event.RemotePeer])
|
|
|
|
if e.Data[event.Data] != "ack" {
|
|
|
|
the.Peer.SendMessageToPeer(e.Data[event.RemotePeer], "ack")
|
|
|
|
}
|
2019-01-22 19:12:20 +00:00
|
|
|
case event.NewMessageFromGroup://event.TimestampReceived, event.TimestampSent, event.Data, event.GroupID, event.RemotePeer
|
2019-02-23 00:21:19 +00:00
|
|
|
var name string
|
|
|
|
var exists bool
|
|
|
|
ctc := the.Peer.GetContact(e.Data[event.RemotePeer])
|
|
|
|
if ctc != nil {
|
|
|
|
name, exists = ctc.GetAttribute("nick")
|
|
|
|
if !exists || name == "" {
|
2019-04-17 21:03:50 +00:00
|
|
|
name = e.Data[event.RemotePeer]
|
2019-02-23 00:21:19 +00:00
|
|
|
}
|
|
|
|
} else {
|
2019-04-17 21:03:50 +00:00
|
|
|
name = e.Data[event.RemotePeer]
|
2019-02-23 00:21:19 +00:00
|
|
|
}
|
|
|
|
|
2019-01-30 20:46:31 +00:00
|
|
|
ts, _ := time.Parse(time.RFC3339Nano, e.Data[event.TimestampSent])
|
2019-01-21 21:17:51 +00:00
|
|
|
callback(&gobjects.Message{
|
2019-02-20 20:07:12 +00:00
|
|
|
MessageID: e.Data[event.Signature],
|
2019-01-22 19:12:20 +00:00
|
|
|
Handle: e.Data[event.GroupID],
|
|
|
|
From: e.Data[event.RemotePeer],
|
|
|
|
Message: e.Data[event.Data],
|
2019-01-30 19:58:23 +00:00
|
|
|
Image: cwutil.RandomProfileImage(e.Data[event.RemotePeer]),
|
2019-02-04 23:05:38 +00:00
|
|
|
FromMe: e.Data[event.RemotePeer] == the.Peer.GetProfile().Onion,
|
2019-01-22 19:12:20 +00:00
|
|
|
Timestamp: ts,
|
2019-02-20 20:07:12 +00:00
|
|
|
Acknowledged: true,
|
2019-02-23 00:21:19 +00:00
|
|
|
DisplayName: name,
|
2019-01-21 21:17:51 +00:00
|
|
|
})
|
2019-02-11 20:23:31 +00:00
|
|
|
case event.NewGroupInvite:
|
|
|
|
log.Debugf("got a group invite!")
|
2019-02-20 21:45:42 +00:00
|
|
|
case event.SendMessageToGroupError:
|
2019-03-05 20:16:27 +00:00
|
|
|
groupErrorCallback(e.Data[event.GroupServer], e.Data[event.Signature], e.Data[event.Error])
|
2019-03-04 22:02:11 +00:00
|
|
|
case event.SendMessageToPeerError:
|
2019-03-05 20:16:27 +00:00
|
|
|
groupErrorCallback(e.Data[event.RemotePeer], e.Data[event.Signature], e.Data[event.Error])
|
2019-01-21 21:17:51 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|