Request history parts through Histories.

This commit is contained in:
John Preston 2020-02-21 15:51:37 +04:00
parent 818f5cd004
commit 6f672ecdc3
11 changed files with 282 additions and 195 deletions

View file

@ -1012,34 +1012,6 @@ rpl::producer<bool> ApiWrap::dialogsLoadBlockedByDate() const {
return _dialogsLoadBlockedByDate.value();
}
void ApiWrap::requestFakeChatListMessage(
not_null<History*> history) {
if (_fakeChatListRequests.contains(history)) {
return;
}
_fakeChatListRequests.emplace(history);
request(MTPmessages_GetHistory(
history->peer->input,
MTP_int(0), // offset_id
MTP_int(0), // offset_date
MTP_int(0), // add_offset
MTP_int(2), // limit
MTP_int(0), // max_id
MTP_int(0), // min_id
MTP_int(0)
)).done([=](const MTPmessages_Messages &result) {
_fakeChatListRequests.erase(history);
history->setFakeChatListMessageFrom(result);
}).fail([=](const RPCError &error) {
_fakeChatListRequests.erase(history);
history->setFakeChatListMessageFrom(MTP_messages_messages(
MTP_vector<MTPMessage>(0),
MTP_vector<MTPChat>(0),
MTP_vector<MTPUser>(0)));
}).send();
}
void ApiWrap::requestWallPaper(
const QString &slug,
Fn<void(const Data::WallPaper &)> done,
@ -3908,12 +3880,12 @@ void ApiWrap::requestSharedMedia(
SharedMediaType type,
MsgId messageId,
SliceType slice) {
auto key = std::make_tuple(peer, type, messageId, slice);
const auto key = std::make_tuple(peer, type, messageId, slice);
if (_sharedMediaRequests.contains(key)) {
return;
}
auto prepared = Api::PrepareSearchRequest(
const auto prepared = Api::PrepareSearchRequest(
peer,
type,
QString(),
@ -3923,17 +3895,23 @@ void ApiWrap::requestSharedMedia(
return;
}
auto requestId = request(
std::move(*prepared)
).done([this, peer, type, messageId, slice](
const MTPmessages_Messages &result) {
auto key = std::make_tuple(peer, type, messageId, slice);
_sharedMediaRequests.remove(key);
sharedMediaDone(peer, type, messageId, slice, result);
}).fail([this, key](const RPCError &error) {
_sharedMediaRequests.remove(key);
}).send();
_sharedMediaRequests.emplace(key, requestId);
const auto history = session().data().history(peer);
auto &histories = history->owner().histories();
const auto requestType = Data::Histories::RequestType::History;
histories.sendRequest(history, requestType, [=](Fn<void()> finish) {
return request(
std::move(*prepared)
).done([=](const MTPmessages_Messages &result) {
const auto key = std::make_tuple(peer, type, messageId, slice);
_sharedMediaRequests.remove(key);
sharedMediaDone(peer, type, messageId, slice, result);
finish();
}).fail([=](const RPCError &error) {
_sharedMediaRequests.remove(key);
finish();
}).send();
});
_sharedMediaRequests.emplace(key);
}
void ApiWrap::sharedMediaDone(

View file

@ -177,7 +177,6 @@ public:
//void setFeedChannels(
// not_null<Data::Feed*> feed,
// const std::vector<not_null<ChannelData*>> &channels);
void requestFakeChatListMessage(not_null<History*> history);
void requestWallPaper(
const QString &slug,
@ -739,15 +738,14 @@ private:
mtpRequestId _contactsRequestId = 0;
mtpRequestId _contactsStatusesRequestId = 0;
base::flat_set<not_null<History*>> _fakeChatListRequests;
base::flat_map<not_null<History*>, mtpRequestId> _unreadMentionsRequests;
base::flat_map<std::tuple<
base::flat_set<std::tuple<
not_null<PeerData*>,
SharedMediaType,
MsgId,
SliceType>, mtpRequestId> _sharedMediaRequests;
SliceType>> _sharedMediaRequests;
base::flat_map<not_null<UserData*>, mtpRequestId> _userPhotosRequests;

View file

@ -44,7 +44,7 @@ private:
MTP::Sender _api;
MsgId _offsetId = 0;
mtpRequestId _loadRequestId = 0;
int _loadRequestId = 0; // Not a real mtpRequestId.
bool _allLoaded = false;
};

View file

@ -333,6 +333,38 @@ void Histories::changeDialogUnreadMark(
)).send();
}
void Histories::requestFakeChatListMessage(
not_null<History*> history) {
if (_fakeChatListRequests.contains(history)) {
return;
}
_fakeChatListRequests.emplace(history);
sendRequest(history, RequestType::History, [=](Fn<void()> finish) {
return session().api().request(MTPmessages_GetHistory(
history->peer->input,
MTP_int(0), // offset_id
MTP_int(0), // offset_date
MTP_int(0), // add_offset
MTP_int(2), // limit
MTP_int(0), // max_id
MTP_int(0), // min_id
MTP_int(0)
)).done([=](const MTPmessages_Messages &result) {
_fakeChatListRequests.erase(history);
history->setFakeChatListMessageFrom(result);
finish();
}).fail([=](const RPCError &error) {
_fakeChatListRequests.erase(history);
history->setFakeChatListMessageFrom(MTP_messages_messages(
MTP_vector<MTPMessage>(0),
MTP_vector<MTPChat>(0),
MTP_vector<MTPUser>(0)));
finish();
}).send();
});
}
void Histories::sendPendingReadInbox(not_null<History*> history) {
if (const auto state = lookup(history)) {
if (state->readTill

View file

@ -56,6 +56,7 @@ public:
void dialogEntryApplied(not_null<History*> history);
void changeDialogUnreadMark(not_null<History*> history, bool unread);
//void changeDialogUnreadMark(not_null<Data::Feed*> feed, bool unread); // #feed
void requestFakeChatListMessage(not_null<History*> history);
void deleteMessages(
not_null<History*> history,
@ -121,6 +122,8 @@ private:
not_null<History*>,
std::vector<Fn<void()>>> _dialogRequestsPending;
base::flat_set<not_null<History*>> _fakeChatListRequests;
};
} // namespace Data

View file

@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "data/data_session.h"
#include "data/data_messages.h"
#include "data/data_channel.h"
#include "data/data_histories.h"
#include "history/history.h"
#include "history/history_item.h"
#include "apiwrap.h"
@ -193,7 +194,8 @@ SearchController::CacheEntry::CacheEntry(const Query &query)
}
SearchController::SearchController(not_null<Main::Session*> session)
: _api(session->api().instance()) {
: _session(session)
, _api(session->api().instance()) {
}
bool SearchController::hasInCache(const Query &query) const {
@ -366,23 +368,32 @@ void SearchController::requestMore(
if (!prepared) {
return;
}
auto requestId = _api.request(
std::move(*prepared)
).done([=](const MTPmessages_Messages &result) {
listData->requests.remove(key);
auto parsed = ParseSearchResult(
listData->peer,
query.type,
key.aroundId,
key.direction,
result);
listData->list.addSlice(
std::move(parsed.messageIds),
parsed.noSkipRange,
parsed.fullCount);
}).send();
auto &histories = _session->data().histories();
const auto type = Histories::RequestType::History;
const auto history = _session->data().history(listData->peer);
auto requestId = histories.sendRequest(history, type, [=](Fn<void()> finish) {
return _api.request(
std::move(*prepared)
).done([=](const MTPmessages_Messages &result) {
listData->requests.remove(key);
auto parsed = ParseSearchResult(
listData->peer,
query.type,
key.aroundId,
key.direction,
result);
listData->list.addSlice(
std::move(parsed.messageIds),
parsed.noSkipRange,
parsed.fullCount);
finish();
}).fail([=](const RPCError &error) {
finish();
}).send();
});
listData->requests.emplace(key, [=] {
_api.request(requestId).cancel();
auto &histories = _session->data().histories();
histories.cancelRequest(history, requestId);
});
}

View file

@ -129,6 +129,7 @@ private:
const Query &query,
Data *listData);
const not_null<Main::Session*> _session;
MTP::Sender _api;
Cache _cache;
Cache::iterator _current = _cache.end();

View file

@ -1015,94 +1015,95 @@ void Widget::searchReceived(
? *_singleMessageSearch.lookup(_searchQuery)
: nullptr;
if (_searchRequest == requestId) {
switch (result.type()) {
case mtpc_messages_messages: {
auto &d = result.c_messages_messages();
if (_searchRequest != 0) {
// Don't apply cached data!
session().data().processUsers(d.vusers());
session().data().processChats(d.vchats());
}
auto &msgs = d.vmessages().v;
_inner->searchReceived(msgs, inject, type, msgs.size());
if (_searchRequest != requestId) {
return;
}
switch (result.type()) {
case mtpc_messages_messages: {
auto &d = result.c_messages_messages();
if (_searchRequest != 0) {
// Don't apply cached data!
session().data().processUsers(d.vusers());
session().data().processChats(d.vchats());
}
auto &msgs = d.vmessages().v;
_inner->searchReceived(msgs, inject, type, msgs.size());
if (type == SearchRequestType::MigratedFromStart || type == SearchRequestType::MigratedFromOffset) {
_searchFullMigrated = true;
} else {
_searchFull = true;
}
} break;
case mtpc_messages_messagesSlice: {
auto &d = result.c_messages_messagesSlice();
if (_searchRequest != 0) {
// Don't apply cached data!
session().data().processUsers(d.vusers());
session().data().processChats(d.vchats());
}
auto &msgs = d.vmessages().v;
const auto someAdded = _inner->searchReceived(msgs, inject, type, d.vcount().v);
const auto nextRate = d.vnext_rate();
const auto rateUpdated = nextRate && (nextRate->v != _searchNextRate);
const auto finished = (type == SearchRequestType::FromStart || type == SearchRequestType::FromOffset)
? !rateUpdated
: !someAdded;
if (rateUpdated) {
_searchNextRate = nextRate->v;
}
if (finished) {
if (type == SearchRequestType::MigratedFromStart || type == SearchRequestType::MigratedFromOffset) {
_searchFullMigrated = true;
} else {
_searchFull = true;
}
} break;
}
} break;
case mtpc_messages_messagesSlice: {
auto &d = result.c_messages_messagesSlice();
if (_searchRequest != 0) {
// Don't apply cached data!
session().data().processUsers(d.vusers());
session().data().processChats(d.vchats());
}
auto &msgs = d.vmessages().v;
const auto someAdded = _inner->searchReceived(msgs, inject, type, d.vcount().v);
const auto nextRate = d.vnext_rate();
const auto rateUpdated = nextRate && (nextRate->v != _searchNextRate);
const auto finished = (type == SearchRequestType::FromStart || type == SearchRequestType::FromOffset)
? !rateUpdated
: !someAdded;
if (rateUpdated) {
_searchNextRate = nextRate->v;
}
if (finished) {
if (type == SearchRequestType::MigratedFromStart || type == SearchRequestType::MigratedFromOffset) {
_searchFullMigrated = true;
} else {
_searchFull = true;
}
}
} break;
case mtpc_messages_channelMessages: {
auto &d = result.c_messages_channelMessages();
if (const auto peer = _searchInChat.peer()) {
if (const auto channel = peer->asChannel()) {
channel->ptsReceived(d.vpts().v);
} else {
LOG(("API Error: "
"received messages.channelMessages when no channel "
"was passed! (Widget::searchReceived)"));
}
case mtpc_messages_channelMessages: {
auto &d = result.c_messages_channelMessages();
if (const auto peer = _searchInChat.peer()) {
if (const auto channel = peer->asChannel()) {
channel->ptsReceived(d.vpts().v);
} else {
LOG(("API Error: "
"received messages.channelMessages when no channel "
"was passed! (Widget::searchReceived)"));
}
if (_searchRequest != 0) {
// Don't apply cached data!
session().data().processUsers(d.vusers());
session().data().processChats(d.vchats());
}
auto &msgs = d.vmessages().v;
if (!_inner->searchReceived(msgs, inject, type, d.vcount().v)) {
if (type == SearchRequestType::MigratedFromStart || type == SearchRequestType::MigratedFromOffset) {
_searchFullMigrated = true;
} else {
_searchFull = true;
}
}
} break;
case mtpc_messages_messagesNotModified: {
LOG(("API Error: received messages.messagesNotModified! (Widget::searchReceived)"));
} else {
LOG(("API Error: "
"received messages.channelMessages when no channel "
"was passed! (Widget::searchReceived)"));
}
if (_searchRequest != 0) {
// Don't apply cached data!
session().data().processUsers(d.vusers());
session().data().processChats(d.vchats());
}
auto &msgs = d.vmessages().v;
if (!_inner->searchReceived(msgs, inject, type, d.vcount().v)) {
if (type == SearchRequestType::MigratedFromStart || type == SearchRequestType::MigratedFromOffset) {
_searchFullMigrated = true;
} else {
_searchFull = true;
}
} break;
}
} break;
_searchRequest = 0;
onListScroll();
update();
case mtpc_messages_messagesNotModified: {
LOG(("API Error: received messages.messagesNotModified! (Widget::searchReceived)"));
if (type == SearchRequestType::MigratedFromStart || type == SearchRequestType::MigratedFromOffset) {
_searchFullMigrated = true;
} else {
_searchFull = true;
}
} break;
}
_searchRequest = 0;
onListScroll();
update();
}
void Widget::peerSearchReceived(

View file

@ -2480,7 +2480,7 @@ void History::setFakeChatListMessage() {
if (const auto chat = peer->asChat()) {
// In chats we try to take the item before the 'last', which
// is the empty-displayed migration message.
session().api().requestFakeChatListMessage(this);
owner().histories().requestFakeChatListMessage(this);
} else if (const auto from = migrateFrom()) {
// In megagroups we just try to use
// the message from the original group.

View file

@ -1716,9 +1716,8 @@ void HistoryWidget::showHistory(
session().data().stopPlayingVideoFiles();
clearReplyReturns();
clearAllLoadRequests();
if (_history) {
clearAllLoadRequests();
if (Ui::InFocusChain(_list)) {
// Removing focus from list clears selected and updates top bar.
setFocus();
@ -1917,19 +1916,34 @@ void HistoryWidget::showHistory(
}
void HistoryWidget::clearDelayedShowAt() {
Expects(_history != nullptr);
_delayedShowAtMsgId = -1;
if (_delayedShowAtRequest) {
MTP::cancel(_delayedShowAtRequest);
_history->owner().histories().cancelRequest(
_history,
_delayedShowAtRequest);
_delayedShowAtRequest = 0;
}
}
void HistoryWidget::clearAllLoadRequests() {
Expects(_history != nullptr);
auto &histories = _history->owner().histories();
clearDelayedShowAt();
if (_firstLoadRequest) MTP::cancel(_firstLoadRequest);
if (_preloadRequest) MTP::cancel(_preloadRequest);
if (_preloadDownRequest) MTP::cancel(_preloadDownRequest);
_preloadRequest = _preloadDownRequest = _firstLoadRequest = 0;
if (_firstLoadRequest) {
histories.cancelRequest(_history, _firstLoadRequest);
_firstLoadRequest = 0;
}
if (_preloadRequest) {
histories.cancelRequest(_history, _preloadRequest);
_preloadRequest = 0;
}
if (_preloadDownRequest) {
histories.cancelRequest(_history, _preloadDownRequest);
_preloadDownRequest = 0;
}
}
void HistoryWidget::updateFieldSubmitSettings() {
@ -2330,8 +2344,10 @@ void HistoryWidget::unreadCountUpdated() {
}
}
bool HistoryWidget::messagesFailed(const RPCError &error, mtpRequestId requestId) {
if (MTP::isDefaultHandledError(error)) return false;
bool HistoryWidget::messagesFailed(const RPCError &error, int requestId) {
if (MTP::isDefaultHandledError(error)) {
return false;
}
if (error.type() == qstr("CHANNEL_PRIVATE")
|| error.type() == qstr("CHANNEL_PUBLIC_GROUP_NA")
@ -2356,15 +2372,20 @@ bool HistoryWidget::messagesFailed(const RPCError &error, mtpRequestId requestId
return true;
}
void HistoryWidget::messagesReceived(PeerData *peer, const MTPmessages_Messages &messages, mtpRequestId requestId) {
if (!_history) {
_preloadRequest = _preloadDownRequest = _firstLoadRequest = _delayedShowAtRequest = 0;
return;
}
void HistoryWidget::messagesReceived(PeerData *peer, const MTPmessages_Messages &messages, int requestId) {
Expects(_history != nullptr);
bool toMigrated = (peer == _peer->migrateFrom());
if (peer != _peer && !toMigrated) {
_preloadRequest = _preloadDownRequest = _firstLoadRequest = _delayedShowAtRequest = 0;
if (_preloadRequest == requestId) {
_preloadRequest = 0;
} else if (_preloadDownRequest == requestId) {
_preloadDownRequest = 0;
} else if (_firstLoadRequest == requestId) {
_firstLoadRequest = 0;
} else if (_delayedShowAtRequest == requestId) {
_delayedShowAtRequest = 0;
}
return;
}
@ -2456,10 +2477,7 @@ void HistoryWidget::messagesReceived(PeerData *peer, const MTPmessages_Messages
_delayedShowAtRequest = 0;
_history->getReadyFor(_delayedShowAtMsgId);
if (_history->isEmpty()) {
if (_preloadRequest) MTP::cancel(_preloadRequest);
if (_preloadDownRequest) MTP::cancel(_preloadDownRequest);
if (_firstLoadRequest) MTP::cancel(_firstLoadRequest);
_preloadRequest = _preloadDownRequest = 0;
clearAllLoadRequests();
_firstLoadRequest = -1; // hack - don't updateListSize yet
addMessagesToFront(peer, *histList);
_firstLoadRequest = 0;
@ -2520,14 +2538,14 @@ void HistoryWidget::firstLoadMessages() {
return;
}
auto from = _peer;
auto from = _history;
auto offsetId = 0;
auto offset = 0;
auto loadCount = kMessagesPerPage;
if (_showAtMsgId == ShowAtUnreadMsgId) {
if (const auto around = _migrated ? _migrated->loadAroundId() : 0) {
_history->getReadyFor(_showAtMsgId);
from = _migrated->peer;
from = _migrated;
offset = -loadCount / 2;
offsetId = around;
} else if (const auto around = _history->loadAroundId()) {
@ -2547,7 +2565,7 @@ void HistoryWidget::firstLoadMessages() {
} else if (_showAtMsgId < 0 && _history->isChannel()) {
if (_showAtMsgId < 0 && -_showAtMsgId < ServerMaxMsgId && _migrated) {
_history->getReadyFor(_showAtMsgId);
from = _migrated->peer;
from = _migrated;
offset = -loadCount / 2;
offsetId = -_showAtMsgId;
} else if (_showAtMsgId == SwitchAtTopMsgId) {
@ -2560,18 +2578,27 @@ void HistoryWidget::firstLoadMessages() {
auto minId = 0;
auto historyHash = 0;
_firstLoadRequest = MTP::send(
MTPmessages_GetHistory(
from->input,
const auto history = from;
const auto type = Data::Histories::RequestType::History;
auto &histories = history->owner().histories();
_firstLoadRequest = histories.sendRequest(history, type, [=](Fn<void()> finish) {
return history->session().api().request(MTPmessages_GetHistory(
history->peer->input,
MTP_int(offsetId),
MTP_int(offsetDate),
MTP_int(offset),
MTP_int(loadCount),
MTP_int(maxId),
MTP_int(minId),
MTP_int(historyHash)),
rpcDone(&HistoryWidget::messagesReceived, from),
rpcFail(&HistoryWidget::messagesFailed));
MTP_int(historyHash)
)).done([=](const MTPmessages_Messages &result) {
messagesReceived(history->peer, result, _firstLoadRequest);
finish();
}).fail([=](const RPCError &error) {
messagesFailed(error, _firstLoadRequest);
finish();
}).send();
});
}
void HistoryWidget::loadMessages() {
@ -2602,18 +2629,27 @@ void HistoryWidget::loadMessages() {
auto minId = 0;
auto historyHash = 0;
_preloadRequest = MTP::send(
MTPmessages_GetHistory(
from->peer->input,
const auto history = from;
const auto type = Data::Histories::RequestType::History;
auto &histories = history->owner().histories();
_preloadRequest = histories.sendRequest(history, type, [=](Fn<void()> finish) {
return history->session().api().request(MTPmessages_GetHistory(
history->peer->input,
MTP_int(offsetId),
MTP_int(offsetDate),
MTP_int(addOffset),
MTP_int(loadCount),
MTP_int(maxId),
MTP_int(minId),
MTP_int(historyHash)),
rpcDone(&HistoryWidget::messagesReceived, from->peer.get()),
rpcFail(&HistoryWidget::messagesFailed));
MTP_int(historyHash)
)).done([=](const MTPmessages_Messages &result) {
messagesReceived(history->peer, result, _preloadRequest);
finish();
}).fail([=](const RPCError &error) {
messagesFailed(error, _preloadRequest);
finish();
}).send();
});
}
void HistoryWidget::loadMessagesDown() {
@ -2644,18 +2680,27 @@ void HistoryWidget::loadMessagesDown() {
auto minId = 0;
auto historyHash = 0;
_preloadDownRequest = MTP::send(
MTPmessages_GetHistory(
from->peer->input,
const auto history = from;
const auto type = Data::Histories::RequestType::History;
auto &histories = history->owner().histories();
_preloadDownRequest = histories.sendRequest(history, type, [=](Fn<void()> finish) {
return history->session().api().request(MTPmessages_GetHistory(
history->peer->input,
MTP_int(offsetId + 1),
MTP_int(offsetDate),
MTP_int(addOffset),
MTP_int(loadCount),
MTP_int(maxId),
MTP_int(minId),
MTP_int(historyHash)),
rpcDone(&HistoryWidget::messagesReceived, from->peer.get()),
rpcFail(&HistoryWidget::messagesFailed));
MTP_int(historyHash)
)).done([=](const MTPmessages_Messages &result) {
messagesReceived(history->peer, result, _preloadDownRequest);
finish();
}).fail([=](const RPCError &error) {
messagesFailed(error, _preloadDownRequest);
finish();
}).send();
});
}
void HistoryWidget::delayedShowAt(MsgId showAtMsgId) {
@ -2667,13 +2712,13 @@ void HistoryWidget::delayedShowAt(MsgId showAtMsgId) {
clearDelayedShowAt();
_delayedShowAtMsgId = showAtMsgId;
auto from = _peer;
auto from = _history;
auto offsetId = 0;
auto offset = 0;
auto loadCount = kMessagesPerPage;
if (_delayedShowAtMsgId == ShowAtUnreadMsgId) {
if (const auto around = _migrated ? _migrated->loadAroundId() : 0) {
from = _migrated->peer;
from = _migrated;
offset = -loadCount / 2;
offsetId = around;
} else if (const auto around = _history->loadAroundId()) {
@ -2689,7 +2734,7 @@ void HistoryWidget::delayedShowAt(MsgId showAtMsgId) {
offsetId = _delayedShowAtMsgId;
} else if (_delayedShowAtMsgId < 0 && _history->isChannel()) {
if (_delayedShowAtMsgId < 0 && -_delayedShowAtMsgId < ServerMaxMsgId && _migrated) {
from = _migrated->peer;
from = _migrated;
offset = -loadCount / 2;
offsetId = -_delayedShowAtMsgId;
}
@ -2699,18 +2744,27 @@ void HistoryWidget::delayedShowAt(MsgId showAtMsgId) {
auto minId = 0;
auto historyHash = 0;
_delayedShowAtRequest = MTP::send(
MTPmessages_GetHistory(
from->input,
const auto history = from;
const auto type = Data::Histories::RequestType::History;
auto &histories = history->owner().histories();
_delayedShowAtRequest = histories.sendRequest(history, type, [=](Fn<void()> finish) {
return history->session().api().request(MTPmessages_GetHistory(
history->peer->input,
MTP_int(offsetId),
MTP_int(offsetDate),
MTP_int(offset),
MTP_int(loadCount),
MTP_int(maxId),
MTP_int(minId),
MTP_int(historyHash)),
rpcDone(&HistoryWidget::messagesReceived, from),
rpcFail(&HistoryWidget::messagesFailed));
MTP_int(historyHash)
)).done([=](const MTPmessages_Messages &result) {
messagesReceived(history->peer, result, _delayedShowAtRequest);
finish();
}).fail([=](const RPCError &error) {
messagesFailed(error, _delayedShowAtRequest);
finish();
}).send();
});
}
void HistoryWidget::onScroll() {
@ -2884,7 +2938,8 @@ void HistoryWidget::saveEditMsg() {
sendFlags |= MTPmessages_EditMessage::Flag::f_entities;
}
_saveEditMsgRequestId = MTP::send(
const auto history = _history;
_saveEditMsgRequestId = history->session().api().request(
MTPmessages_EditMessage(
MTP_flags(sendFlags),
_history->peer->input,
@ -2893,9 +2948,12 @@ void HistoryWidget::saveEditMsg() {
MTPInputMedia(),
MTPReplyMarkup(),
sentEntities,
MTP_int(0)), // schedule_date
rpcDone(&HistoryWidget::saveEditMsgDone, _history),
rpcFail(&HistoryWidget::saveEditMsgFail, _history));
MTP_int(0)
)).done([=](const MTPUpdates &result, mtpRequestId requestId) {
saveEditMsgDone(history, result, requestId);
}).fail([=](const RPCError &error, mtpRequestId requestId) {
saveEditMsgFail(history, error, requestId);
}).send();
}
void HistoryWidget::saveEditMsgDone(History *history, const MTPUpdates &updates, mtpRequestId req) {
@ -2913,7 +2971,9 @@ void HistoryWidget::saveEditMsgDone(History *history, const MTPUpdates &updates,
}
bool HistoryWidget::saveEditMsgFail(History *history, const RPCError &error, mtpRequestId req) {
if (MTP::isDefaultHandledError(error)) return false;
if (MTP::isDefaultHandledError(error)) {
return false;
}
if (req == _saveEditMsgRequestId) {
_saveEditMsgRequestId = 0;
}
@ -3733,7 +3793,9 @@ void HistoryWidget::inlineBotResolveDone(
}
bool HistoryWidget::inlineBotResolveFail(QString name, const RPCError &error) {
if (MTP::isDefaultHandledError(error)) return false;
if (MTP::isDefaultHandledError(error)) {
return false;
}
_inlineBotResolveRequestId = 0;
// Notify::inlineBotRequesting(false);
@ -6085,7 +6147,7 @@ void HistoryWidget::cancelEdit() {
applyDraft();
if (_saveEditMsgRequestId) {
MTP::cancel(_saveEditMsgRequestId);
_history->session().api().request(_saveEditMsgRequestId).cancel();
_saveEditMsgRequestId = 0;
}
@ -6970,5 +7032,6 @@ void HistoryWidget::synteticScrollToY(int y) {
}
HistoryWidget::~HistoryWidget() {
clearAllLoadRequests();
setTabbedPanel(nullptr);
}

View file

@ -105,7 +105,6 @@ public:
void start();
void messagesReceived(PeerData *peer, const MTPmessages_Messages &messages, mtpRequestId requestId);
void historyLoaded();
void windowShown();
@ -569,7 +568,8 @@ private:
void checkPreview();
void requestPreview();
void gotPreview(QString links, const MTPMessageMedia &media, mtpRequestId req);
bool messagesFailed(const RPCError &error, mtpRequestId requestId);
void messagesReceived(PeerData *peer, const MTPmessages_Messages &messages, int requestId);
bool messagesFailed(const RPCError &error, int requestId);
void addMessagesToFront(PeerData *peer, const QVector<MTPMessage> &messages);
void addMessagesToBack(PeerData *peer, const QVector<MTPMessage> &messages);
@ -681,12 +681,12 @@ private:
bool _canSendMessages = false;
MsgId _showAtMsgId = ShowAtUnreadMsgId;
mtpRequestId _firstLoadRequest = 0;
mtpRequestId _preloadRequest = 0;
mtpRequestId _preloadDownRequest = 0;
int _firstLoadRequest = 0; // Not real mtpRequestId.
int _preloadRequest = 0; // Not real mtpRequestId.
int _preloadDownRequest = 0; // Not real mtpRequestId.
MsgId _delayedShowAtMsgId = -1;
mtpRequestId _delayedShowAtRequest = 0;
int _delayedShowAtRequest = 0; // Not real mtpRequestId.
object_ptr<HistoryView::TopBarWidget> _topBar;
object_ptr<Ui::ScrollArea> _scroll;