Further clarifications on Event Model, Support for Attributes in Message APIs
continuous-integration/drone/pr Build is pending
Details
continuous-integration/drone/pr Build is pending
Details
This commit is contained in:
parent
b0f54bb169
commit
e31d31d76f
10
lib.go
10
lib.go
|
@ -461,9 +461,9 @@ func c_AcceptConversation(profilePtr *C.char, profileLen C.int, conversation_id
|
||||||
|
|
||||||
// AcceptConversation takes in a profileOnion and a handle to either a group or a peer and authorizes the handle
|
// AcceptConversation takes in a profileOnion and a handle to either a group or a peer and authorizes the handle
|
||||||
// for further action (e.g. messaging / connecting to the server / joining the group etc.)
|
// for further action (e.g. messaging / connecting to the server / joining the group etc.)
|
||||||
func AcceptConversation(profileOnion string, conversation_id int) {
|
func AcceptConversation(profileOnion string, conversationID int) {
|
||||||
profile := application.GetPeer(profileOnion)
|
profile := application.GetPeer(profileOnion)
|
||||||
profile.AcceptConversation(int(conversation_id))
|
profile.AcceptConversation(conversationID)
|
||||||
}
|
}
|
||||||
|
|
||||||
//export c_BlockContact
|
//export c_BlockContact
|
||||||
|
@ -488,6 +488,7 @@ type EnhancedMessage struct {
|
||||||
model.Message
|
model.Message
|
||||||
ID int // the actual ID of the message in the database (not the row number)
|
ID int // the actual ID of the message in the database (not the row number)
|
||||||
ContactImage string
|
ContactImage string
|
||||||
|
Attributes map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetMessage(profileOnion string, conversationID int, messageIndex int) string {
|
func GetMessage(profileOnion string, conversationID int, messageIndex int) string {
|
||||||
|
@ -510,6 +511,7 @@ func GetMessage(profileOnion string, conversationID int, messageIndex int) strin
|
||||||
Timestamp: time,
|
Timestamp: time,
|
||||||
}
|
}
|
||||||
message.ID = messages[0].ID
|
message.ID = messages[0].ID
|
||||||
|
message.Attributes = messages[0].Attr
|
||||||
message.ContactImage = utils.RandomProfileImage(message.PeerID)
|
message.ContactImage = utils.RandomProfileImage(message.PeerID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -544,6 +546,7 @@ func GetMessageByID(profileOnion string, conversationID int, messageIndex int) s
|
||||||
Timestamp: time,
|
Timestamp: time,
|
||||||
}
|
}
|
||||||
message.ID = messageIndex
|
message.ID = messageIndex
|
||||||
|
message.Attributes = attr
|
||||||
message.ContactImage = utils.RandomProfileImage(message.PeerID)
|
message.ContactImage = utils.RandomProfileImage(message.PeerID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -575,6 +578,7 @@ func GetMessagesByContentHash(profileOnion string, handle int, contentHash strin
|
||||||
PeerID: messages[0].Attr[constants2.AttrAuthor],
|
PeerID: messages[0].Attr[constants2.AttrAuthor],
|
||||||
Timestamp: time,
|
Timestamp: time,
|
||||||
}
|
}
|
||||||
|
// TODO this is mostly unused at this point, consider cleaning is up in 1.6
|
||||||
indexedMessages = append(indexedMessages, model.LocallyIndexedMessage{LocalIndex: offset, Message: msg})
|
indexedMessages = append(indexedMessages, model.LocallyIndexedMessage{LocalIndex: offset, Message: msg})
|
||||||
} else {
|
} else {
|
||||||
log.Errorf("error fetching local index {} ", err)
|
log.Errorf("error fetching local index {} ", err)
|
||||||
|
@ -858,7 +862,7 @@ func c_SetMessageAttribute(profile_ptr *C.char, profile_len C.int, conversation_
|
||||||
// of if `UpdateMessageAttribute` fails
|
// of if `UpdateMessageAttribute` fails
|
||||||
func SetMessageAttribute(profileOnion string, conversationID int, channelID int, messageID int, attributeKey string, attributeValue string) {
|
func SetMessageAttribute(profileOnion string, conversationID int, channelID int, messageID int, attributeKey string, attributeValue string) {
|
||||||
profile := application.GetPeer(profileOnion)
|
profile := application.GetPeer(profileOnion)
|
||||||
if profile != nil {
|
if profile == nil {
|
||||||
log.Errorf("called SetMessageAttribute with invalid profile handle: %v", profileOnion)
|
log.Errorf("called SetMessageAttribute with invalid profile handle: %v", profileOnion)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -259,6 +259,7 @@ func (eh *EventHandler) handleProfileEvent(ev *EventProfileEnvelope) string {
|
||||||
} else {
|
} else {
|
||||||
// TODO This Conversation May Not Exist Yet...But we are not in charge of creating it...
|
// TODO This Conversation May Not Exist Yet...But we are not in charge of creating it...
|
||||||
log.Errorf("todo wait for contact to be added before processing this event...")
|
log.Errorf("todo wait for contact to be added before processing this event...")
|
||||||
|
return ""
|
||||||
}
|
}
|
||||||
var exists bool
|
var exists bool
|
||||||
ev.Event.Data["Nick"], exists = ci.GetAttribute(attr.LocalScope, attr.ProfileZone, constants.Name)
|
ev.Event.Data["Nick"], exists = ci.GetAttribute(attr.LocalScope, attr.ProfileZone, constants.Name)
|
||||||
|
@ -283,7 +284,7 @@ func (eh *EventHandler) handleProfileEvent(ev *EventProfileEnvelope) string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ev.Event.Data["Picture"] = RandomProfileImage(ev.Event.Data[event.GroupID])
|
ev.Event.Data["Picture"] = RandomProfileImage(ev.Event.Data[event.RemotePeer])
|
||||||
conversationID, _ := strconv.Atoi(ev.Event.Data[event.ConversationID])
|
conversationID, _ := strconv.Atoi(ev.Event.Data[event.ConversationID])
|
||||||
profile.SetConversationAttribute(conversationID, attr.LocalScope.ConstructScopedZonedPath(attr.ProfileZone.ConstructZonedPath(constants2.Archived)), event.False)
|
profile.SetConversationAttribute(conversationID, attr.LocalScope.ConstructScopedZonedPath(attr.ProfileZone.ConstructZonedPath(constants2.Archived)), event.False)
|
||||||
case event.PeerAcknowledgement:
|
case event.PeerAcknowledgement:
|
||||||
|
@ -293,19 +294,35 @@ func (eh *EventHandler) handleProfileEvent(ev *EventProfileEnvelope) string {
|
||||||
}
|
}
|
||||||
case event.ContactCreated:
|
case event.ContactCreated:
|
||||||
conversationID, _ := strconv.Atoi(ev.Event.Data[event.ConversationID])
|
conversationID, _ := strconv.Atoi(ev.Event.Data[event.ConversationID])
|
||||||
handle := ev.Event.Data[event.RemotePeer]
|
|
||||||
count, err := profile.GetChannelMessageCount(conversationID, 0)
|
count, err := profile.GetChannelMessageCount(conversationID, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("error fetching channel message count %v %v", conversationID, err)
|
log.Errorf("error fetching channel message count %v %v", conversationID, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
conversationInfo, err := profile.GetConversationInfo(conversationID)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("error fetching conversation info for %v %v", conversationID, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Resolve Conversation Auth State
|
||||||
|
// TODO: Align this with ACLs
|
||||||
|
authorization := model.AuthUnknown
|
||||||
|
if conversationInfo.Accepted {
|
||||||
|
authorization = model.AuthApproved
|
||||||
|
}
|
||||||
|
|
||||||
|
// If ACL has blocked conversation then hide them...
|
||||||
|
if acl, exists := conversationInfo.ACL[conversationInfo.Handle]; exists && acl.Blocked {
|
||||||
|
authorization = model.AuthBlocked
|
||||||
|
}
|
||||||
|
|
||||||
lastMessage, _ := profile.GetMostRecentMessages(conversationID, 0, 0, 1)
|
lastMessage, _ := profile.GetMostRecentMessages(conversationID, 0, 0, 1)
|
||||||
ev.Event.Data["unread"] = strconv.Itoa(1) // we've just created this contact so by definition this must be 1...
|
ev.Event.Data["unread"] = strconv.Itoa(count) // if this is a new contact with messages attached then by-definition these are unread...
|
||||||
ev.Event.Data["picture"] = RandomProfileImage(handle)
|
ev.Event.Data["picture"] = RandomProfileImage(conversationInfo.Handle)
|
||||||
ev.Event.Data["numMessages"] = strconv.Itoa(count)
|
ev.Event.Data["numMessages"] = strconv.Itoa(count)
|
||||||
ev.Event.Data["nick"] = handle
|
ev.Event.Data["nick"] = conversationInfo.Handle
|
||||||
ev.Event.Data["status"] = connections.ConnectionStateName[profile.GetPeerState(handle)]
|
ev.Event.Data["status"] = connections.ConnectionStateName[profile.GetPeerState(conversationInfo.Handle)]
|
||||||
ev.Event.Data["authorization"] = string(model.AuthUnknown)
|
ev.Event.Data["authorization"] = string(authorization)
|
||||||
ev.Event.Data["loading"] = "false"
|
ev.Event.Data["loading"] = "false"
|
||||||
ev.Event.Data["lastMsgTime"] = strconv.Itoa(getLastMessageTime(lastMessage))
|
ev.Event.Data["lastMsgTime"] = strconv.Itoa(getLastMessageTime(lastMessage))
|
||||||
case event.GroupCreated:
|
case event.GroupCreated:
|
||||||
|
@ -332,8 +349,9 @@ func (eh *EventHandler) handleProfileEvent(ev *EventProfileEnvelope) string {
|
||||||
return "" // suppress events from our own profile...
|
return "" // suppress events from our own profile...
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We do not know who this is...don't send any event until we see a message from them
|
||||||
|
// (at that point the conversation will have been created...)
|
||||||
if cxnState == connections.AUTHENTICATED && contact == nil {
|
if cxnState == connections.AUTHENTICATED && contact == nil {
|
||||||
profile.NewContactConversation(ev.Event.Data[event.RemotePeer], model.AccessControl{Read: false, Append: false, Blocked: false}, false)
|
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Reference in New Issue