/* 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_pinned_messages.h" #include "data/data_peer.h" #include "main/main_session.h" #include "storage/storage_facade.h" #include "storage/storage_shared_media.h" namespace Data { namespace { constexpr auto PinnedType = Storage::SharedMediaType::Pinned; using Storage::SharedMediaQuery; using Storage::SharedMediaKey; using Storage::SharedMediaResult; } // namespace PinnedMessages::PinnedMessages(not_null peer) : _peer(peer) , _storage(_peer->session().storage()) { } bool PinnedMessages::empty() const { return _storage.empty(SharedMediaKey(_peer->id, PinnedType, 0)); } MsgId PinnedMessages::topId() const { const auto slice = _storage.snapshot( SharedMediaQuery( SharedMediaKey(_peer->id, PinnedType, ServerMaxMsgId), 1, 1)); return slice.messageIds.empty() ? 0 : slice.messageIds.back(); } rpl::producer PinnedMessages::viewer( MsgId aroundId, int limit) const { return _storage.query( SharedMediaQuery( SharedMediaKey(_peer->id, PinnedType, aroundId), limit, limit) ) | rpl::map([](const SharedMediaResult &result) { auto data = PinnedAroundId(); data.fullCount = result.count; data.skippedBefore = result.skippedBefore; data.skippedAfter = result.skippedAfter; data.ids = result.messageIds | ranges::to_vector; return data; }); } void PinnedMessages::setTopId(MsgId messageId) { while (true) { auto top = topId(); if (top > messageId) { _storage.remove(Storage::SharedMediaRemoveOne( _peer->id, PinnedType, top)); } else if (top == messageId) { return; } else { break; } } _storage.add(Storage::SharedMediaAddNew( _peer->id, PinnedType, messageId)); } } // namespace Data