package handlers import ( "cwtch.im/cwtch/event" "cwtch.im/cwtch/protocol/connections" "cwtch.im/ui/go/the" "cwtch.im/ui/go/ui" "git.openprivacy.ca/openprivacy/libricochet-go/log" "time" ) func PeerHandler(uiManager *ui.Manager, subscribed chan bool) { q := event.NewQueue() the.EventBus.Subscribe(event.NewMessageFromPeer, q) the.EventBus.Subscribe(event.PeerAcknowledgement, q) the.EventBus.Subscribe(event.NewMessageFromGroup, q) the.EventBus.Subscribe(event.NewGroupInvite, q) the.EventBus.Subscribe(event.SendMessageToGroupError, q) the.EventBus.Subscribe(event.SendMessageToPeerError, q) the.EventBus.Subscribe(event.ServerStateChange, q) the.EventBus.Subscribe(event.PeerStateChange, q) the.EventBus.Subscribe(event.PeerCreated, q) the.EventBus.Subscribe(event.NetworkStatus, q) subscribed <- true networkOffline := false for { e := q.Next() switch e.EventType { case event.NetworkStatus: the.AppBus.Publish(*e) if e.Data["Status"] == "Success" && networkOffline { networkOffline = false // TODO we may have to reinitialize the peer } else { networkOffline = true } case event.NewMessageFromPeer: //event.TimestampReceived, event.RemotePeer, event.Data ts, _ := time.Parse(time.RFC3339Nano, e.Data[event.TimestampReceived]) uiManager.AddMessage(e.Data[event.RemotePeer], e.Data[event.RemotePeer], e.Data[event.Data], false, e.EventID, ts, true) if the.Peer.GetContact(e.Data[event.RemotePeer]) == nil { the.Peer.AddContact(e.Data[event.RemotePeer], e.Data[event.RemotePeer], false) } case event.PeerAcknowledgement: uiManager.Acknowledge(e.Data[event.EventID]) case event.NewMessageFromGroup: //event.TimestampReceived, event.TimestampSent, event.Data, event.GroupID, event.RemotePeer ts, _ := time.Parse(time.RFC3339Nano, e.Data[event.TimestampSent]) uiManager.AddMessage(e.Data[event.GroupID], e.Data[event.RemotePeer], e.Data[event.Data], e.Data[event.RemotePeer] == the.Peer.GetProfile().Onion, e.Data[event.Signature], ts, true) case event.NewGroupInvite: gid, err := the.Peer.GetProfile().ProcessInvite(e.Data[event.GroupInvite], e.Data[event.RemotePeer]) group := the.Peer.GetGroup(gid) if err == nil && group != nil { uiManager.AddContact(gid) } case event.PeerCreated: onion := e.Data[event.RemotePeer] uiManager.AddContact(onion) case event.SendMessageToGroupError: uiManager.AddSendMessageError(e.Data[event.GroupServer], e.Data[event.Signature], e.Data[event.Error]) case event.SendMessageToPeerError: uiManager.AddSendMessageError(e.Data[event.RemotePeer], e.Data[event.EventID], e.Data[event.Error]) case event.PeerStateChange: cxnState := connections.ConnectionStateToType[e.Data[event.ConnectionState]] // if it's not in the.PeerHandler it's new. Only add once Authed if _, exists := the.Peer.GetProfile().Contacts[e.Data[event.RemotePeer]]; !exists { // Contact does not exist, we will add them but we won't know who they are until they are authenticated // So if we get any other state from an unknown contact we do nothing // (the next exists check will fail) if cxnState == connections.AUTHENTICATED { the.Peer.AddContact(e.Data[event.RemotePeer], e.Data[event.RemotePeer], false) uiManager.AddContact(e.Data[event.RemotePeer]) } } // if it's in the.PeerHandler its either existing and needs an update or not in the UI and needs to be added if contact, exists := the.Peer.GetProfile().Contacts[e.Data[event.RemotePeer]]; exists { contact.State = e.Data[event.ConnectionState] uiManager.UpdateContactStatus(contact.Onion, int(cxnState), false) } case event.ServerStateChange: serverOnion := e.Data[event.GroupServer] state := connections.ConnectionStateToType[e.Data[event.ConnectionState]] groups := the.Peer.GetGroups() for _, groupID := range groups { group := the.Peer.GetGroup(groupID) if group != nil && group.GroupServer == serverOnion { group.State = e.Data[event.ConnectionState] loading := false if state == connections.AUTHENTICATED { loading = true } uiManager.UpdateContactStatus(group.GroupID, int(state), loading) } else { log.Errorf("found group that is nil :/") } } } } }