@ -88,7 +88,7 @@ internal extension SessionUtil {
) ,
groupMembers : members
. filter { _ , isAdmin in ! isAdmin }
. map { memberId , admin in
. map { memberId , _ in
GroupMember (
groupId : groupId ,
profileId : memberId ,
@ -98,7 +98,7 @@ internal extension SessionUtil {
} ,
groupAdmins : members
. filter { _ , isAdmin in isAdmin }
. map { memberId , admin in
. map { memberId , _ in
GroupMember (
groupId : groupId ,
profileId : memberId ,
@ -171,13 +171,14 @@ internal extension SessionUtil {
if ! communityIdsToRemove . isEmpty {
SessionUtil . kickFromConversationUIIfNeeded ( removedThreadIds : Array ( communityIdsToRemove ) )
communityIdsToRemove . forEach { threadId in
OpenGroupManager . shared . delet e(
try SessionThread
. delet eOrLeav e(
db ,
openGroupId : threadId ,
threadIds : Array ( communityIdsToRemove ) ,
threadVariant : . community ,
shouldSendLeaveMessageForGroups : false ,
calledFromConfigHandling : true
)
}
}
// MARK: - - H a n d l e L e g a c y G r o u p C h a n g e s
@ -200,7 +201,7 @@ internal extension SessionUtil {
let name : String = group . name ,
let lastKeyPair : ClosedGroupKeyPair = group . lastKeyPair ,
let members : [ GroupMember ] = group . groupMembers ,
let updatedAdmins : [ GroupMember ] = group . groupAdmins
let updatedAdmins : Set < GroupMember > = group . groupAdmins ? . asSet ( )
else { return }
if ! existingLegacyGroupIds . contains ( group . id ) {
@ -214,7 +215,8 @@ internal extension SessionUtil {
secretKey : lastKeyPair . secretKey . bytes
) ,
members : members
. appending ( contentsOf : updatedAdmins ) // A d m i n s s h o u l d a l s o h a v e ' s t a n d a r d ' m e m b e r e n t r i e s
. asSet ( )
. inserting ( contentsOf : updatedAdmins ) // A d m i n s s h o u l d a l s o h a v e ' s t a n d a r d ' m e m b e r e n t r i e s
. map { $0 . profileId } ,
admins : updatedAdmins . map { $0 . profileId } ,
expirationTimer : UInt32 ( group . disappearingConfig ? . durationSeconds ? ? 0 ) ,
@ -253,7 +255,7 @@ internal extension SessionUtil {
. saved ( db )
// U p d a t e t h e m e m b e r s
let updatedMembers : [ GroupMember ] = members
let updatedMembers : Set < GroupMember > = members
. appending (
contentsOf : updatedAdmins . map { admin in
GroupMember (
@ -264,10 +266,12 @@ internal extension SessionUtil {
)
}
)
. asSet ( )
if
let existingMembers : [ GroupMember ] = existingLegacyGroupMembers [ group . id ] ?
. filter ( { $0 . role = = . standard || $0 . role = = . zombie } ) ,
let existingMembers : Set < GroupMember > = existingLegacyGroupMembers [ group . id ] ?
. filter ( { $0 . role = = . standard || $0 . role = = . zombie } )
. asSet ( ) ,
existingMembers != updatedMembers
{
// A d d i n a n y n e w m e m b e r s a n d r e m o v e a n y r e m o v e d m e m b e r s
@ -288,8 +292,9 @@ internal extension SessionUtil {
}
if
let existingAdmins : [ GroupMember ] = existingLegacyGroupMembers [ group . id ] ?
. filter ( { $0 . role = = . admin } ) ,
let existingAdmins : Set < GroupMember > = existingLegacyGroupMembers [ group . id ] ?
. filter ( { $0 . role = = . admin } )
. asSet ( ) ,
existingAdmins != updatedAdmins
{
// A d d i n a n y n e w a d m i n s a n d r e m o v e a n y r e m o v e d a d m i n s
@ -326,12 +331,14 @@ internal extension SessionUtil {
if ! legacyGroupIdsToRemove . isEmpty {
SessionUtil . kickFromConversationUIIfNeeded ( removedThreadIds : Array ( legacyGroupIdsToRemove ) )
try ClosedGroup . removeKeysAndUnsubscribe (
db ,
threadIds : Array ( legacyGroupIdsToRemove ) ,
removeGroupData : true ,
calledFromConfigHandling : true
)
try SessionThread
. deleteOrLeave (
db ,
threadIds : Array ( legacyGroupIdsToRemove ) ,
threadVariant : . legacyGroup ,
shouldSendLeaveMessageForGroups : false ,
calledFromConfigHandling : true
)
}
// MARK: - - H a n d l e G r o u p C h a n g e s
@ -364,8 +371,6 @@ internal extension SessionUtil {
guard conf != nil else { throw SessionUtilError . nilConfigObject }
guard ! legacyGroups . isEmpty else { return }
// S i n c e w e a r e d o i n g d i r e c t m e m o r y m a n i p u l a t i o n w e a r e u s i n g a n ` A t o m i c ` t y p e w h i c h h a s
// b l o c k i n g a c c e s s i n i t ' s ` m u t a t e ` c l o s u r e
legacyGroups
. forEach { legacyGroup in
var cGroupId : [ CChar ] = legacyGroup . id . cArray
@ -405,7 +410,12 @@ internal extension SessionUtil {
} ( )
if let groupMembers : [ GroupMember ] = legacyGroup . groupMembers {
let memberIds : Set < String > = groupMembers . map { $0 . profileId } . asSet ( )
// N e e d t o m a k e s u r e w e r e m o v e a n y a d m i n s b e f o r e a d d i n g t h e m h e r e o t h e r w i s e w e w i l l
// o v e r w r i t e t h e a d m i n p e r m i s s i o n t o b e a s t a n d a r d u s e r p e r m i s s i o n
let memberIds : Set < String > = groupMembers
. map { $0 . profileId }
. asSet ( )
. subtracting ( legacyGroup . groupAdmins . defaulting ( to : [ ] ) . map { $0 . profileId } . asSet ( ) )
let existingMemberIds : Set < String > = Array ( existingMembers
. filter { _ , isAdmin in ! isAdmin }
. keys )
@ -555,6 +565,19 @@ public extension SessionUtil {
for : . userGroups ,
publicKey : getUserHexEncodedPublicKey ( db )
) { conf in
guard conf != nil else { throw SessionUtilError . nilConfigObject }
var cGroupId : [ CChar ] = groupPublicKey . cArray
let userGroup : UnsafeMutablePointer < ugroups_legacy_group_info > ? = user_groups_get_legacy_group ( conf , & cGroupId )
// N e e d t o m a k e s u r e t h e g r o u p d o e s n ' t a l r e a d y e x i s t ( o t h e r w i s e w e w i l l e n d u p o v e r r i d i n g t h e
// c o n t e n t w h i c h c o u l d r e v e r t n e w e r c h a n g e s s i n c e t h i s c a n b e t r i g g e r e d f r o m o t h e r ' N E W ' m e s s a g e s
// c o m i n g i n f r o m t h e l e g a c y g r o u p s w a r m )
guard userGroup = = nil else {
ugroups_legacy_group_free ( userGroup )
return
}
try SessionUtil . upsert (
legacyGroups : [
LegacyGroupInfo (