This repository has been archived on 2021-06-24. You can view files and clone it, but cannot push or open issues or pull requests.
ui/go/characters/incominglistener.go

83 lines
3.1 KiB
Go
Raw Normal View History

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"
"encoding/base32"
2019-02-11 20:23:31 +00:00
"git.openprivacy.ca/openprivacy/libricochet-go/log"
"strings"
2019-01-21 21:17:51 +00:00
"time"
)
func IncomingListener(callback func(*gobjects.Message), groupErrorCallback func(string, string, string), serverStateCallback func(string, bool)) {
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)
the.CwtchApp.EventBus().Subscribe(event.JoinServer, q.EventChannel)
the.CwtchApp.EventBus().Subscribe(event.FinishedFetch, q.EventChannel)
2019-01-21 21:17:51 +00:00
for {
e := q.Next()
switch e.EventType {
case event.NewMessageFromPeer: //event.TimestampReceived, event.RemotePeer, event.Data
2019-01-22 19:12:20 +00:00
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
})
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")
}
case event.NewMessageFromGroup: //event.TimestampReceived, event.TimestampSent, event.Data, event.GroupID, event.RemotePeer
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]
}
} else {
2019-04-17 21:03:50 +00:00
name = e.Data[event.RemotePeer]
}
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{
MessageID: e.Data[event.Signature],
Handle: e.Data[event.GroupID],
From: e.Data[event.RemotePeer],
Message: e.Data[event.Data],
Image: cwutil.RandomProfileImage(e.Data[event.RemotePeer]),
FromMe: e.Data[event.RemotePeer] == the.Peer.GetProfile().Onion,
Timestamp: ts,
Acknowledged: true,
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:
groupErrorCallback(e.Data[event.GroupServer], e.Data[event.Signature], e.Data[event.Error])
2019-03-04 22:02:11 +00:00
case event.SendMessageToPeerError:
groupErrorCallback(e.Data[event.RemotePeer], e.Data[event.Signature], e.Data[event.Error])
case event.JoinServer:
serverStateCallback(e.Data[event.GroupServer], true)
case event.FinishedFetch:
serverStateCallback(e.Data[event.GroupServer], false)
2019-01-21 21:17:51 +00:00
}
}
}