seekia/internal/messaging/myConversationIndexes/myConversationIndexes.go

121 lines
4.4 KiB
Go

// myConversationIndexes provides functions to keep track of the viewed message index of conversations
// Each index describes the page of messages that the user is viewing for each conversation
package myConversationIndexes
//TODO: Create function to prune indexes for conversations that no longer exist
import "seekia/internal/encoding"
import "seekia/internal/helpers"
import "seekia/internal/identity"
import "seekia/internal/myDatastores/myMap"
import "errors"
var myConversationViewIndexesMapDatastore *myMap.MyMap
// This function must be called whenever an app user signs in
func InitializeMyConversationIndexesDatastore()error{
newMyConversationViewIndexesMapDatastore, err := myMap.CreateNewMap("MyConversationViewIndexes")
if (err != nil) { return err }
myConversationViewIndexesMapDatastore = newMyConversationViewIndexesMapDatastore
return nil
}
func SetConversationMessageViewIndex(myIdentityHash [16]byte, theirIdentityHash [16]byte, networkType byte, viewIndex int)error{
myIdentityHashString, myIdentityType, err := identity.EncodeIdentityHashBytesToString(myIdentityHash)
if (err != nil){
myIdentityHashHex := encoding.EncodeBytesToHexString(myIdentityHash[:])
return errors.New("SetConversationMessageViewIndex called with invalid myIdentityHash: " + myIdentityHashHex)
}
theirIdentityHashString, theirIdentityType, err := identity.EncodeIdentityHashBytesToString(theirIdentityHash)
if (err != nil){
theirIdentityHashHex := encoding.EncodeBytesToHexString(theirIdentityHash[:])
return errors.New("SetConversationMessageViewIndex called with invalid theirIdentityHash: " + theirIdentityHashHex)
}
if (myIdentityType != theirIdentityType){
return errors.New("SetConversationMessageViewIndex called with mismatched my/their identityTypes.")
}
if (myIdentityType == "Host"){
return errors.New("SetConversationMessageViewIndex called with Host identityTypes.")
}
isValid := helpers.VerifyNetworkType(networkType)
if (isValid == false){
networkTypeString := helpers.ConvertByteToString(networkType)
return errors.New("GetConversationMessageViewIndex called with invalid networkType: " + networkTypeString)
}
networkTypeString := helpers.ConvertByteToString(networkType)
conversationKey := myIdentityHashString + "+" + theirIdentityHashString + "@" + networkTypeString
mapEntryValue := helpers.ConvertIntToString(viewIndex)
err = myConversationViewIndexesMapDatastore.SetMapEntry(conversationKey, mapEntryValue)
if (err != nil) { return err }
return nil
}
//Outputs:
// -bool: Index exists
// -int: Conversation index
// -error
func GetConversationMessageViewIndex(myIdentityHash [16]byte, theirIdentityHash [16]byte, networkType byte)(bool, int, error){
myIdentityHashString, myIdentityType, err := identity.EncodeIdentityHashBytesToString(myIdentityHash)
if (err != nil){
myIdentityHashHex := encoding.EncodeBytesToHexString(myIdentityHash[:])
return false, 0, errors.New("GetConversationMessageViewIndex called with invalid myIdentityHash: " + myIdentityHashHex)
}
theirIdentityHashString, theirIdentityType, err := identity.EncodeIdentityHashBytesToString(theirIdentityHash)
if (err != nil){
theirIdentityHashHex := encoding.EncodeBytesToHexString(theirIdentityHash[:])
return false, 0, errors.New("GetConversationMessageViewIndex called with invalid theirIdentityHash: " + theirIdentityHashHex)
}
if (myIdentityType != theirIdentityType){
return false, 0, errors.New("GetConversationMessageViewIndex called with mismatched my/their identityTypes.")
}
if (myIdentityType == "Host"){
return false, 0, errors.New("GetConversationMessageViewIndex called with Host identityTypes.")
}
isValid := helpers.VerifyNetworkType(networkType)
if (isValid == false){
networkTypeString := helpers.ConvertByteToString(networkType)
return false, 0, errors.New("GetConversationMessageViewIndex called with invalid networkType: " + networkTypeString)
}
networkTypeString := helpers.ConvertByteToString(networkType)
conversationKey := myIdentityHashString + "+" + theirIdentityHashString + "@" + networkTypeString
exists, viewIndexString, err := myConversationViewIndexesMapDatastore.GetMapEntry(conversationKey)
if (err != nil) { return false, 0, err }
if (exists == false) {
return false, 0, nil
}
viewIndex, err := helpers.ConvertStringToInt(viewIndexString)
if (err != nil) {
return false, 0, errors.New("myConversationViewIndexesMapDatastore malformed: Contains invalid view index: " + viewIndexString)
}
return true, viewIndex, nil
}