mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 22:55:00 +00:00
Allow getStoriesById to fail in state resolution
This commit is contained in:
@@ -295,7 +295,7 @@ class Download: NSObject, MTRequestMessageServiceDelegate {
|
||||
|> retryRequest
|
||||
}
|
||||
|
||||
func request<T>(_ data: (FunctionDescription, Buffer, DeserializeFunctionResponse<T>), expectedResponseSize: Int32? = nil) -> Signal<T, MTRpcError> {
|
||||
func request<T>(_ data: (FunctionDescription, Buffer, DeserializeFunctionResponse<T>), expectedResponseSize: Int32? = nil, automaticFloodWait: Bool = true) -> Signal<T, MTRpcError> {
|
||||
return Signal { subscriber in
|
||||
let request = MTRequest()
|
||||
request.expectedResponseSize = expectedResponseSize ?? 0
|
||||
@@ -311,6 +311,12 @@ class Download: NSObject, MTRequestMessageServiceDelegate {
|
||||
request.needsTimeoutTimer = self.useRequestTimeoutTimers
|
||||
|
||||
request.shouldContinueExecutionWithErrorContext = { errorContext in
|
||||
guard let errorContext = errorContext else {
|
||||
return true
|
||||
}
|
||||
if errorContext.floodWaitSeconds > 0 && !automaticFloodWait {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
|
||||
@@ -2100,8 +2100,9 @@ func resolveStories<T>(postbox: Postbox, source: FetchMessageHistoryHoleSource,
|
||||
while idOffset < allIds.count {
|
||||
let bucketLength = min(100, allIds.count - idOffset)
|
||||
let ids = Array(allIds[idOffset ..< (idOffset + bucketLength)])
|
||||
signals.append(_internal_getStoriesById(accountPeerId: accountPeerId, postbox: postbox, source: source, peerId: peerId, peerReference: additionalPeers.get(peerId).flatMap(PeerReference.init), ids: ids)
|
||||
signals.append(_internal_getStoriesById(accountPeerId: accountPeerId, postbox: postbox, source: source, peerId: peerId, peerReference: additionalPeers.get(peerId).flatMap(PeerReference.init), ids: ids, allowFloodWait: false)
|
||||
|> mapToSignal { result -> Signal<Never, NoError> in
|
||||
if let result = result {
|
||||
return postbox.transaction { transaction -> Void in
|
||||
for id in ids {
|
||||
let current = transaction.getStory(id: StoryId(peerId: peerId, id: id))
|
||||
@@ -2119,6 +2120,9 @@ func resolveStories<T>(postbox: Postbox, source: FetchMessageHistoryHoleSource,
|
||||
}
|
||||
}
|
||||
|> ignoreValues
|
||||
} else {
|
||||
return .complete()
|
||||
}
|
||||
})
|
||||
idOffset += bucketLength
|
||||
}
|
||||
|
||||
@@ -108,12 +108,12 @@ enum FetchMessageHistoryHoleSource {
|
||||
case network(Network)
|
||||
case download(Download)
|
||||
|
||||
func request<T>(_ data: (FunctionDescription, Buffer, DeserializeFunctionResponse<T>)) -> Signal<T, MTRpcError> {
|
||||
func request<T>(_ data: (FunctionDescription, Buffer, DeserializeFunctionResponse<T>), automaticFloodWait: Bool = true) -> Signal<T, MTRpcError> {
|
||||
switch self {
|
||||
case let .network(network):
|
||||
return network.request(data)
|
||||
return network.request(data, automaticFloodWait: automaticFloodWait)
|
||||
case let .download(download):
|
||||
return download.request(data)
|
||||
return download.request(data, automaticFloodWait: automaticFloodWait)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1435,25 +1435,25 @@ func _internal_getStoriesById(accountPeerId: PeerId, postbox: Postbox, network:
|
||||
}
|
||||
}
|
||||
|
||||
func _internal_getStoriesById(accountPeerId: PeerId, postbox: Postbox, source: FetchMessageHistoryHoleSource, peerId: PeerId, peerReference: PeerReference?, ids: [Int32]) -> Signal<[Stories.StoredItem], NoError> {
|
||||
func _internal_getStoriesById(accountPeerId: PeerId, postbox: Postbox, source: FetchMessageHistoryHoleSource, peerId: PeerId, peerReference: PeerReference?, ids: [Int32], allowFloodWait: Bool) -> Signal<[Stories.StoredItem]?, NoError> {
|
||||
return postbox.transaction { transaction -> Api.InputUser? in
|
||||
return transaction.getPeer(peerId).flatMap(apiInputUser)
|
||||
}
|
||||
|> mapToSignal { inputUser -> Signal<[Stories.StoredItem], NoError> in
|
||||
|> mapToSignal { inputUser -> Signal<[Stories.StoredItem]?, NoError> in
|
||||
guard let inputUser = inputUser ?? peerReference?.inputUser else {
|
||||
return .single([])
|
||||
}
|
||||
|
||||
return source.request(Api.functions.stories.getStoriesByID(userId: inputUser, id: ids))
|
||||
return source.request(Api.functions.stories.getStoriesByID(userId: inputUser, id: ids), automaticFloodWait: allowFloodWait)
|
||||
|> map(Optional.init)
|
||||
|> `catch` { _ -> Signal<Api.stories.Stories?, NoError> in
|
||||
return .single(nil)
|
||||
}
|
||||
|> mapToSignal { result -> Signal<[Stories.StoredItem], NoError> in
|
||||
|> mapToSignal { result -> Signal<[Stories.StoredItem]?, NoError> in
|
||||
guard let result = result else {
|
||||
return .single([])
|
||||
return .single(nil)
|
||||
}
|
||||
return postbox.transaction { transaction -> [Stories.StoredItem] in
|
||||
return postbox.transaction { transaction -> [Stories.StoredItem]? in
|
||||
switch result {
|
||||
case let .stories(_, stories, users):
|
||||
updatePeers(transaction: transaction, accountPeerId: accountPeerId, peers: AccumulatedPeers(users: users))
|
||||
@@ -1904,8 +1904,11 @@ func _internal_exportStoryLink(account: Account, peerId: EnginePeer.Id, id: Int3
|
||||
}
|
||||
|
||||
func _internal_refreshStories(account: Account, peerId: PeerId, ids: [Int32]) -> Signal<Never, NoError> {
|
||||
return _internal_getStoriesById(accountPeerId: account.peerId, postbox: account.postbox, source: .network(account.network), peerId: peerId, peerReference: nil, ids: ids)
|
||||
return _internal_getStoriesById(accountPeerId: account.peerId, postbox: account.postbox, source: .network(account.network), peerId: peerId, peerReference: nil, ids: ids, allowFloodWait: true)
|
||||
|> mapToSignal { result -> Signal<Never, NoError> in
|
||||
guard let result = result else {
|
||||
return .complete()
|
||||
}
|
||||
return account.postbox.transaction { transaction -> Void in
|
||||
var currentItems = transaction.getStoryItems(peerId: peerId)
|
||||
for i in 0 ..< currentItems.count {
|
||||
|
||||
Reference in New Issue
Block a user