Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 29 additions & 28 deletions LeanCloudTests/IMConversationTestCase.swift
Original file line number Diff line number Diff line change
Expand Up @@ -367,48 +367,49 @@ class IMConversationTestCase: RTMBaseTestCase {
}

func testServiceConversationSubscription() {
guard
let client = newOpenedClient(),
let serviceConversationID = IMConversationTestCase.newServiceConversation()
else
{
XCTFail()
return
guard let client = newOpenedClient(),
let serviceConversationID = IMConversationTestCase.newServiceConversation() else {
XCTFail()
return
}

delay()

var serviceConversation: IMServiceConversation?

let queryExp = expectation(description: "conv query")
try! client.conversationQuery.getConversation(by: serviceConversationID) { (result) in
XCTAssertTrue(result.isSuccess)
XCTAssertNil(result.error)
serviceConversation = (result.value as? IMServiceConversation)
queryExp.fulfill()
expecting { (exp) in
try! client.conversationQuery.getConversation(by: serviceConversationID) { (result) in
XCTAssertTrue(result.isSuccess)
XCTAssertNil(result.error)
serviceConversation = (result.value as? IMServiceConversation)
XCTAssertEqual(serviceConversation?.isSubscribed, false)
exp.fulfill()
}
}
wait(for: [queryExp], timeout: timeout)

let checkExp = expectation(description: "check subscription")
checkExp.expectedFulfillmentCount = 3
serviceConversation?.checkSubscription(completion: { (result) in
XCTAssertTrue(result.isSuccess)
XCTAssertNil(result.error)
XCTAssertEqual(result.value, false)
checkExp.fulfill()
try! serviceConversation?.subscribe(completion: { (result) in
expecting(
description: "service conversation subscription",
count: 3)
{ (exp) in
serviceConversation?.checkSubscription(completion: { (result) in
XCTAssertTrue(result.isSuccess)
XCTAssertNil(result.error)
checkExp.fulfill()
serviceConversation?.checkSubscription(completion: { (result) in
XCTAssertEqual(result.value, false)
exp.fulfill()
try! serviceConversation?.subscribe(completion: { (result) in
XCTAssertTrue(result.isSuccess)
XCTAssertNil(result.error)
XCTAssertEqual(result.value, true)
checkExp.fulfill()
XCTAssertEqual(serviceConversation?.isSubscribed, true)
exp.fulfill()
serviceConversation?.checkSubscription(completion: { (result) in
XCTAssertTrue(result.isSuccess)
XCTAssertNil(result.error)
XCTAssertEqual(result.value, true)
exp.fulfill()
})
})
})
})
wait(for: [checkExp], timeout: timeout)
}
}

func testNormalConversationUnreadEvent() {
Expand Down
81 changes: 46 additions & 35 deletions Sources/RTM/IMConversation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ public class IMConversation {
case unique = "unique"
case transient = "tr"
case system = "sys"
case joined = "joined"
case temporary = "temp"
case temporaryTTL = "ttl"
case convType = "conv_type"
Expand Down Expand Up @@ -2211,11 +2212,8 @@ extension IMConversation {
}

private func needUpdateMembers(members: [String], updatedDateString: String?) -> Bool {
guard
self.convType != .transient,
self.convType != .system,
!members.isEmpty else
{
if (self.convType == .transient) ||
(self.convType != .system && members.isEmpty) {
return false
}
if let dateString: String = updatedDateString,
Expand All @@ -2234,20 +2232,24 @@ extension IMConversation {
guard self.needUpdateMembers(members: joinedMembers, updatedDateString: udate) else {
return
}
let newMembers: [String]
if var originMembers: [String] = self.members {
for member in joinedMembers {
if !originMembers.contains(member) {
originMembers.append(member)
if self.convType == .system {
self.safeUpdatingRawData(key: .joined, value: true)
} else {
let newMembers: [String]
if var originMembers: [String] = self.members {
for member in joinedMembers {
if !originMembers.contains(member) {
originMembers.append(member)
}
}
newMembers = originMembers
} else {
newMembers = joinedMembers
}
self.safeUpdatingRawData(key: .members, value: newMembers)
if let udateString: String = udate {
self.safeUpdatingRawData(key: .updatedAt, value: udateString)
}
newMembers = originMembers
} else {
newMembers = joinedMembers
}
self.safeUpdatingRawData(key: .members, value: newMembers)
if let udateString: String = udate {
self.safeUpdatingRawData(key: .updatedAt, value: udateString)
}
#if canImport(GRDB)
if let _ = client.localStorage {
Expand All @@ -2262,19 +2264,30 @@ extension IMConversation {
guard self.needUpdateMembers(members: leftMembers, updatedDateString: udate) else {
return
}
if leftMembers.contains(self.clientID) {
self.isOutdated = true
}
if var originMembers: [String] = self.members {
for member in leftMembers {
if let index = originMembers.firstIndex(of: member) {
originMembers.remove(at: index)
if self.convType == .system {
self.safeUpdatingRawData(key: .joined, value: false)
} else {
if leftMembers.contains(self.clientID) {
self.isOutdated = true
}
if var originMembers: [String] = self.members {
for member in leftMembers {
if let index = originMembers.firstIndex(of: member) {
originMembers.remove(at: index)
}
}
self.safeUpdatingRawData(key: .members, value: originMembers)
}
self.safeUpdatingRawData(key: .members, value: originMembers)
}
if let udate = udate {
self.safeUpdatingRawData(key: .updatedAt, value: udate)
if let udate = udate {
self.safeUpdatingRawData(key: .updatedAt, value: udate)
}
self.sync(closure: {
if let _ = self._memberInfoTable {
for member in leftMembers {
self._memberInfoTable?.removeValue(forKey: member)
}
}
})
}
#if canImport(GRDB)
if let _ = client.localStorage {
Expand All @@ -2285,13 +2298,6 @@ extension IMConversation {
outdated: tuple.1)
}
#endif
self.sync(closure: {
if let _ = self._memberInfoTable {
for member in leftMembers {
self._memberInfoTable?.removeValue(forKey: member)
}
}
})
}

private class KeyAndDictionary {
Expand Down Expand Up @@ -2699,6 +2705,11 @@ public class IMChatRoom: IMConversation {

/// IM Service Conversation
public class IMServiceConversation: IMConversation {

/// Whether this service conversation has been subscribed by the client.
public var isSubscribed: Bool? {
return self.safeDecodingRawData(with: .joined)
}

@available(*, unavailable)
public override func update(attribution data: [String : Any], completion: @escaping (LCBooleanResult) -> Void) throws {
Expand Down