feat: add set group invite completed, persist a group config individually

This commit is contained in:
0x330a 2023-10-23 17:57:40 +11:00
parent 2448af0b73
commit 383634c90e
No known key found for this signature in database
GPG Key ID: 267811D6E6A2698C
6 changed files with 34 additions and 8 deletions

View File

@ -1225,6 +1225,21 @@ open class Storage(
MessageSender.send(responseMessage, invitingAdminAddress)
}
override fun setGroupInviteComplete(approved: Boolean, invitee: String, closedGroup: SessionId) {
val groupMembers = configFactory.getGroupMemberConfig(closedGroup) ?: return
val member = groupMembers.get(invitee) ?: run {
Log.e("ClosedGroup", "User wasn't in the group membership to add!")
return
}
if (approved) {
groupMembers.set(member.copy(invitePending = false))
} else {
groupMembers.erase(member)
}
configFactory.persistGroupConfigDump(groupMembers, closedGroup, SnodeAPI.nowWithOffset)
groupMembers.close()
}
override fun setServerCapabilities(server: String, capabilities: List<String>) {
return DatabaseComponent.get(context).lokiAPIDatabase().setServerCapabilities(server, capabilities)
}

View File

@ -293,6 +293,16 @@ class ConfigFactory(
)
}
fun persistGroupConfigDump(forConfigObject: ConfigBase, groupSessionId: SessionId, timestamp: Long) = synchronized(userGroupsLock) {
val dumped = forConfigObject.dump()
configDatabase.storeConfig(
ConfigDatabase.KEYS_VARIANT,
groupSessionId.hexString(),
dumped,
timestamp
)
}
override fun persist(forConfigObject: Config, timestamp: Long) {
try {
listeners.forEach { listener ->

View File

@ -160,6 +160,7 @@ interface StorageProtocol {
fun createNewGroup(groupName: String, groupDescription: String, members: Set<SessionId>): Optional<Recipient>
fun getMembers(groupPublicKey: String): List<LibSessionGroupMember>
fun acceptClosedGroupInvite(groupId: SessionId, name: String, authData: ByteArray, invitingAdmin: SessionId)
fun setGroupInviteComplete(approved: Boolean, invitee: String, closedGroup: SessionId)
// Groups
fun getAllGroups(includeInactive: Boolean): List<GroupRecord>

View File

@ -209,7 +209,7 @@ class BatchMessageReceiveJob(
}
}
else -> MessageReceiver.handle(message, proto, threadId, openGroupID)
else -> MessageReceiver.handle(message, proto, threadId, openGroupID, parameters.closedGroup?.publicKey?.let(SessionId::from))
}
} catch (e: Exception) {
Log.e(TAG, "Couldn't process message (id: $id)", e)

View File

@ -41,7 +41,7 @@ class MessageReceiveJob(val data: ByteArray, val serverHash: String? = null, val
val (message, proto) = MessageReceiver.parse(this.data, this.openGroupMessageServerID, openGroupPublicKey = serverPublicKey, currentClosedGroups = currentClosedGroups)
val threadId = Message.getThreadId(message, this.openGroupID, storage, false)
message.serverHash = serverHash
MessageReceiver.handle(message, proto, threadId ?: -1, this.openGroupID)
MessageReceiver.handle(message, proto, threadId ?: -1, this.openGroupID, null)
this.handleSuccess(dispatcherName)
deferred.resolve(Unit)
} catch (e: Exception) {

View File

@ -62,7 +62,7 @@ internal fun MessageReceiver.isBlocked(publicKey: String): Boolean {
return recipient.isBlocked
}
fun MessageReceiver.handle(message: Message, proto: SignalServiceProtos.Content, threadId: Long, openGroupID: String?) {
fun MessageReceiver.handle(message: Message, proto: SignalServiceProtos.Content, threadId: Long, openGroupID: String?, closedGroup: SessionId?) {
// Do nothing if the message was outdated
if (MessageReceiver.messageIsOutdated(message, threadId, openGroupID)) { return }
@ -70,7 +70,7 @@ fun MessageReceiver.handle(message: Message, proto: SignalServiceProtos.Content,
is ReadReceipt -> handleReadReceipt(message)
is TypingIndicator -> handleTypingIndicator(message)
is ClosedGroupControlMessage -> handleClosedGroupControlMessage(message)
is GroupUpdated -> handleNewLibSessionClosedGroupMessage(message)
is GroupUpdated -> handleNewLibSessionClosedGroupMessage(message, closedGroup)
is ExpirationTimerUpdate -> handleExpirationTimerUpdate(message)
is DataExtractionNotification -> handleDataExtractionNotification(message)
is ConfigurationMessage -> handleConfigurationMessage(message)
@ -519,19 +519,19 @@ private fun ClosedGroupControlMessage.getPublicKey(): String = kind!!.let { when
is ClosedGroupControlMessage.Kind.NameChange -> groupPublicKey!!
}}
private fun MessageReceiver.handleGroupUpdated(message: GroupUpdated) {
private fun MessageReceiver.handleGroupUpdated(message: GroupUpdated, closedGroup: SessionId) {
when {
message.inner.hasInviteMessage() -> handleNewLibSessionClosedGroupMessage(message)
message.inner.hasInviteResponse() -> handleInviteResponse(message)
message.inner.hasInviteResponse() -> handleInviteResponse(message, closedGroup)
}
}
private fun MessageReceiver.handleInviteResponse(message: GroupUpdated) {
private fun MessageReceiver.handleInviteResponse(message: GroupUpdated, closedGroup: SessionId) {
val sender = message.sender!!
// val profile = message // maybe we do need data to be the inner so we can access profile
val storage = MessagingModuleConfiguration.shared.storage
val approved = message.inner.inviteResponse.isApproved
storage.setGroupInviteComplete(approved, sender, closedGroup)
}
private fun MessageReceiver.handleNewLibSessionClosedGroupMessage(message: GroupUpdated) {