WIP: include reactions into open group message detail info

pull/638/head
ryanzhao 2 years ago
parent 1c9d23eeb5
commit cd08c792d3

@ -1120,16 +1120,6 @@ extension ConversationVC:
) )
.retainUntilComplete() .retainUntilComplete()
} else { } else {
OpenGroupAPI
.reactors(
db,
emoji: emoji,
id: openGroupServerMessageId,
in: openGroup.roomToken,
on: openGroup.server
)
.retainUntilComplete()
OpenGroupAPI OpenGroupAPI
.reactionAdd( .reactionAdd(
db, db,

@ -106,30 +106,36 @@ extension MessageReceiveJob {
case message case message
case variant case variant
case serializedProtoData case serializedProtoData
case reactions
} }
public let message: Message public let message: Message
public let variant: Message.Variant public let variant: Message.Variant
public let serializedProtoData: Data public let serializedProtoData: Data
public let reactions: [Reaction]
public init( public init(
message: Message, message: Message,
variant: Message.Variant, variant: Message.Variant,
proto: SNProtoContent proto: SNProtoContent,
reactions: [Reaction]
) throws { ) throws {
self.message = message self.message = message
self.variant = variant self.variant = variant
self.serializedProtoData = try proto.serializedData() self.serializedProtoData = try proto.serializedData()
self.reactions = reactions
} }
private init( private init(
message: Message, message: Message,
variant: Message.Variant, variant: Message.Variant,
serializedProtoData: Data serializedProtoData: Data,
reactions: [Reaction]
) { ) {
self.message = message self.message = message
self.variant = variant self.variant = variant
self.serializedProtoData = serializedProtoData self.serializedProtoData = serializedProtoData
self.reactions = reactions
} }
// MARK: - Codable // MARK: - Codable
@ -145,7 +151,8 @@ extension MessageReceiveJob {
self = MessageInfo( self = MessageInfo(
message: try variant.decode(from: container, forKey: .message), message: try variant.decode(from: container, forKey: .message),
variant: variant, variant: variant,
serializedProtoData: try container.decode(Data.self, forKey: .serializedProtoData) serializedProtoData: try container.decode(Data.self, forKey: .serializedProtoData),
reactions: try container.decode([Reaction].self, forKey: .reactions)
) )
} }
@ -160,6 +167,7 @@ extension MessageReceiveJob {
try container.encode(message, forKey: .message) try container.encode(message, forKey: .message)
try container.encode(variant, forKey: .variant) try container.encode(variant, forKey: .variant)
try container.encode(serializedProtoData, forKey: .serializedProtoData) try container.encode(serializedProtoData, forKey: .serializedProtoData)
try container.encode(reactions, forKey: .reactions)
} }
} }

@ -3,6 +3,7 @@
import Foundation import Foundation
import GRDB import GRDB
import SessionSnodeKit import SessionSnodeKit
import SessionUtilitiesKit
/// Abstract base class for `VisibleMessage` and `ControlMessage`. /// Abstract base class for `VisibleMessage` and `ControlMessage`.
public class Message: Codable { public class Message: Codable {
@ -302,22 +303,21 @@ public extension Message {
throw MessageReceiverError.invalidMessage throw MessageReceiverError.invalidMessage
} }
if let reactions = message.reactions { let reactions = processRawReceivedReactions(
try processRawReceivedReactions( db,
db, reactions: message.reactions,
reactions: reactions, serverExpirationTimestamp: nil,
serverExpirationTimestamp: nil, serverHash: nil,
serverHash: nil, openGroupId: openGroupId,
openGroupId: openGroupId, openGroupMessageServerId: message.id,
openGroupMessageServerId: message.id, openGroupServerPublicKey: openGroupServerPublicKey,
openGroupServerPublicKey: openGroupServerPublicKey, dependencies: dependencies
dependencies: dependencies )
)
}
return try processRawReceivedMessage( return try processRawReceivedMessage(
db, db,
envelope: envelope, envelope: envelope,
reactions: reactions,
serverExpirationTimestamp: nil, serverExpirationTimestamp: nil,
serverHash: nil, serverHash: nil,
openGroupId: openGroupId, openGroupId: openGroupId,
@ -363,35 +363,55 @@ public extension Message {
private static func processRawReceivedReactions( private static func processRawReceivedReactions(
_ db: Database, _ db: Database,
reactions: [String:OpenGroupAPI.Message.Reaction], reactions: [String:OpenGroupAPI.Message.Reaction]?,
serverExpirationTimestamp: TimeInterval?, serverExpirationTimestamp: TimeInterval?,
serverHash: String?, serverHash: String?,
openGroupId: String? = nil, openGroupId: String? = nil,
openGroupMessageServerId: Int64? = nil, openGroupMessageServerId: Int64? = nil,
openGroupServerPublicKey: String? = nil, openGroupServerPublicKey: String? = nil,
dependencies: SMKDependencies = SMKDependencies() dependencies: SMKDependencies = SMKDependencies()
) throws { ) -> [Reaction] {
guard let openGroupMessageServerId = openGroupMessageServerId else { return } var results: [Reaction] = []
guard let openGroupMessageServerId = openGroupMessageServerId, let reactions = reactions else { return results }
let userPublicKey: String = getUserHexEncodedPublicKey(db)
for (encodedEmoji, rawReaction) in reactions { for (encodedEmoji, rawReaction) in reactions {
if let emoji = encodedEmoji.removingPercentEncoding, if let emoji = encodedEmoji.removingPercentEncoding,
rawReaction.count > 0, rawReaction.count > 0,
let reactors = rawReaction.reactors?.joined(separator: ",") let reactors = rawReaction.reactors
{ {
try Reaction( var count = rawReaction.count
interactionId: openGroupMessageServerId, for reactor in reactors {
serverHash: nil, let reaction = Reaction(
timestampMs: Int64(floor((Date().timeIntervalSince1970 * 1000))), interactionId: openGroupMessageServerId,
authorId: reactors, serverHash: nil,
emoji: emoji, timestampMs: Int64(floor((Date().timeIntervalSince1970 * 1000))),
count: rawReaction.count authorId: reactor,
).insert(db) emoji: emoji,
count: count
)
count = 0 // Only insert the first reaction with the total count of this emoji
results.append(reaction)
}
if rawReaction.you && !reactors.contains(userPublicKey) {
let reaction = Reaction(
interactionId: openGroupMessageServerId,
serverHash: nil,
timestampMs: Int64(floor((Date().timeIntervalSince1970 * 1000))),
authorId: userPublicKey,
emoji: emoji,
count: 0
)
results.append(reaction)
}
} }
} }
return results
} }
private static func processRawReceivedMessage( private static func processRawReceivedMessage(
_ db: Database, _ db: Database,
envelope: SNProtoEnvelope, envelope: SNProtoEnvelope,
reactions: [Reaction] = [],
serverExpirationTimestamp: TimeInterval?, serverExpirationTimestamp: TimeInterval?,
serverHash: String?, serverHash: String?,
openGroupId: String? = nil, openGroupId: String? = nil,
@ -461,7 +481,8 @@ public extension Message {
try MessageReceiveJob.Details.MessageInfo( try MessageReceiveJob.Details.MessageInfo(
message: message, message: message,
variant: variant, variant: variant,
proto: proto proto: proto,
reactions: reactions
) )
) )
} }

Loading…
Cancel
Save