|
|
|
@ -135,11 +135,26 @@ extension MessageSender {
|
|
|
|
|
throw Error.invalidClosedGroupUpdate
|
|
|
|
|
}
|
|
|
|
|
let group = thread.groupModel
|
|
|
|
|
let members = [String](Set(group.groupMemberIds).union(newMembers))
|
|
|
|
|
let membersAsData = members.map { Data(hex: $0) }
|
|
|
|
|
let adminsAsData = group.groupAdminIds.map { Data(hex: $0) }
|
|
|
|
|
guard let encryptionKeyPair = Storage.shared.getLatestClosedGroupEncryptionKeyPair(for: groupPublicKey) else {
|
|
|
|
|
SNLog("Couldn't find encryption key pair for closed group: \(groupPublicKey).")
|
|
|
|
|
throw Error.noKeyPair
|
|
|
|
|
}
|
|
|
|
|
// Send the update to the group
|
|
|
|
|
let closedGroupControlMessage = ClosedGroupControlMessage(kind: .membersAdded(members: newMembers.map { Data(hex: $0) }))
|
|
|
|
|
MessageSender.send(closedGroupControlMessage, in: thread, using: transaction)
|
|
|
|
|
// Send updates to the new members individually
|
|
|
|
|
for member in newMembers {
|
|
|
|
|
let thread = TSContactThread.getOrCreateThread(withContactId: member, transaction: transaction)
|
|
|
|
|
thread.save(with: transaction)
|
|
|
|
|
let closedGroupControlMessageKind = ClosedGroupControlMessage.Kind.new(publicKey: Data(hex: groupPublicKey), name: group.groupName!,
|
|
|
|
|
encryptionKeyPair: encryptionKeyPair, members: membersAsData, admins: adminsAsData)
|
|
|
|
|
let closedGroupControlMessage = ClosedGroupControlMessage(kind: closedGroupControlMessageKind)
|
|
|
|
|
MessageSender.send(closedGroupControlMessage, in: thread, using: transaction)
|
|
|
|
|
}
|
|
|
|
|
// Update the group
|
|
|
|
|
let members = [String](Set(group.groupMemberIds).union(newMembers))
|
|
|
|
|
let newGroupModel = TSGroupModel(title: group.groupName, memberIds: members, image: nil, groupId: groupID, groupType: .closedGroup, adminIds: group.groupAdminIds)
|
|
|
|
|
thread.setGroupModel(newGroupModel, with: transaction)
|
|
|
|
|
// Notify the user
|
|
|
|
|