Only insert one group update per info message

This commit is contained in:
Elaine 2026-06-02 17:03:28 -04:00 committed by GitHub
parent 280fc1f244
commit 808f3218db
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -196,30 +196,25 @@ class GroupUpdateInfoMessageInserterImpl: GroupUpdateInfoMessageInserter {
/// update that somehow doesn't produce a diff, we'll get back a list
/// with a single "generic group update" item in it.
owsPrecondition(!updateItemsForNewMessage.isEmpty)
let infoMessage: TSInfoMessage = .makeForGroupUpdate(
timestamp: dateProvider().ows_millisecondsSince1970,
spamReportingMetadata: spamReportingMetadata,
groupThread: groupThread,
updateItems: updateItemsForNewMessage,
)
infoMessage.anyInsert(transaction: tx)
let timestamp = dateProvider().ows_millisecondsSince1970
let insertedMessages: [(
updateItem: TSInfoMessage.PersistableGroupUpdateItem,
message: TSInfoMessage,
)] = updateItemsForNewMessage.map { item in
let message: TSInfoMessage = .makeForGroupUpdate(
timestamp: timestamp,
spamReportingMetadata: spamReportingMetadata,
groupThread: groupThread,
updateItems: [item],
)
message.anyInsert(transaction: tx)
return (item, message)
}
let wasLocalUserInGroup = oldGroupModel?.groupMembership.isLocalUserMemberOfAnyKind ?? false
let isLocalUserInGroup = newGroupModel.groupMembership.isLocalUserMemberOfAnyKind
let wasLocalUserRequestingMember = oldGroupModel?.groupMembership.isLocalUserRequestingMember ?? false
let isLocalUserRequestingMember = newGroupModel.groupMembership.isLocalUserRequestingMember
let isTerminatedGroup: Bool
if
let newGroupModelv2 = newGroupModel as? TSGroupModelV2,
let oldGroupModelv2 = oldGroupModel as? TSGroupModelV2,
!oldGroupModelv2.isTerminated,
newGroupModelv2.isTerminated
{
isTerminatedGroup = true
} else {
isTerminatedGroup = false
}
var isTerminatedGroup = false
let isLocalUserUpdate: Bool
switch groupUpdateSource {
@ -229,29 +224,63 @@ class GroupUpdateInfoMessageInserterImpl: GroupUpdateInfoMessageInserter {
isLocalUserUpdate = false
}
if isLocalUserUpdate || (!wasLocalUserRequestingMember && isLocalUserRequestingMember) {
infoMessage.markAsRead(
atTimestamp: NSDate.ows_millisecondTimeStamp(),
thread: groupThread,
circumstance: .onThisDevice,
shouldClearNotifications: true,
transaction: tx,
)
} else if !wasLocalUserInGroup, isLocalUserInGroup {
let now = NSDate.ows_millisecondTimeStamp()
insertedMessages.map(\.message).forEach { message in
message.markAsRead(
atTimestamp: now,
thread: groupThread,
circumstance: .onThisDevice,
shouldClearNotifications: true,
transaction: tx,
)
}
} else {
// Notify when the local user is added or invited to a group.
notificationPresenter.notifyUser(
forTSMessage: infoMessage,
thread: groupThread,
wantsSound: true,
transaction: tx,
)
} else if isTerminatedGroup {
for groupJoinMessage in insertedMessages.compactMap({ item, message -> TSInfoMessage? in
switch item {
case
.localUserWasInvitedByLocalUser,
.localUserWasInvitedByOtherUser,
.localUserWasInvitedByUnknownUser,
.localUserAddedByLocalUser,
.localUserAddedByOtherUser,
.localUserAddedByUnknownUser,
.localUserInvitedAfterMigration,
.localUserJoined,
.localUserJoinedViaInviteLink:
return message
default:
return nil
}
}) {
notificationPresenter.notifyUser(
forTSMessage: groupJoinMessage,
thread: groupThread,
wantsSound: true,
transaction: tx,
)
}
// Notify when the group ends.
notificationPresenter.notifyUser(
forTSMessage: infoMessage,
thread: groupThread,
wantsSound: true,
transaction: tx,
)
for groupTerminateMessage in insertedMessages.compactMap({ item, message -> TSInfoMessage? in
switch item {
case
.groupTerminatedByLocalUser,
.groupTerminatedByOtherUser,
.groupTerminatedByUnknownUser:
return message
default:
return nil
}
}) {
notificationPresenter.notifyUser(
forTSMessage: groupTerminateMessage,
thread: groupThread,
wantsSound: true,
transaction: tx,
)
isTerminatedGroup = true
}
}
// Delete intents for terminated group.