This commit is contained in:
Ali
2023-06-24 21:50:38 +03:00
parent 80587fe553
commit b76ea6ba99
17 changed files with 400 additions and 44 deletions

View File

@@ -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()
}
}
}