mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Moved out api for user photos to related separated module.
This commit is contained in:
parent
13146e9c06
commit
243b16398b
5 changed files with 76 additions and 89 deletions
|
@ -28,6 +28,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
namespace Api {
|
namespace Api {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
constexpr auto kSharedMediaLimit = 100;
|
||||||
|
|
||||||
SendMediaReady PreparePeerPhoto(
|
SendMediaReady PreparePeerPhoto(
|
||||||
MTP::DcId dcId,
|
MTP::DcId dcId,
|
||||||
PeerId peerId,
|
PeerId peerId,
|
||||||
|
@ -240,4 +242,51 @@ void PeerPhoto::ready(const FullMsgId &msgId, const MTPInputFile &file) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PeerPhoto::requestUserPhotos(
|
||||||
|
not_null<UserData*> user,
|
||||||
|
UserPhotoId afterId) {
|
||||||
|
if (_userPhotosRequests.contains(user)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto requestId = _api.request(MTPphotos_GetUserPhotos(
|
||||||
|
user->inputUser,
|
||||||
|
MTP_int(0),
|
||||||
|
MTP_long(afterId),
|
||||||
|
MTP_int(kSharedMediaLimit)
|
||||||
|
)).done([this, user](const MTPphotos_Photos &result) {
|
||||||
|
_userPhotosRequests.remove(user);
|
||||||
|
|
||||||
|
const auto fullCount = result.match([](const MTPDphotos_photos &d) {
|
||||||
|
return int(d.vphotos().v.size());
|
||||||
|
}, [](const MTPDphotos_photosSlice &d) {
|
||||||
|
return d.vcount().v;
|
||||||
|
});
|
||||||
|
|
||||||
|
auto photoIds = result.match([&](const auto &data) {
|
||||||
|
auto &owner = _session->data();
|
||||||
|
owner.processUsers(data.vusers());
|
||||||
|
|
||||||
|
auto photoIds = std::vector<PhotoId>();
|
||||||
|
photoIds.reserve(data.vphotos().v.size());
|
||||||
|
|
||||||
|
for (const auto &photo : data.vphotos().v) {
|
||||||
|
if (const auto photoData = owner.processPhoto(photo)) {
|
||||||
|
photoIds.push_back(photoData->id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return photoIds;
|
||||||
|
});
|
||||||
|
|
||||||
|
_session->storage().add(Storage::UserPhotosAddSlice(
|
||||||
|
peerToUser(user->id),
|
||||||
|
std::move(photoIds),
|
||||||
|
fullCount
|
||||||
|
));
|
||||||
|
}).fail([this, user] {
|
||||||
|
_userPhotosRequests.remove(user);
|
||||||
|
}).send();
|
||||||
|
_userPhotosRequests.emplace(user, requestId);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Api
|
} // namespace Api
|
||||||
|
|
|
@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
|
|
||||||
class ApiWrap;
|
class ApiWrap;
|
||||||
class PeerData;
|
class PeerData;
|
||||||
|
class UserData;
|
||||||
|
|
||||||
namespace Main {
|
namespace Main {
|
||||||
class Session;
|
class Session;
|
||||||
|
@ -20,12 +21,15 @@ namespace Api {
|
||||||
|
|
||||||
class PeerPhoto final {
|
class PeerPhoto final {
|
||||||
public:
|
public:
|
||||||
|
using UserPhotoId = PhotoId;
|
||||||
explicit PeerPhoto(not_null<ApiWrap*> api);
|
explicit PeerPhoto(not_null<ApiWrap*> api);
|
||||||
|
|
||||||
void upload(not_null<PeerData*> peer, QImage &&image);
|
void upload(not_null<PeerData*> peer, QImage &&image);
|
||||||
void clear(not_null<PhotoData*> photo);
|
void clear(not_null<PhotoData*> photo);
|
||||||
void set(not_null<PeerData*> peer, not_null<PhotoData*> photo);
|
void set(not_null<PeerData*> peer, not_null<PhotoData*> photo);
|
||||||
|
|
||||||
|
void requestUserPhotos(not_null<UserData*> user, UserPhotoId afterId);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void ready(const FullMsgId &msgId, const MTPInputFile &file);
|
void ready(const FullMsgId &msgId, const MTPInputFile &file);
|
||||||
|
|
||||||
|
@ -34,6 +38,8 @@ private:
|
||||||
|
|
||||||
base::flat_map<FullMsgId, not_null<PeerData*>> _uploads;
|
base::flat_map<FullMsgId, not_null<PeerData*>> _uploads;
|
||||||
|
|
||||||
|
base::flat_map<not_null<UserData*>, mtpRequestId> _userPhotosRequests;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Api
|
} // namespace Api
|
||||||
|
|
|
@ -90,7 +90,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "storage/file_upload.h"
|
#include "storage/file_upload.h"
|
||||||
#include "storage/storage_facade.h"
|
#include "storage/storage_facade.h"
|
||||||
#include "storage/storage_shared_media.h"
|
#include "storage/storage_shared_media.h"
|
||||||
#include "storage/storage_user_photos.h"
|
|
||||||
#include "storage/storage_media_prepare.h"
|
#include "storage/storage_media_prepare.h"
|
||||||
#include "storage/storage_account.h"
|
#include "storage/storage_account.h"
|
||||||
#include "facades.h"
|
#include "facades.h"
|
||||||
|
@ -103,7 +102,6 @@ constexpr auto kSaveCloudDraftTimeout = 1000;
|
||||||
constexpr auto kTopPromotionInterval = TimeId(60 * 60);
|
constexpr auto kTopPromotionInterval = TimeId(60 * 60);
|
||||||
constexpr auto kTopPromotionMinDelay = TimeId(10);
|
constexpr auto kTopPromotionMinDelay = TimeId(10);
|
||||||
constexpr auto kSmallDelayMs = 5;
|
constexpr auto kSmallDelayMs = 5;
|
||||||
constexpr auto kSharedMediaLimit = 100;
|
|
||||||
constexpr auto kReadFeaturedSetsTimeout = crl::time(1000);
|
constexpr auto kReadFeaturedSetsTimeout = crl::time(1000);
|
||||||
constexpr auto kFileLoaderQueueStopTimeout = crl::time(5000);
|
constexpr auto kFileLoaderQueueStopTimeout = crl::time(5000);
|
||||||
constexpr auto kStickersByEmojiInvalidateTimeout = crl::time(6 * 1000);
|
constexpr auto kStickersByEmojiInvalidateTimeout = crl::time(6 * 1000);
|
||||||
|
@ -2057,15 +2055,16 @@ void ApiWrap::saveDraftsToCloud() {
|
||||||
history->finishSavingCloudDraft(
|
history->finishSavingCloudDraft(
|
||||||
UnixtimeFromMsgId(response.outerMsgId));
|
UnixtimeFromMsgId(response.outerMsgId));
|
||||||
|
|
||||||
|
const auto requestId = response.requestId;
|
||||||
if (const auto cloudDraft = history->cloudDraft()) {
|
if (const auto cloudDraft = history->cloudDraft()) {
|
||||||
if (cloudDraft->saveRequestId == response.requestId) {
|
if (cloudDraft->saveRequestId == requestId) {
|
||||||
cloudDraft->saveRequestId = 0;
|
cloudDraft->saveRequestId = 0;
|
||||||
history->draftSavedToCloud();
|
history->draftSavedToCloud();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto i = _draftsSaveRequestIds.find(history);
|
auto i = _draftsSaveRequestIds.find(history);
|
||||||
if (i != _draftsSaveRequestIds.cend()
|
if (i != _draftsSaveRequestIds.cend()
|
||||||
&& i->second == response.requestId) {
|
&& i->second == requestId) {
|
||||||
_draftsSaveRequestIds.erase(history);
|
_draftsSaveRequestIds.erase(history);
|
||||||
checkQuitPreventFinished();
|
checkQuitPreventFinished();
|
||||||
}
|
}
|
||||||
|
@ -2073,14 +2072,15 @@ void ApiWrap::saveDraftsToCloud() {
|
||||||
history->finishSavingCloudDraft(
|
history->finishSavingCloudDraft(
|
||||||
UnixtimeFromMsgId(response.outerMsgId));
|
UnixtimeFromMsgId(response.outerMsgId));
|
||||||
|
|
||||||
|
const auto requestId = response.requestId;
|
||||||
if (const auto cloudDraft = history->cloudDraft()) {
|
if (const auto cloudDraft = history->cloudDraft()) {
|
||||||
if (cloudDraft->saveRequestId == response.requestId) {
|
if (cloudDraft->saveRequestId == requestId) {
|
||||||
history->clearCloudDraft();
|
history->clearCloudDraft();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto i = _draftsSaveRequestIds.find(history);
|
auto i = _draftsSaveRequestIds.find(history);
|
||||||
if (i != _draftsSaveRequestIds.cend()
|
if (i != _draftsSaveRequestIds.cend()
|
||||||
&& i->second == response.requestId) {
|
&& i->second == requestId) {
|
||||||
_draftsSaveRequestIds.erase(history);
|
_draftsSaveRequestIds.erase(history);
|
||||||
checkQuitPreventFinished();
|
checkQuitPreventFinished();
|
||||||
}
|
}
|
||||||
|
@ -2959,67 +2959,6 @@ void ApiWrap::sharedMediaDone(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ApiWrap::requestUserPhotos(
|
|
||||||
not_null<UserData*> user,
|
|
||||||
PhotoId afterId) {
|
|
||||||
if (_userPhotosRequests.contains(user)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto limit = kSharedMediaLimit;
|
|
||||||
|
|
||||||
auto requestId = request(MTPphotos_GetUserPhotos(
|
|
||||||
user->inputUser,
|
|
||||||
MTP_int(0),
|
|
||||||
MTP_long(afterId),
|
|
||||||
MTP_int(limit)
|
|
||||||
)).done([this, user, afterId](const MTPphotos_Photos &result) {
|
|
||||||
_userPhotosRequests.remove(user);
|
|
||||||
userPhotosDone(user, afterId, result);
|
|
||||||
}).fail([this, user] {
|
|
||||||
_userPhotosRequests.remove(user);
|
|
||||||
}).send();
|
|
||||||
_userPhotosRequests.emplace(user, requestId);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ApiWrap::userPhotosDone(
|
|
||||||
not_null<UserData*> user,
|
|
||||||
PhotoId photoId,
|
|
||||||
const MTPphotos_Photos &result) {
|
|
||||||
auto fullCount = 0;
|
|
||||||
auto &photos = *[&] {
|
|
||||||
switch (result.type()) {
|
|
||||||
case mtpc_photos_photos: {
|
|
||||||
auto &d = result.c_photos_photos();
|
|
||||||
_session->data().processUsers(d.vusers());
|
|
||||||
fullCount = d.vphotos().v.size();
|
|
||||||
return &d.vphotos().v;
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case mtpc_photos_photosSlice: {
|
|
||||||
auto &d = result.c_photos_photosSlice();
|
|
||||||
_session->data().processUsers(d.vusers());
|
|
||||||
fullCount = d.vcount().v;
|
|
||||||
return &d.vphotos().v;
|
|
||||||
} break;
|
|
||||||
}
|
|
||||||
Unexpected("photos.Photos type in userPhotosDone()");
|
|
||||||
}();
|
|
||||||
|
|
||||||
auto photoIds = std::vector<PhotoId>();
|
|
||||||
photoIds.reserve(photos.size());
|
|
||||||
for (auto &photo : photos) {
|
|
||||||
if (auto photoData = _session->data().processPhoto(photo)) {
|
|
||||||
photoIds.push_back(photoData->id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_session->storage().add(Storage::UserPhotosAddSlice(
|
|
||||||
peerToUser(user->id),
|
|
||||||
std::move(photoIds),
|
|
||||||
fullCount
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
void ApiWrap::sendAction(const SendAction &action) {
|
void ApiWrap::sendAction(const SendAction &action) {
|
||||||
if (!action.options.scheduled) {
|
if (!action.options.scheduled) {
|
||||||
_session->data().histories().readInbox(action.history);
|
_session->data().histories().readInbox(action.history);
|
||||||
|
|
|
@ -266,10 +266,6 @@ public:
|
||||||
not_null<PeerData*> peer,
|
not_null<PeerData*> peer,
|
||||||
Storage::SharedMediaType type);
|
Storage::SharedMediaType type);
|
||||||
|
|
||||||
void requestUserPhotos(
|
|
||||||
not_null<UserData*> user,
|
|
||||||
PhotoId afterId);
|
|
||||||
|
|
||||||
void readFeaturedSetDelayed(uint64 setId);
|
void readFeaturedSetDelayed(uint64 setId);
|
||||||
|
|
||||||
rpl::producer<SendAction> sendActions() const {
|
rpl::producer<SendAction> sendActions() const {
|
||||||
|
@ -460,11 +456,6 @@ private:
|
||||||
SliceType slice,
|
SliceType slice,
|
||||||
const MTPmessages_Messages &result);
|
const MTPmessages_Messages &result);
|
||||||
|
|
||||||
void userPhotosDone(
|
|
||||||
not_null<UserData*> user,
|
|
||||||
PhotoId photoId,
|
|
||||||
const MTPphotos_Photos &result);
|
|
||||||
|
|
||||||
void sendSharedContact(
|
void sendSharedContact(
|
||||||
const QString &phone,
|
const QString &phone,
|
||||||
const QString &firstName,
|
const QString &firstName,
|
||||||
|
@ -579,8 +570,6 @@ private:
|
||||||
MsgId,
|
MsgId,
|
||||||
SliceType>> _sharedMediaRequests;
|
SliceType>> _sharedMediaRequests;
|
||||||
|
|
||||||
base::flat_map<not_null<UserData*>, mtpRequestId> _userPhotosRequests;
|
|
||||||
|
|
||||||
std::unique_ptr<DialogsLoadState> _dialogsLoadState;
|
std::unique_ptr<DialogsLoadState> _dialogsLoadState;
|
||||||
TimeId _dialogsLoadTill = 0;
|
TimeId _dialogsLoadTill = 0;
|
||||||
rpl::variable<bool> _dialogsLoadMayBlockByDate = false;
|
rpl::variable<bool> _dialogsLoadMayBlockByDate = false;
|
||||||
|
|
|
@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
|
|
||||||
#include "main/main_session.h"
|
#include "main/main_session.h"
|
||||||
#include "apiwrap.h"
|
#include "apiwrap.h"
|
||||||
|
#include "api/api_peer_photo.h"
|
||||||
#include "data/data_session.h"
|
#include "data/data_session.h"
|
||||||
#include "data/data_user.h"
|
#include "data/data_user.h"
|
||||||
#include "storage/storage_facade.h"
|
#include "storage/storage_facade.h"
|
||||||
|
@ -45,7 +46,7 @@ private:
|
||||||
int _limitBefore = 0;
|
int _limitBefore = 0;
|
||||||
int _limitAfter = 0;
|
int _limitAfter = 0;
|
||||||
|
|
||||||
rpl::event_stream<PhotoId> _insufficientPhotosAround;
|
rpl::event_stream<Api::PeerPhoto::UserPhotoId> _insufficientPhotosAround;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -109,7 +110,7 @@ bool UserPhotosSliceBuilder::applyUpdate(const Storage::UserPhotosSliceUpdate &u
|
||||||
if (update.userId != _key.userId) {
|
if (update.userId != _key.userId) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
auto idsCount = update.photoIds ? int(update.photoIds->size()) : 0;
|
const auto idsCount = update.photoIds ? int(update.photoIds->size()) : 0;
|
||||||
mergeSliceData(
|
mergeSliceData(
|
||||||
update.count,
|
update.count,
|
||||||
update.photoIds ? *update.photoIds : std::deque<PhotoId> {},
|
update.photoIds ? *update.photoIds : std::deque<PhotoId> {},
|
||||||
|
@ -152,9 +153,9 @@ void UserPhotosSliceBuilder::mergeSliceData(
|
||||||
}
|
}
|
||||||
|
|
||||||
void UserPhotosSliceBuilder::sliceToLimits() {
|
void UserPhotosSliceBuilder::sliceToLimits() {
|
||||||
auto aroundIt = ranges::find(_ids, _key.photoId);
|
const auto aroundIt = ranges::find(_ids, _key.photoId);
|
||||||
auto removeFromBegin = (aroundIt - _ids.begin() - _limitBefore);
|
const auto removeFromBegin = (aroundIt - _ids.begin() - _limitBefore);
|
||||||
auto removeFromEnd = (_ids.end() - aroundIt - _limitAfter - 1);
|
const auto removeFromEnd = (_ids.end() - aroundIt - _limitAfter - 1);
|
||||||
if (removeFromEnd > 0) {
|
if (removeFromEnd > 0) {
|
||||||
_ids.erase(_ids.end() - removeFromEnd, _ids.end());
|
_ids.erase(_ids.end() - removeFromEnd, _ids.end());
|
||||||
_skippedAfter += removeFromEnd;
|
_skippedAfter += removeFromEnd;
|
||||||
|
@ -164,7 +165,8 @@ void UserPhotosSliceBuilder::sliceToLimits() {
|
||||||
if (_skippedBefore) {
|
if (_skippedBefore) {
|
||||||
*_skippedBefore += removeFromBegin;
|
*_skippedBefore += removeFromBegin;
|
||||||
}
|
}
|
||||||
} else if (removeFromBegin < 0 && (!_skippedBefore || *_skippedBefore > 0)) {
|
} else if (removeFromBegin < 0
|
||||||
|
&& (!_skippedBefore || *_skippedBefore > 0)) {
|
||||||
_insufficientPhotosAround.fire(_ids.empty() ? 0 : _ids.front());
|
_insufficientPhotosAround.fire(_ids.empty() ? 0 : _ids.front());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -185,21 +187,23 @@ rpl::producer<UserPhotosSlice> UserPhotosViewer(
|
||||||
int limitAfter) {
|
int limitAfter) {
|
||||||
return [=](auto consumer) {
|
return [=](auto consumer) {
|
||||||
auto lifetime = rpl::lifetime();
|
auto lifetime = rpl::lifetime();
|
||||||
auto builder = lifetime.make_state<UserPhotosSliceBuilder>(
|
const auto builder = lifetime.make_state<UserPhotosSliceBuilder>(
|
||||||
key,
|
key,
|
||||||
limitBefore,
|
limitBefore,
|
||||||
limitAfter);
|
limitAfter);
|
||||||
auto applyUpdate = [=](auto &&update) {
|
const auto applyUpdate = [=](auto &&update) {
|
||||||
if (builder->applyUpdate(std::forward<decltype(update)>(update))) {
|
if (builder->applyUpdate(std::forward<decltype(update)>(update))) {
|
||||||
consumer.put_next(builder->snapshot());
|
consumer.put_next(builder->snapshot());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
auto requestPhotosAround = [user = session->data().user(key.userId)](
|
auto requestPhotosAround = [user = session->data().user(key.userId)](
|
||||||
PhotoId photoId) {
|
Api::PeerPhoto::UserPhotoId photoId) {
|
||||||
user->session().api().requestUserPhotos(user, photoId);
|
user->session().api().peerPhoto().requestUserPhotos(
|
||||||
|
user,
|
||||||
|
photoId);
|
||||||
};
|
};
|
||||||
builder->insufficientPhotosAround()
|
builder->insufficientPhotosAround()
|
||||||
| rpl::start_with_next(requestPhotosAround, lifetime);
|
| rpl::start_with_next(std::move(requestPhotosAround), lifetime);
|
||||||
|
|
||||||
session->storage().userPhotosSliceUpdated()
|
session->storage().userPhotosSliceUpdated()
|
||||||
| rpl::start_with_next(applyUpdate, lifetime);
|
| rpl::start_with_next(applyUpdate, lifetime);
|
||||||
|
|
Loading…
Add table
Reference in a new issue