tdesktop/Telegram/SourceFiles/data/data_pinned_messages.cpp

83 lines
1.9 KiB
C++
Raw Normal View History

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