@ -153,7 +153,7 @@ extension MessageReceiver {
}
// / T h i s r e t u r n s t h e ` r e s u l t P u b l i s h e r ` f o r t h e g r o u p p o l l e r s o c a n b e i g n o r e d i f w e d o n ' t n e e d t o w a i t f o r t h e f i r s t p o l l t o s u c c e e d
@ discardableResult internal static func handleNewGroup (
internal static func handleNewGroup (
_ db : Database ,
groupSessionId : String ,
groupIdentityPrivateKey : Data ? ,
@ -164,7 +164,7 @@ extension MessageReceiver {
hasAlreadyBeenKicked : Bool ,
calledFromConfig configTriggeringChange : ConfigDump . Variant ? ,
using dependencies : Dependencies
) throws -> AnyPublisher < GroupPoller . PollResponse , Never > {
) throws {
// C r e a t e t h e g r o u p
try SessionThread . fetchOrCreate (
db ,
@ -202,9 +202,9 @@ extension MessageReceiver {
}
// / I f t h e g r o u p w a s n ' t a l r e a d y a p p r o v e d , i s n o t i n t h e i n v i t e s t a t e a n d t h e u s e r h a s n ' t b e e n k i c k e d f r o m i t t h e n h a n d l e t h e a p p r o v a l p r o c e s s
guard ! groupAlreadyApproved && ! invited && ! hasAlreadyBeenKicked else { return Just ( [ ] ) . eraseToAnyPublisher ( ) }
guard ! groupAlreadyApproved && ! invited && ! hasAlreadyBeenKicked else { return }
return try ClosedGroup . approveGroup (
try ClosedGroup . approveGroup (
db ,
group : closedGroup ,
calledFromConfig : configTriggeringChange ,
@ -421,29 +421,35 @@ extension MessageReceiver {
let messageInfo : ClosedGroup . MessageInfo = {
switch message . changeType {
case . added :
return ClosedGroup . MessageInfo
. addedUsers (
hasCurrentUser : messageContainsCurrentUser ,
names : names ,
historyShared : message . historyShared
)
return ClosedGroup . MessageInfo . addedUsers (
hasCurrentUser : messageContainsCurrentUser ,
names : names ,
historyShared : message . historyShared
)
case . removed :
return ClosedGroup . MessageInfo
. removedUsers (
hasCurrentUser : messageContainsCurrentUser ,
names : names
)
return ClosedGroup . MessageInfo . removedUsers (
hasCurrentUser : messageContainsCurrentUser ,
names : names
)
case . promoted :
return ClosedGroup . MessageInfo
. promotedUsers (
hasCurrentUser : messageContainsCurrentUser ,
names : names
)
return ClosedGroup . MessageInfo . promotedUsers (
hasCurrentUser : messageContainsCurrentUser ,
names : names
)
}
} ( )
// / I f t h e m e s s a g e i s a b o u t a d d i n g t h e c u r r e n t u s e r t h e n w e s h o u l d r e m o v e a n y e x i s t i n g ` i n f o G r o u p I n f o I n v i t e d ` i n t e r a c t i o n s
// / f r o m t h e g r o u p ( d o n ' t w a n t t o h a v e t w o d i f f e r e n t m e s s a g e s i n d i c a t i n g t h e c u r r e n t u s e r w a s a d d e d t o t h e g r o u p )
if messageContainsCurrentUser && message . changeType = = . added {
_ = try Interaction
. filter ( Interaction . Columns . threadId = = groupSessionId . hexString )
. filter ( Interaction . Columns . variant = = Interaction . Variant . infoGroupInfoInvited )
. deleteAll ( db )
}
switch messageInfo . infoString ( using : dependencies ) {
case . none : Log . warn ( . messageReceiver , " Failed to encode member change info string. " )
case . some ( let messageBody ) :
@ -834,7 +840,7 @@ extension MessageReceiver {
groupSessionId : groupSessionId ,
using : dependencies
)
let initialPollPublisher : AnyPublisher < GroupPoller . PollResponse , Never > = try MessageReceiver . handleNewGroup (
try MessageReceiver . handleNewGroup (
db ,
groupSessionId : groupSessionId . hexString ,
groupIdentityPrivateKey : groupIdentityPrivateKey ,
@ -862,20 +868,22 @@ extension MessageReceiver {
switch serverHash {
case . none : break
case . some ( let serverHash ) :
try ? SnodeAPI
. preparedDeleteMessages (
serverHashes : [ serverHash ] ,
requireSuccessfulDeletion : false ,
authMethod : try Authentication . with (
db ,
swarmPublicKey : userSessionId . hexString ,
db . afterNextTransaction { db in
try ? SnodeAPI
. preparedDeleteMessages (
serverHashes : [ serverHash ] ,
requireSuccessfulDeletion : false ,
authMethod : try Authentication . with (
db ,
swarmPublicKey : userSessionId . hexString ,
using : dependencies
) ,
using : dependencies
) ,
using : dependencies
)
. send ( using : dependencies )
. subscribe ( on : DispatchQueue . global ( qos : . background ) , using : dependencies )
. sinkUntilComplete ( )
)
. send ( using : dependencies )
. subscribe ( on : DispatchQueue . global ( qos : . background ) , using : dependencies )
. sinkUntilComplete ( )
}
}
// / I f t h e t h r e a d d i d n ' t a l r e a d y e x i s t , o r t h e u s e r h a d p r e v i o u s l y b e e n k i c k e d b u t h a s s i n c e b e e n r e - a d d e d t o t h e g r o u p , t h e n i n s e r t
@ -936,28 +944,17 @@ extension MessageReceiver {
// / I f w e a r e n ' t c r e a t i n g a n e w t h r e a d ( i e . s e n d i n g a m e s s a g e r e q u e s t ) t h e n s e n d a
// / ` G r o u p U p d a t e I n v i t e R e s p o n s e M e s s a g e ` t o t h e g r o u p ( t h i s a l l o w s o t h e r m e m b e r s
// / t o k n o w t h a t t h e u s e r h a s j o i n e d t h e g r o u p )
db . afterNextTransactionNested ( using : dependencies ) { _ in
initialPollPublisher
. first ( )
. subscribe ( on : DispatchQueue . global ( qos : . background ) , using : dependencies )
. sinkUntilComplete (
receiveCompletion : { _ in
dependencies [ singleton : . storage ] . write { db in
try MessageSender . send (
db ,
message : GroupUpdateInviteResponseMessage (
isApproved : true ,
sentTimestampMs : dependencies [ cache : . snodeAPI ] . currentOffsetTimestampMs ( )
) ,
interactionId : nil ,
threadId : groupSessionId . hexString ,
threadVariant : . group ,
using : dependencies
)
}
}
)
}
try MessageSender . send (
db ,
message : GroupUpdateInviteResponseMessage (
isApproved : true ,
sentTimestampMs : dependencies [ cache : . snodeAPI ] . currentOffsetTimestampMs ( )
) ,
interactionId : nil ,
threadId : groupSessionId . hexString ,
threadVariant : . group ,
using : dependencies
)
// / I f t h e s e n d e r w a s n ' t a p p r o v e d t h i s i s a m e s s a g e r e q u e s t s o w e s h o u l d n o t i f y t h e u s e r a b o u t t h e i n v i t e
case ( false , _ ) :