diff --git a/Session/Conversations/ConversationVC+Interaction.swift b/Session/Conversations/ConversationVC+Interaction.swift index 4584c92aa..b2fda1a60 100644 --- a/Session/Conversations/ConversationVC+Interaction.swift +++ b/Session/Conversations/ConversationVC+Interaction.swift @@ -1110,7 +1110,7 @@ extension ConversationVC: else { return } if remove { - _ = OpenGroupAPI + OpenGroupAPI .reactionDelete( db, emoji: emoji, @@ -1118,8 +1118,19 @@ extension ConversationVC: in: openGroup.roomToken, on: openGroup.server ) + .retainUntilComplete() } else { - _ = OpenGroupAPI + OpenGroupAPI + .reactors( + db, + emoji: emoji, + id: openGroupServerMessageId, + in: openGroup.roomToken, + on: openGroup.server + ) + .retainUntilComplete() + + OpenGroupAPI .reactionAdd( db, emoji: emoji, @@ -1127,6 +1138,7 @@ extension ConversationVC: in: openGroup.roomToken, on: openGroup.server ) + .retainUntilComplete() } } else { diff --git a/SessionMessagingKit/Open Groups/OpenGroupAPI.swift b/SessionMessagingKit/Open Groups/OpenGroupAPI.swift index 391d8fadb..a80d5f3d7 100644 --- a/SessionMessagingKit/Open Groups/OpenGroupAPI.swift +++ b/SessionMessagingKit/Open Groups/OpenGroupAPI.swift @@ -659,6 +659,34 @@ public enum OpenGroupAPI { // MARK: - Reactions + public static func reactors( + _ db: Database, + emoji: String, + id: Int64, + in roomToken: String, + on server: String, + using dependencies: SMKDependencies = SMKDependencies() + ) -> Promise { + guard let encodedEmoji: String = "👍".addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) else { + return Promise(error: OpenGroupAPIError.invalidEmoji) + } + + return OpenGroupAPI + .send( + db, + request: Request( + method: .get, + server: server, + endpoint: .reactors(roomToken, id: id, emoji: encodedEmoji) + ), + using: dependencies + ) + .map { responseInfo, _ in + print("Ryan Test: \(responseInfo)") + return responseInfo + } + } + public static func reactionAdd( _ db: Database, emoji: String, @@ -667,13 +695,17 @@ public enum OpenGroupAPI { on server: String, using dependencies: SMKDependencies = SMKDependencies() ) -> Promise { + guard let encodedEmoji: String = emoji.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) else { + return Promise(error: OpenGroupAPIError.invalidEmoji) + } + return OpenGroupAPI .send( db, request: Request( method: .put, server: server, - endpoint: .reaction(roomToken, id: id, emoji: emoji) + endpoint: .reaction(roomToken, id: id, emoji: encodedEmoji) ), using: dependencies ) @@ -688,13 +720,17 @@ public enum OpenGroupAPI { on server: String, using dependencies: SMKDependencies = SMKDependencies() ) -> Promise { + guard let encodedEmoji: String = emoji.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) else { + return Promise(error: OpenGroupAPIError.invalidEmoji) + } + return OpenGroupAPI .send( db, request: Request( method: .delete, server: server, - endpoint: .reaction(roomToken, id: id, emoji: emoji) + endpoint: .reaction(roomToken, id: id, emoji: encodedEmoji) ), using: dependencies ) @@ -709,13 +745,17 @@ public enum OpenGroupAPI { on server: String, using dependencies: SMKDependencies = SMKDependencies() ) -> Promise { + guard let encodedEmoji: String = emoji.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) else { + return Promise(error: OpenGroupAPIError.invalidEmoji) + } + return OpenGroupAPI .send( db, request: Request( method: .delete, server: server, - endpoint: .reactionDelete(roomToken, id: id, emoji: emoji) + endpoint: .reactionDelete(roomToken, id: id, emoji: encodedEmoji) ), using: dependencies ) @@ -1286,7 +1326,7 @@ public enum OpenGroupAPI { guard let url: URL = request.url else { return nil } var updatedRequest: URLRequest = request - let path: String = url.path + let path: String = url.path.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) ?? url.path .appending(url.query.map { value in "?\(value)" }) let method: String = (request.httpMethod ?? "GET") let timestamp: Int = Int(floor(dependencies.date.timeIntervalSince1970)) diff --git a/SessionMessagingKit/Open Groups/Types/OpenGroupAPIError.swift b/SessionMessagingKit/Open Groups/Types/OpenGroupAPIError.swift index b09b90d61..fa427f86f 100644 --- a/SessionMessagingKit/Open Groups/Types/OpenGroupAPIError.swift +++ b/SessionMessagingKit/Open Groups/Types/OpenGroupAPIError.swift @@ -6,12 +6,14 @@ public enum OpenGroupAPIError: LocalizedError { case decryptionFailed case signingFailed case noPublicKey + case invalidEmoji public var errorDescription: String? { switch self { case .decryptionFailed: return "Couldn't decrypt response." case .signingFailed: return "Couldn't sign message." case .noPublicKey: return "Couldn't find server public key." + case .invalidEmoji: return "The emoji is invalid." } } } diff --git a/SessionMessagingKit/Open Groups/Types/SOGSEndpoint.swift b/SessionMessagingKit/Open Groups/Types/SOGSEndpoint.swift index c0f70cf30..60c148595 100644 --- a/SessionMessagingKit/Open Groups/Types/SOGSEndpoint.swift +++ b/SessionMessagingKit/Open Groups/Types/SOGSEndpoint.swift @@ -30,6 +30,7 @@ extension OpenGroupAPI { case reactionDelete(String, id: Int64, emoji: String) case reaction(String, id: Int64, emoji: String) + case reactors(String, id: Int64, emoji: String) // Pinning @@ -99,6 +100,9 @@ extension OpenGroupAPI { case .reaction(let roomToken, let messageId, let emoji): return "room/\(roomToken)/reaction/\(messageId)/\(emoji)" + + case .reactors(let roomToken, let messageId, let emoji): + return "room/\(roomToken)/reactors/\(messageId)/\(emoji)" // Pinning diff --git a/SessionSnodeKit/OnionRequestAPI.swift b/SessionSnodeKit/OnionRequestAPI.swift index 3efd5d4ba..084081df9 100644 --- a/SessionSnodeKit/OnionRequestAPI.swift +++ b/SessionSnodeKit/OnionRequestAPI.swift @@ -588,7 +588,7 @@ public enum OnionRequestAPI: OnionRequestAPIType { case .v4: // Note: We need to remove the leading forward slash unless we are explicitly hitting a legacy // endpoint (in which case we need it to ensure the request signing works correctly - let endpoint: String = url.path + let endpoint: String = (url.path.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) ?? url.path) .appending(url.query.map { value in "?\(value)" }) let requestInfo: RequestInfo = RequestInfo(