122 lines
4.4 KiB
Go
122 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
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|