fix disappearing messages config message not syncing

pull/1038/head
Ryan ZHAO 8 months ago
parent 0b4629dee6
commit 6b1f4fc5b5

@ -929,7 +929,33 @@ extension ConversationVC:
dismissOnConfirm: false // Custom dismissal logic
) { [weak self] _ in
dependencies.storage.writeAsync { db in
try messageDisappearingConfig.save(db)
let userPublicKey: String = getUserHexEncodedPublicKey(db, using: dependencies)
let currentTimestampMs: Int64 = SnodeAPI.currentOffsetTimestampMs()
let interactionId = try messageDisappearingConfig
.saved(db)
.insertControlMessage(
db,
threadVariant: cellViewModel.threadVariant,
authorId: userPublicKey,
timestampMs: currentTimestampMs,
serverHash: nil,
serverExpirationTimestamp: nil
)
let expirationTimerUpdateMessage: ExpirationTimerUpdate = ExpirationTimerUpdate()
.with(sentTimestamp: UInt64(currentTimestampMs))
.with(messageDisappearingConfig)
try MessageSender.send(
db,
message: expirationTimerUpdateMessage,
interactionId: interactionId,
threadId: cellViewModel.threadId,
threadVariant: cellViewModel.threadVariant,
using: dependencies
)
try LibSession
.update(
db,

@ -5,7 +5,37 @@ import GRDB
import SessionUtilitiesKit
public final class ExpirationTimerUpdate: ControlMessage {
private enum CodingKeys: String, CodingKey {
case syncTarget
}
public var syncTarget: String?
public override var isSelfSendValid: Bool { true }
public init(syncTarget: String? = nil) {
super.init()
self.syncTarget = syncTarget
}
// MARK: - Codable
required init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container: KeyedDecodingContainer<CodingKeys> = try decoder.container(keyedBy: CodingKeys.self)
syncTarget = try? container.decode(String.self, forKey: .syncTarget)
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container: KeyedEncodingContainer<CodingKeys> = encoder.container(keyedBy: CodingKeys.self)
try container.encodeIfPresent(syncTarget, forKey: .syncTarget)
}
// MARK: - Proto Conversion
@ -15,12 +45,15 @@ public final class ExpirationTimerUpdate: ControlMessage {
let isExpirationTimerUpdate = (dataMessageProto.flags & UInt32(SNProtoDataMessage.SNProtoDataMessageFlags.expirationTimerUpdate.rawValue)) != 0
guard isExpirationTimerUpdate else { return nil }
return ExpirationTimerUpdate()
return ExpirationTimerUpdate(
syncTarget: dataMessageProto.syncTarget
)
}
public override func toProto(_ db: Database, threadId: String) -> SNProtoContent? {
let dataMessageProto = SNProtoDataMessage.builder()
dataMessageProto.setFlags(UInt32(SNProtoDataMessage.SNProtoDataMessageFlags.expirationTimerUpdate.rawValue))
if let syncTarget = syncTarget { dataMessageProto.setSyncTarget(syncTarget) }
let contentProto = SNProtoContent.builder()
// DisappearingMessagesConfiguration
@ -39,7 +72,9 @@ public final class ExpirationTimerUpdate: ControlMessage {
public var description: String {
"""
ExpirationTimerUpdate()
ExpirationTimerUpdate(
syncTarget: \(syncTarget ?? "null"),
)
"""
}
}

@ -262,6 +262,7 @@ public extension Message {
static func shouldSync(message: Message) -> Bool {
switch message {
case is VisibleMessage: return true
case is ExpirationTimerUpdate: return true
case is UnsendRequest: return true
case let controlMessage as ClosedGroupControlMessage:
@ -288,6 +289,7 @@ public extension Message {
switch message {
case let message as VisibleMessage: maybeSyncTarget = message.syncTarget
case let message as ExpirationTimerUpdate: maybeSyncTarget = message.syncTarget
default: maybeSyncTarget = nil
}

@ -795,7 +795,12 @@ public final class OpenGroupManager {
let syncTarget: String = (lookup.sessionId ?? message.recipient)
switch messageInfo.variant {
case .visibleMessage: (messageInfo.message as? VisibleMessage)?.syncTarget = syncTarget
case .visibleMessage:
(messageInfo.message as? VisibleMessage)?.syncTarget = syncTarget
case .expirationTimerUpdate:
(messageInfo.message as? ExpirationTimerUpdate)?.syncTarget = syncTarget
default: break
}
}

@ -96,6 +96,7 @@ public enum MessageReceiver {
threadIdGenerator = { message in
switch message {
case let message as VisibleMessage: return (message.syncTarget ?? sender)
case let message as ExpirationTimerUpdate: return (message.syncTarget ?? sender)
default: return sender
}
}

@ -1132,6 +1132,7 @@ public final class MessageSender {
Message.shouldSync(message: message)
{
if let message = message as? VisibleMessage { message.syncTarget = publicKey }
if let message = message as? ExpirationTimerUpdate { message.syncTarget = publicKey }
dependencies.jobRunner.add(
db,

Loading…
Cancel
Save