103 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
This file is part of Telegram Desktop,
 | 
						|
the official desktop application for the Telegram messaging service.
 | 
						|
 | 
						|
For license and copyright information please follow this link:
 | 
						|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 | 
						|
*/
 | 
						|
#include "data/data_feed_messages.h"
 | 
						|
 | 
						|
#include "apiwrap.h"
 | 
						|
#include "auth_session.h"
 | 
						|
#include "data/data_session.h"
 | 
						|
#include "storage/storage_feed_messages.h"
 | 
						|
 | 
						|
namespace Data {
 | 
						|
 | 
						|
rpl::producer<MessagesSlice> FeedMessagesViewer(
 | 
						|
		Storage::FeedMessagesKey key,
 | 
						|
		int limitBefore,
 | 
						|
		int limitAfter) {
 | 
						|
	Expects(IsServerMsgId(key.position.fullId.msg)
 | 
						|
		|| (key.position.fullId.msg == 0));
 | 
						|
 | 
						|
	return [=](auto consumer) {
 | 
						|
		auto lifetime = rpl::lifetime();
 | 
						|
		const auto builder = lifetime.make_state<MessagesSliceBuilder>(
 | 
						|
			key.position,
 | 
						|
			limitBefore,
 | 
						|
			limitAfter);
 | 
						|
		const auto feed = Auth().data().feed(key.feedId);
 | 
						|
		using AroundData = MessagesSliceBuilder::AroundData;
 | 
						|
		const auto requestMediaAround = [=](const AroundData &data) {
 | 
						|
			if (data.aroundId || !key.position) {
 | 
						|
				//Auth().api().requestFeedMessages( // #feed
 | 
						|
				//	feed,
 | 
						|
				//	data.aroundId,
 | 
						|
				//	data.direction);
 | 
						|
			}
 | 
						|
		};
 | 
						|
		builder->insufficientAround(
 | 
						|
		) | rpl::start_with_next(requestMediaAround, lifetime);
 | 
						|
 | 
						|
		const auto pushNextSnapshot = [=] {
 | 
						|
			consumer.put_next(builder->snapshot());
 | 
						|
		};
 | 
						|
 | 
						|
		using SliceUpdate = Storage::FeedMessagesSliceUpdate;
 | 
						|
		Auth().storage().feedMessagesSliceUpdated(
 | 
						|
		) | rpl::filter([=](const SliceUpdate &update) {
 | 
						|
			return (update.feedId == key.feedId);
 | 
						|
		}) | rpl::filter([=](const SliceUpdate &update) {
 | 
						|
			return builder->applyUpdate(update.data);
 | 
						|
		}) | rpl::start_with_next(pushNextSnapshot, lifetime);
 | 
						|
 | 
						|
		using OneRemoved = Storage::FeedMessagesRemoveOne;
 | 
						|
		Auth().storage().feedMessagesOneRemoved(
 | 
						|
		) | rpl::filter([=](const OneRemoved &update) {
 | 
						|
			return (update.feedId == key.feedId);
 | 
						|
		}) | rpl::filter([=](const OneRemoved &update) {
 | 
						|
			return builder->removeOne(update.messageId);
 | 
						|
		}) | rpl::start_with_next(pushNextSnapshot, lifetime);
 | 
						|
 | 
						|
		using AllRemoved = Storage::FeedMessagesRemoveAll;
 | 
						|
		Auth().storage().feedMessagesAllRemoved(
 | 
						|
		) | rpl::filter([=](const AllRemoved &update) {
 | 
						|
			return (update.feedId == key.feedId);
 | 
						|
		}) | rpl::filter([=](const AllRemoved &update) {
 | 
						|
			return builder->removeFromChannel(update.channelId);
 | 
						|
		}) | rpl::start_with_next(pushNextSnapshot, lifetime);
 | 
						|
 | 
						|
		using Invalidate = Storage::FeedMessagesInvalidate;
 | 
						|
		Auth().storage().feedMessagesInvalidated(
 | 
						|
		) | rpl::filter([=](const Invalidate &update) {
 | 
						|
			return (update.feedId == key.feedId);
 | 
						|
		}) | rpl::filter([=] {
 | 
						|
			return builder->invalidated();
 | 
						|
		}) | rpl::start_with_next(pushNextSnapshot, lifetime);
 | 
						|
 | 
						|
		using InvalidateBottom = Storage::FeedMessagesInvalidateBottom;
 | 
						|
		Auth().storage().feedMessagesBottomInvalidated(
 | 
						|
		) | rpl::filter([=](const InvalidateBottom &update) {
 | 
						|
			return (update.feedId == key.feedId);
 | 
						|
		}) | rpl::filter([=] {
 | 
						|
			return builder->bottomInvalidated();
 | 
						|
		}) | rpl::start_with_next(pushNextSnapshot, lifetime);
 | 
						|
 | 
						|
		using Result = Storage::FeedMessagesResult;
 | 
						|
		Auth().storage().query(Storage::FeedMessagesQuery(
 | 
						|
			key,
 | 
						|
			limitBefore,
 | 
						|
			limitAfter
 | 
						|
		)) | rpl::filter([=](const Result &result) {
 | 
						|
			return builder->applyInitial(result);
 | 
						|
		}) | rpl::start_with_next_done(
 | 
						|
			pushNextSnapshot,
 | 
						|
			[=] { builder->checkInsufficient(); },
 | 
						|
			lifetime);
 | 
						|
 | 
						|
		return lifetime;
 | 
						|
	};
 | 
						|
}
 | 
						|
 | 
						|
} // namespace Data
 |