mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-22 22:25:57 +00:00
Stories
This commit is contained in:
@@ -128,3 +128,68 @@ func managedAutoremoveMessageOperations(network: Network, postbox: Postbox, isRe
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func managedAutoexpireStoryOperations(network: Network, postbox: Postbox) -> Signal<Void, NoError> {
|
||||
return Signal { _ in
|
||||
let timeOffsetOnce = Signal<Double, NoError> { subscriber in
|
||||
subscriber.putNext(network.globalTimeDifference)
|
||||
return EmptyDisposable
|
||||
}
|
||||
|
||||
let timeOffset = (
|
||||
timeOffsetOnce
|
||||
|> then(
|
||||
Signal<Double, NoError>.complete()
|
||||
|> delay(1.0, queue: .mainQueue())
|
||||
)
|
||||
)
|
||||
|> restart
|
||||
|> map { value -> Double in
|
||||
round(value)
|
||||
}
|
||||
|> distinctUntilChanged
|
||||
|
||||
Logger.shared.log("Autoexpire stories", "starting")
|
||||
|
||||
let currentDisposable = MetaDisposable()
|
||||
|
||||
let disposable = combineLatest(timeOffset, postbox.combinedView(keys: [PostboxViewKey.storyExpirationTimeItems])).start(next: { timeOffset, views in
|
||||
guard let view = views.views[PostboxViewKey.storyExpirationTimeItems] as? StoryExpirationTimeItemsView, let topItem = view.topEntry else {
|
||||
currentDisposable.set(nil)
|
||||
return
|
||||
}
|
||||
|
||||
let timestamp = CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970 + timeOffset
|
||||
let delay = max(0.0, Double(topItem.expirationTimestamp) - timestamp)
|
||||
|
||||
let signal = Signal<Void, NoError>.complete()
|
||||
|> suspendAwareDelay(delay, queue: Queue.concurrentDefaultQueue())
|
||||
|> then(postbox.transaction { transaction -> Void in
|
||||
var idsByPeerId: [PeerId: [Int32]] = [:]
|
||||
let timestamp = Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970 + timeOffset)
|
||||
|
||||
for id in transaction.getExpiredStoryIds(belowTimestamp: timestamp + 3) {
|
||||
if idsByPeerId[id.peerId] == nil {
|
||||
idsByPeerId[id.peerId] = [id.id]
|
||||
} else {
|
||||
idsByPeerId[id.peerId]?.append(id.id)
|
||||
}
|
||||
}
|
||||
|
||||
for (peerId, ids) in idsByPeerId {
|
||||
var items = transaction.getStoryItems(peerId: peerId)
|
||||
items.removeAll(where: { ids.contains($0.id) })
|
||||
transaction.setStoryItems(peerId: topItem.id.peerId, items: items)
|
||||
}
|
||||
})
|
||||
|
||||
currentDisposable.set(signal.start())
|
||||
})
|
||||
|
||||
return ActionDisposable {
|
||||
disposable.dispose()
|
||||
currentDisposable.dispose()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user