Use MTP::Sender in Intro.

This commit is contained in:
John Preston 2020-06-11 17:07:14 +04:00
parent 0b028b959b
commit 7f09da9e32
15 changed files with 166 additions and 162 deletions

View file

@ -410,12 +410,12 @@ bool Call::handleUpdate(const MTPPhoneCall &call) {
? _controller->getDebugInfo() ? _controller->getDebugInfo()
: std::string(); : std::string();
if (!debugLog.empty()) { if (!debugLog.empty()) {
MTP::send( user()->session().api().request(MTPphone_SaveCallDebug(
MTPphone_SaveCallDebug( MTP_inputPhoneCall(
MTP_inputPhoneCall( MTP_long(_id),
MTP_long(_id), MTP_long(_accessHash)),
MTP_long(_accessHash)), MTP_dataJSON(MTP_string(debugLog))
MTP_dataJSON(MTP_string(debugLog)))); )).send();
} }
} }
if (data.is_need_rating() && _id && _accessHash) { if (data.is_need_rating() && _id && _accessHash) {

View file

@ -15,6 +15,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/widgets/labels.h" #include "ui/widgets/labels.h"
#include "ui/text/text_utilities.h" #include "ui/text/text_utilities.h"
#include "boxes/confirm_box.h" #include "boxes/confirm_box.h"
#include "main/main_account.h"
#include "mtproto/mtp_instance.h"
#include "app.h" #include "app.h"
#include "styles/style_intro.h" #include "styles/style_intro.h"
@ -201,7 +203,7 @@ void CodeWidget::finished() {
Step::finished(); Step::finished();
_checkRequestTimer.cancel(); _checkRequestTimer.cancel();
_callTimer.cancel(); _callTimer.cancel();
rpcInvalidate(); apiClear();
cancelled(); cancelled();
_sentCode.clear(); _sentCode.clear();
@ -209,9 +211,12 @@ void CodeWidget::finished() {
} }
void CodeWidget::cancelled() { void CodeWidget::cancelled() {
MTP::cancel(base::take(_sentRequest)); api()->request(base::take(_sentRequest)).cancel();
MTP::cancel(base::take(_callRequestId)); api()->request(base::take(_callRequestId)).cancel();
MTP::send(MTPauth_CancelCode(MTP_string(getData()->phone), MTP_bytes(getData()->phoneHash))); api()->request(MTPauth_CancelCode(
MTP_string(getData()->phone),
MTP_bytes(getData()->phoneHash)
)).send();
} }
void CodeWidget::stopCheck() { void CodeWidget::stopCheck() {
@ -219,12 +224,12 @@ void CodeWidget::stopCheck() {
} }
void CodeWidget::checkRequest() { void CodeWidget::checkRequest() {
auto status = MTP::state(_sentRequest); auto status = api()->instance()->state(_sentRequest);
if (status < 0) { if (status < 0) {
auto leftms = -status; auto leftms = -status;
if (leftms >= 1000) { if (leftms >= 1000) {
if (_sentRequest) { if (_sentRequest) {
MTP::cancel(base::take(_sentRequest)); api()->request(base::take(_sentRequest)).cancel();
_sentCode.clear(); _sentCode.clear();
} }
} }
@ -259,14 +264,13 @@ void CodeWidget::codeSubmitDone(const MTPauth_Authorization &result) {
}); });
} }
bool CodeWidget::codeSubmitFail(const RPCError &error) { void CodeWidget::codeSubmitFail(const RPCError &error) {
if (MTP::isFloodError(error)) { if (MTP::isFloodError(error)) {
stopCheck(); stopCheck();
_sentRequest = 0; _sentRequest = 0;
showCodeError(tr::lng_flood_error()); showCodeError(tr::lng_flood_error());
return true; return;
} }
if (MTP::isDefaultHandledError(error)) return false;
stopCheck(); stopCheck();
_sentRequest = 0; _sentRequest = 0;
@ -275,24 +279,21 @@ bool CodeWidget::codeSubmitFail(const RPCError &error) {
|| err == qstr("PHONE_CODE_EXPIRED") || err == qstr("PHONE_CODE_EXPIRED")
|| err == qstr("PHONE_NUMBER_BANNED")) { // show error || err == qstr("PHONE_NUMBER_BANNED")) { // show error
goBack(); goBack();
return true;
} else if (err == qstr("PHONE_CODE_EMPTY") || err == qstr("PHONE_CODE_INVALID")) { } else if (err == qstr("PHONE_CODE_EMPTY") || err == qstr("PHONE_CODE_INVALID")) {
showCodeError(tr::lng_bad_code()); showCodeError(tr::lng_bad_code());
return true;
} else if (err == qstr("SESSION_PASSWORD_NEEDED")) { } else if (err == qstr("SESSION_PASSWORD_NEEDED")) {
_checkRequestTimer.callEach(1000); _checkRequestTimer.callEach(1000);
_sentRequest = MTP::send( _sentRequest = api()->request(MTPaccount_GetPassword(
MTPaccount_GetPassword(), )).done([=](const MTPaccount_Password &result) {
rpcDone(&CodeWidget::gotPassword), gotPassword(result);
rpcFail(&CodeWidget::codeSubmitFail)); }).fail([=](const RPCError &error) {
return true; codeSubmitFail(error);
} }).handleFloodErrors().send();
if (Logs::DebugEnabled()) { // internal server error } else if (Logs::DebugEnabled()) { // internal server error
showCodeError(rpl::single(err + ": " + error.description())); showCodeError(rpl::single(err + ": " + error.description()));
} else { } else {
showCodeError(rpl::single(Lang::Hard::ServerError())); showCodeError(rpl::single(Lang::Hard::ServerError()));
} }
return false;
} }
void CodeWidget::codeChanged() { void CodeWidget::codeChanged() {
@ -305,11 +306,12 @@ void CodeWidget::sendCall() {
if (--_callTimeout <= 0) { if (--_callTimeout <= 0) {
_callStatus = CallStatus::Calling; _callStatus = CallStatus::Calling;
_callTimer.cancel(); _callTimer.cancel();
_callRequestId = MTP::send( _callRequestId = api()->request(MTPauth_ResendCode(
MTPauth_ResendCode( MTP_string(getData()->phone),
MTP_string(getData()->phone), MTP_bytes(getData()->phoneHash)
MTP_bytes(getData()->phoneHash)), )).done([=](const MTPauth_SentCode &result) {
rpcDone(&CodeWidget::callDone)); callDone(result);
}).send();
} else { } else {
getData()->callStatus = _callStatus; getData()->callStatus = _callStatus;
getData()->callTimeout = _callTimeout; getData()->callTimeout = _callTimeout;
@ -382,25 +384,29 @@ void CodeWidget::submit() {
getData()->hasRecovery = false; getData()->hasRecovery = false;
getData()->pwdHint = QString(); getData()->pwdHint = QString();
getData()->pwdNotEmptyPassport = false; getData()->pwdNotEmptyPassport = false;
_sentRequest = MTP::send( _sentRequest = api()->request(MTPauth_SignIn(
MTPauth_SignIn( MTP_string(getData()->phone),
MTP_string(getData()->phone), MTP_bytes(getData()->phoneHash),
MTP_bytes(getData()->phoneHash), MTP_string(_sentCode)
MTP_string(_sentCode)), )).done([=](const MTPauth_Authorization &result) {
rpcDone(&CodeWidget::codeSubmitDone), codeSubmitDone(result);
rpcFail(&CodeWidget::codeSubmitFail)); }).fail([=](const RPCError &error) {
codeSubmitFail(error);
}).handleFloodErrors().send();
} }
void CodeWidget::noTelegramCode() { void CodeWidget::noTelegramCode() {
if (_noTelegramCodeRequestId) { if (_noTelegramCodeRequestId) {
return; return;
} }
_noTelegramCodeRequestId = MTP::send( _noTelegramCodeRequestId = api()->request(MTPauth_ResendCode(
MTPauth_ResendCode( MTP_string(getData()->phone),
MTP_string(getData()->phone), MTP_bytes(getData()->phoneHash)
MTP_bytes(getData()->phoneHash)), )).done([=](const MTPauth_SentCode &result) {
rpcDone(&CodeWidget::noTelegramCodeDone), noTelegramCodeDone(result);
rpcFail(&CodeWidget::noTelegramCodeFail)); }).fail([=](const RPCError &error) {
noTelegramCodeFail(error);
}).handleFloodErrors().send();
} }
void CodeWidget::noTelegramCodeDone(const MTPauth_SentCode &result) { void CodeWidget::noTelegramCodeDone(const MTPauth_SentCode &result) {
@ -426,14 +432,11 @@ void CodeWidget::noTelegramCodeDone(const MTPauth_SentCode &result) {
updateDescText(); updateDescText();
} }
bool CodeWidget::noTelegramCodeFail(const RPCError &error) { void CodeWidget::noTelegramCodeFail(const RPCError &error) {
if (MTP::isFloodError(error)) { if (MTP::isFloodError(error)) {
_noTelegramCodeRequestId = 0; _noTelegramCodeRequestId = 0;
showCodeError(tr::lng_flood_error()); showCodeError(tr::lng_flood_error());
return true; return;
}
if (MTP::isDefaultHandledError(error)) {
return false;
} }
_noTelegramCodeRequestId = 0; _noTelegramCodeRequestId = 0;
@ -442,7 +445,6 @@ bool CodeWidget::noTelegramCodeFail(const RPCError &error) {
} else { } else {
showCodeError(rpl::single(Lang::Hard::ServerError())); showCodeError(rpl::single(Lang::Hard::ServerError()));
} }
return false;
} }
} // namespace details } // namespace details

View file

@ -74,14 +74,14 @@ private:
void updateControlsGeometry(); void updateControlsGeometry();
void codeSubmitDone(const MTPauth_Authorization &result); void codeSubmitDone(const MTPauth_Authorization &result);
bool codeSubmitFail(const RPCError &error); void codeSubmitFail(const RPCError &error);
void showCodeError(rpl::producer<QString> text); void showCodeError(rpl::producer<QString> text);
void callDone(const MTPauth_SentCode &v); void callDone(const MTPauth_SentCode &v);
void gotPassword(const MTPaccount_Password &result); void gotPassword(const MTPaccount_Password &result);
void noTelegramCodeDone(const MTPauth_SentCode &result); void noTelegramCodeDone(const MTPauth_SentCode &result);
bool noTelegramCodeFail(const RPCError &result); void noTelegramCodeFail(const RPCError &result);
void stopCheck(); void stopCheck();

View file

@ -29,7 +29,6 @@ PasswordCheckWidget::PasswordCheckWidget(
not_null<Main::Account*> account, not_null<Main::Account*> account,
not_null<Data*> data) not_null<Data*> data)
: Step(parent, account, data) : Step(parent, account, data)
, _api(account->mtp())
, _request(getData()->pwdRequest) , _request(getData()->pwdRequest)
, _hasRecovery(getData()->hasRecovery) , _hasRecovery(getData()->hasRecovery)
, _notEmptyPassport(getData()->pwdNotEmptyPassport) , _notEmptyPassport(getData()->pwdNotEmptyPassport)
@ -115,7 +114,7 @@ void PasswordCheckWidget::activate() {
} }
void PasswordCheckWidget::cancelled() { void PasswordCheckWidget::cancelled() {
_api.request(base::take(_sentRequest)).cancel(); api()->request(base::take(_sentRequest)).cancel();
} }
void PasswordCheckWidget::pwdSubmitDone(bool recover, const MTPauth_Authorization &result) { void PasswordCheckWidget::pwdSubmitDone(bool recover, const MTPauth_Authorization &result) {
@ -182,8 +181,8 @@ void PasswordCheckWidget::checkPasswordHash() {
} }
void PasswordCheckWidget::requestPasswordData() { void PasswordCheckWidget::requestPasswordData() {
_api.request(base::take(_sentRequest)).cancel(); api()->request(base::take(_sentRequest)).cancel();
_sentRequest = _api.request( _sentRequest = api()->request(
MTPaccount_GetPassword() MTPaccount_GetPassword()
).done([=](const MTPaccount_Password &result) { ).done([=](const MTPaccount_Password &result) {
_sentRequest = 0; _sentRequest = 0;
@ -205,13 +204,13 @@ void PasswordCheckWidget::passwordChecked() {
return serverError(); return serverError();
} }
_request.id = 0; _request.id = 0;
_sentRequest = _api.request( _sentRequest = api()->request(
MTPauth_CheckPassword(check.result) MTPauth_CheckPassword(check.result)
).done([=](const MTPauth_Authorization &result) { ).done([=](const MTPauth_Authorization &result) {
pwdSubmitDone(false, result); pwdSubmitDone(false, result);
}).handleFloodErrors().fail([=](const RPCError &error) { }).fail([=](const RPCError &error) {
pwdSubmitFail(error); pwdSubmitFail(error);
}).send(); }).handleFloodErrors().send();
} }
void PasswordCheckWidget::serverError() { void PasswordCheckWidget::serverError() {
@ -267,7 +266,7 @@ void PasswordCheckWidget::recoverStartFail(const RPCError &error) {
void PasswordCheckWidget::toRecover() { void PasswordCheckWidget::toRecover() {
if (_hasRecovery) { if (_hasRecovery) {
if (_sentRequest) { if (_sentRequest) {
_api.request(base::take(_sentRequest)).cancel(); api()->request(base::take(_sentRequest)).cancel();
} }
hideError(); hideError();
_toRecover->hide(); _toRecover->hide();
@ -279,7 +278,7 @@ void PasswordCheckWidget::toRecover() {
_codeField->setFocus(); _codeField->setFocus();
updateDescriptionText(); updateDescriptionText();
if (_emailPattern.isEmpty()) { if (_emailPattern.isEmpty()) {
_api.request( api()->request(
MTPauth_RequestPasswordRecovery() MTPauth_RequestPasswordRecovery()
).done([=](const MTPauth_PasswordRecovery &result) { ).done([=](const MTPauth_PasswordRecovery &result) {
recoverStarted(result); recoverStarted(result);
@ -302,7 +301,7 @@ void PasswordCheckWidget::toPassword() {
void PasswordCheckWidget::showReset() { void PasswordCheckWidget::showReset() {
if (_sentRequest) { if (_sentRequest) {
_api.request(base::take(_sentRequest)).cancel(); api()->request(base::take(_sentRequest)).cancel();
} }
_toRecover->show(); _toRecover->show();
_toPassword->hide(); _toPassword->hide();
@ -335,13 +334,13 @@ void PasswordCheckWidget::submit() {
return; return;
} }
const auto send = crl::guard(this, [=] { const auto send = crl::guard(this, [=] {
_sentRequest = _api.request( _sentRequest = api()->request(
MTPauth_RecoverPassword(MTP_string(code)) MTPauth_RecoverPassword(MTP_string(code))
).done([=](const MTPauth_Authorization &result) { ).done([=](const MTPauth_Authorization &result) {
pwdSubmitDone(true, result); pwdSubmitDone(true, result);
}).handleFloodErrors().fail([=](const RPCError &error) { }).fail([=](const RPCError &error) {
codeSubmitFail(error); codeSubmitFail(error);
}).send(); }).handleFloodErrors().send();
}); });
if (_notEmptyPassport) { if (_notEmptyPassport) {

View file

@ -62,7 +62,6 @@ private:
void passwordChecked(); void passwordChecked();
void serverError(); void serverError();
MTP::Sender _api;
Core::CloudPasswordCheckRequest _request; Core::CloudPasswordCheckRequest _request;
crl::time _lastSrpIdInvalidTime = 0; crl::time _lastSrpIdInvalidTime = 0;
bytes::vector _passwordHash; bytes::vector _passwordHash;

View file

@ -141,15 +141,17 @@ void PhoneWidget::submit() {
_checkRequestTimer.callEach(1000); _checkRequestTimer.callEach(1000);
_sentPhone = phone; _sentPhone = phone;
account().mtp()->setUserPhone(_sentPhone); api()->instance()->setUserPhone(_sentPhone);
_sentRequest = MTP::send( _sentRequest = api()->request(MTPauth_SendCode(
MTPauth_SendCode( MTP_string(_sentPhone),
MTP_string(_sentPhone), MTP_int(ApiId),
MTP_int(ApiId), MTP_string(ApiHash),
MTP_string(ApiHash), MTP_codeSettings(MTP_flags(0))
MTP_codeSettings(MTP_flags(0))), )).done([=](const MTPauth_SentCode &result) {
rpcDone(&PhoneWidget::phoneSubmitDone), phoneSubmitDone(result);
rpcFail(&PhoneWidget::phoneSubmitFail)); }).fail([=](const RPCError &error) {
phoneSubmitFail(error);
}).handleFloodErrors().send();
} }
void PhoneWidget::stopCheck() { void PhoneWidget::stopCheck() {
@ -157,11 +159,11 @@ void PhoneWidget::stopCheck() {
} }
void PhoneWidget::checkRequest() { void PhoneWidget::checkRequest() {
auto status = MTP::state(_sentRequest); auto status = api()->instance()->state(_sentRequest);
if (status < 0) { if (status < 0) {
auto leftms = -status; auto leftms = -status;
if (leftms >= 1000) { if (leftms >= 1000) {
MTP::cancel(base::take(_sentRequest)); api()->request(base::take(_sentRequest)).cancel();
} }
} }
if (!_sentRequest && status == MTP::RequestSent) { if (!_sentRequest && status == MTP::RequestSent) {
@ -193,34 +195,28 @@ void PhoneWidget::phoneSubmitDone(const MTPauth_SentCode &result) {
goNext<CodeWidget>(); goNext<CodeWidget>();
} }
bool PhoneWidget::phoneSubmitFail(const RPCError &error) { void PhoneWidget::phoneSubmitFail(const RPCError &error) {
if (MTP::isFloodError(error)) { if (MTP::isFloodError(error)) {
stopCheck(); stopCheck();
_sentRequest = 0; _sentRequest = 0;
showPhoneError(tr::lng_flood_error()); showPhoneError(tr::lng_flood_error());
return true; return;
} }
if (MTP::isDefaultHandledError(error)) return false;
stopCheck(); stopCheck();
_sentRequest = 0; _sentRequest = 0;
auto &err = error.type(); auto &err = error.type();
if (err == qstr("PHONE_NUMBER_FLOOD")) { if (err == qstr("PHONE_NUMBER_FLOOD")) {
Ui::show(Box<InformBox>(tr::lng_error_phone_flood(tr::now))); Ui::show(Box<InformBox>(tr::lng_error_phone_flood(tr::now)));
return true;
} else if (err == qstr("PHONE_NUMBER_INVALID")) { // show error } else if (err == qstr("PHONE_NUMBER_INVALID")) { // show error
showPhoneError(tr::lng_bad_phone()); showPhoneError(tr::lng_bad_phone());
return true;
} else if (err == qstr("PHONE_NUMBER_BANNED")) { } else if (err == qstr("PHONE_NUMBER_BANNED")) {
ShowPhoneBannedError(_sentPhone); ShowPhoneBannedError(_sentPhone);
return true; } else if (Logs::DebugEnabled()) { // internal server error
}
if (Logs::DebugEnabled()) { // internal server error
showPhoneError(rpl::single(err + ": " + error.description())); showPhoneError(rpl::single(err + ": " + error.description()));
} else { } else {
showPhoneError(rpl::single(Lang::Hard::ServerError())); showPhoneError(rpl::single(Lang::Hard::ServerError()));
} }
return false;
} }
QString PhoneWidget::fullNumber() const { QString PhoneWidget::fullNumber() const {
@ -244,13 +240,13 @@ void PhoneWidget::activate() {
void PhoneWidget::finished() { void PhoneWidget::finished() {
Step::finished(); Step::finished();
_checkRequestTimer.cancel(); _checkRequestTimer.cancel();
rpcInvalidate(); apiClear();
cancelled(); cancelled();
} }
void PhoneWidget::cancelled() { void PhoneWidget::cancelled() {
MTP::cancel(base::take(_sentRequest)); api()->request(base::take(_sentRequest)).cancel();
} }
} // namespace details } // namespace details

View file

@ -50,7 +50,7 @@ private:
void countryChanged(); void countryChanged();
void phoneSubmitDone(const MTPauth_SentCode &result); void phoneSubmitDone(const MTPauth_SentCode &result);
bool phoneSubmitFail(const RPCError &error); void phoneSubmitFail(const RPCError &error);
QString fullNumber() const; QString fullNumber() const;
void stopCheck(); void stopCheck();

View file

@ -174,7 +174,6 @@ QrWidget::QrWidget(
not_null<Main::Account*> account, not_null<Main::Account*> account,
not_null<Data*> data) not_null<Data*> data)
: Step(parent, account, data) : Step(parent, account, data)
, _api(account->mtp())
, _refreshTimer([=] { refreshCode(); }) { , _refreshTimer([=] { refreshCode(); }) {
setTitleText(rpl::single(QString())); setTitleText(rpl::single(QString()));
setDescriptionText(rpl::single(QString())); setDescriptionText(rpl::single(QString()));
@ -309,7 +308,7 @@ void QrWidget::refreshCode() {
if (_requestId) { if (_requestId) {
return; return;
} }
_requestId = _api.request(MTPauth_ExportLoginToken( _requestId = api()->request(MTPauth_ExportLoginToken(
MTP_int(ApiId), MTP_int(ApiId),
MTP_string(ApiHash), MTP_string(ApiHash),
MTP_vector<MTPint>(0) MTP_vector<MTPint>(0)
@ -357,8 +356,8 @@ void QrWidget::showToken(const QByteArray &token) {
void QrWidget::importTo(MTP::DcId dcId, const QByteArray &token) { void QrWidget::importTo(MTP::DcId dcId, const QByteArray &token) {
Expects(_requestId != 0); Expects(_requestId != 0);
_api.instance()->setMainDcId(dcId); api()->instance()->setMainDcId(dcId);
_requestId = _api.request(MTPauth_ImportLoginToken( _requestId = api()->request(MTPauth_ImportLoginToken(
MTP_bytes(token) MTP_bytes(token)
)).done([=](const MTPauth_LoginToken &result) { )).done([=](const MTPauth_LoginToken &result) {
handleTokenResult(result); handleTokenResult(result);
@ -385,7 +384,7 @@ void QrWidget::done(const MTPauth_Authorization &authorization) {
} }
void QrWidget::sendCheckPasswordRequest() { void QrWidget::sendCheckPasswordRequest() {
_requestId = _api.request(MTPaccount_GetPassword( _requestId = api()->request(MTPaccount_GetPassword(
)).done([=](const MTPaccount_Password &result) { )).done([=](const MTPaccount_Password &result) {
result.match([&](const MTPDaccount_password &data) { result.match([&](const MTPDaccount_password &data) {
getData()->pwdRequest = Core::ParseCloudPasswordCheckRequest( getData()->pwdRequest = Core::ParseCloudPasswordCheckRequest(
@ -424,12 +423,12 @@ void QrWidget::activate() {
void QrWidget::finished() { void QrWidget::finished() {
Step::finished(); Step::finished();
_refreshTimer.cancel(); _refreshTimer.cancel();
rpcInvalidate(); apiClear();
cancelled(); cancelled();
} }
void QrWidget::cancelled() { void QrWidget::cancelled() {
_api.request(base::take(_requestId)).cancel(); api()->request(base::take(_requestId)).cancel();
} }
} // namespace details } // namespace details

View file

@ -9,7 +9,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/countryinput.h" #include "ui/countryinput.h"
#include "intro/intro_step.h" #include "intro/intro_step.h"
#include "mtproto/sender.h"
#include "base/timer.h" #include "base/timer.h"
namespace Ui { namespace Ui {
@ -53,7 +52,6 @@ private:
void showToken(const QByteArray &token); void showToken(const QByteArray &token);
void done(const MTPauth_Authorization &authorization); void done(const MTPauth_Authorization &authorization);
MTP::Sender _api;
rpl::event_stream<QByteArray> _qrCodes; rpl::event_stream<QByteArray> _qrCodes;
base::Timer _refreshTimer; base::Timer _refreshTimer;
mtpRequestId _requestId = 0; mtpRequestId _requestId = 0;

View file

@ -101,7 +101,7 @@ void SignupWidget::activate() {
} }
void SignupWidget::cancelled() { void SignupWidget::cancelled() {
MTP::cancel(base::take(_sentRequest)); api()->request(base::take(_sentRequest)).cancel();
} }
void SignupWidget::nameSubmitDone(const MTPauth_Authorization &result) { void SignupWidget::nameSubmitDone(const MTPauth_Authorization &result) {
@ -113,7 +113,7 @@ void SignupWidget::nameSubmitDone(const MTPauth_Authorization &result) {
finish(d.vuser(), _photo->takeResultImage()); finish(d.vuser(), _photo->takeResultImage());
} }
bool SignupWidget::nameSubmitFail(const RPCError &error) { void SignupWidget::nameSubmitFail(const RPCError &error) {
if (MTP::isFloodError(error)) { if (MTP::isFloodError(error)) {
showError(tr::lng_flood_error()); showError(tr::lng_flood_error());
if (_invertOrder) { if (_invertOrder) {
@ -121,14 +121,12 @@ bool SignupWidget::nameSubmitFail(const RPCError &error) {
} else { } else {
_last->setFocus(); _last->setFocus();
} }
return true; return;
} }
if (MTP::isDefaultHandledError(error)) return false;
auto &err = error.type(); auto &err = error.type();
if (err == qstr("PHONE_NUMBER_FLOOD")) { if (err == qstr("PHONE_NUMBER_FLOOD")) {
Ui::show(Box<InformBox>(tr::lng_error_phone_flood(tr::now))); Ui::show(Box<InformBox>(tr::lng_error_phone_flood(tr::now)));
return true;
} else if (err == qstr("PHONE_NUMBER_INVALID") } else if (err == qstr("PHONE_NUMBER_INVALID")
|| err == qstr("PHONE_NUMBER_BANNED") || err == qstr("PHONE_NUMBER_BANNED")
|| err == qstr("PHONE_CODE_EXPIRED") || err == qstr("PHONE_CODE_EXPIRED")
@ -136,27 +134,24 @@ bool SignupWidget::nameSubmitFail(const RPCError &error) {
|| err == qstr("PHONE_CODE_INVALID") || err == qstr("PHONE_CODE_INVALID")
|| err == qstr("PHONE_NUMBER_OCCUPIED")) { || err == qstr("PHONE_NUMBER_OCCUPIED")) {
goBack(); goBack();
return true;
} else if (err == "FIRSTNAME_INVALID") { } else if (err == "FIRSTNAME_INVALID") {
showError(tr::lng_bad_name()); showError(tr::lng_bad_name());
_first->setFocus(); _first->setFocus();
return true;
} else if (err == "LASTNAME_INVALID") { } else if (err == "LASTNAME_INVALID") {
showError(tr::lng_bad_name()); showError(tr::lng_bad_name());
_last->setFocus(); _last->setFocus();
return true;
}
if (Logs::DebugEnabled()) { // internal server error
showError(rpl::single(err + ": " + error.description()));
} else { } else {
showError(rpl::single(Lang::Hard::ServerError())); if (Logs::DebugEnabled()) { // internal server error
showError(rpl::single(err + ": " + error.description()));
} else {
showError(rpl::single(Lang::Hard::ServerError()));
}
if (_invertOrder) {
_last->setFocus();
} else {
_first->setFocus();
}
} }
if (_invertOrder) {
_last->setFocus();
} else {
_first->setFocus();
}
return false;
} }
void SignupWidget::submit() { void SignupWidget::submit() {
@ -186,14 +181,16 @@ void SignupWidget::submit() {
_firstName = _first->getLastText().trimmed(); _firstName = _first->getLastText().trimmed();
_lastName = _last->getLastText().trimmed(); _lastName = _last->getLastText().trimmed();
_sentRequest = MTP::send( _sentRequest = api()->request(MTPauth_SignUp(
MTPauth_SignUp( MTP_string(getData()->phone),
MTP_string(getData()->phone), MTP_bytes(getData()->phoneHash),
MTP_bytes(getData()->phoneHash), MTP_string(_firstName),
MTP_string(_firstName), MTP_string(_lastName)
MTP_string(_lastName)), )).done([=](const MTPauth_Authorization &result) {
rpcDone(&SignupWidget::nameSubmitDone), nameSubmitDone(result);
rpcFail(&SignupWidget::nameSubmitFail)); }).fail([=](const RPCError &error) {
nameSubmitFail(error);
}).handleFloodErrors().send();
}; };
if (_termsAccepted if (_termsAccepted
|| getData()->termsLock.text.text.isEmpty() || getData()->termsLock.text.text.isEmpty()

View file

@ -40,7 +40,7 @@ private:
void updateControlsGeometry(); void updateControlsGeometry();
void nameSubmitDone(const MTPauth_Authorization &result); void nameSubmitDone(const MTPauth_Authorization &result);
bool nameSubmitFail(const RPCError &error); void nameSubmitFail(const RPCError &error);
object_ptr<Ui::UserpicButton> _photo; object_ptr<Ui::UserpicButton> _photo;
object_ptr<Ui::InputField> _first; object_ptr<Ui::InputField> _first;

View file

@ -98,6 +98,17 @@ Step::Step(
Step::~Step() = default; Step::~Step() = default;
not_null<MTP::Sender*> Step::api() const {
if (!_api) {
_api.emplace(_account->mtp());
}
return &*_api;
}
void Step::apiClear() {
_api.reset();
}
rpl::producer<QString> Step::nextButtonText() const { rpl::producer<QString> Step::nextButtonText() const {
return tr::lng_intro_next(); return tr::lng_intro_next();
} }

View file

@ -30,10 +30,7 @@ namespace details {
struct Data; struct Data;
enum class Direction; enum class Direction;
class Step class Step : public Ui::RpWidget, protected base::Subscriber {
: public Ui::RpWidget
, public RPCSender
, protected base::Subscriber {
public: public:
Step( Step(
QWidget *parent, QWidget *parent,
@ -46,6 +43,11 @@ public:
return *_account; return *_account;
} }
// It should not be called in StartWidget, in other steps it should be
// present and not changing.
[[nodiscard]] not_null<MTP::Sender*> api() const;
void apiClear();
virtual void finishInit() { virtual void finishInit() {
} }
virtual void setInnerFocus() { virtual void setInnerFocus() {
@ -167,6 +169,7 @@ private:
const not_null<Main::Account*> _account; const not_null<Main::Account*> _account;
const not_null<Data*> _data; const not_null<Data*> _data;
mutable std::optional<MTP::Sender> _api;
bool _hasCover = false; bool _hasCover = false;
Fn<void(Step *step, Direction direction)> _goCallback; Fn<void(Step *step, Direction direction)> _goCallback;

View file

@ -277,7 +277,7 @@ void Uploader::currentFailed() {
void Uploader::stopSessions() { void Uploader::stopSessions() {
for (int i = 0; i < MTP::kUploadSessionsCount; ++i) { for (int i = 0; i < MTP::kUploadSessionsCount; ++i) {
MTP::stopSession(MTP::uploadDcId(i)); _api->instance()->stopSession(MTP::uploadDcId(i));
} }
} }
@ -440,24 +440,26 @@ void Uploader::sendNext() {
} }
mtpRequestId requestId; mtpRequestId requestId;
if (uploadingData.docSize > kUseBigFilesFrom) { if (uploadingData.docSize > kUseBigFilesFrom) {
requestId = MTP::send( requestId = _api->request(MTPupload_SaveBigFilePart(
MTPupload_SaveBigFilePart( MTP_long(uploadingData.id()),
MTP_long(uploadingData.id()), MTP_int(uploadingData.docSentParts),
MTP_int(uploadingData.docSentParts), MTP_int(uploadingData.docPartsCount),
MTP_int(uploadingData.docPartsCount), MTP_bytes(toSend)
MTP_bytes(toSend)), )).done([=](const MTPBool &result, mtpRequestId requestId) {
rpcDone(&Uploader::partLoaded), partLoaded(result, requestId);
rpcFail(&Uploader::partFailed), }).fail([=](const RPCError &error, mtpRequestId requestId) {
MTP::uploadDcId(todc)); partFailed(error, requestId);
}).toDC(MTP::uploadDcId(todc)).send();
} else { } else {
requestId = MTP::send( requestId = _api->request(MTPupload_SaveFilePart(
MTPupload_SaveFilePart( MTP_long(uploadingData.id()),
MTP_long(uploadingData.id()), MTP_int(uploadingData.docSentParts),
MTP_int(uploadingData.docSentParts), MTP_bytes(toSend)
MTP_bytes(toSend)), )).done([=](const MTPBool &result, mtpRequestId requestId) {
rpcDone(&Uploader::partLoaded), partLoaded(result, requestId);
rpcFail(&Uploader::partFailed), }).fail([=](const RPCError &error, mtpRequestId requestId) {
MTP::uploadDcId(todc)); partFailed(error, requestId);
}).toDC(MTP::uploadDcId(todc)).send();
} }
docRequestsSent.emplace(requestId, uploadingData.docSentParts); docRequestsSent.emplace(requestId, uploadingData.docSentParts);
dcMap.emplace(requestId, todc); dcMap.emplace(requestId, todc);
@ -468,14 +470,15 @@ void Uploader::sendNext() {
} else { } else {
auto part = parts.begin(); auto part = parts.begin();
const auto requestId = MTP::send( const auto requestId = _api->request(MTPupload_SaveFilePart(
MTPupload_SaveFilePart( MTP_long(partsOfId),
MTP_long(partsOfId), MTP_int(part.key()),
MTP_int(part.key()), MTP_bytes(part.value())
MTP_bytes(part.value())), )).done([=](const MTPBool &result, mtpRequestId requestId) {
rpcDone(&Uploader::partLoaded), partLoaded(result, requestId);
rpcFail(&Uploader::partFailed), }).fail([=](const RPCError &error, mtpRequestId requestId) {
MTP::uploadDcId(todc)); partFailed(error, requestId);
}).toDC(MTP::uploadDcId(todc)).send();
requestsSent.emplace(requestId, part.value()); requestsSent.emplace(requestId, part.value());
dcMap.emplace(requestId, todc); dcMap.emplace(requestId, todc);
sentSize += part.value().size(); sentSize += part.value().size();
@ -511,17 +514,17 @@ void Uploader::clear() {
uploaded.clear(); uploaded.clear();
queue.clear(); queue.clear();
for (const auto &requestData : requestsSent) { for (const auto &requestData : requestsSent) {
MTP::cancel(requestData.first); _api->request(requestData.first).cancel();
} }
requestsSent.clear(); requestsSent.clear();
for (const auto &requestData : docRequestsSent) { for (const auto &requestData : docRequestsSent) {
MTP::cancel(requestData.first); _api->request(requestData.first).cancel();
} }
docRequestsSent.clear(); docRequestsSent.clear();
dcMap.clear(); dcMap.clear();
sentSize = 0; sentSize = 0;
for (int i = 0; i < MTP::kUploadSessionsCount; ++i) { for (int i = 0; i < MTP::kUploadSessionsCount; ++i) {
MTP::stopSession(MTP::uploadDcId(i)); _api->instance()->stopSession(MTP::uploadDcId(i));
sentSizes[i] = 0; sentSizes[i] = 0;
} }
stopSessionsTimer.stop(); stopSessionsTimer.stop();
@ -592,16 +595,13 @@ void Uploader::partLoaded(const MTPBool &result, mtpRequestId requestId) {
sendNext(); sendNext();
} }
bool Uploader::partFailed(const RPCError &error, mtpRequestId requestId) { void Uploader::partFailed(const RPCError &error, mtpRequestId requestId) {
if (MTP::isDefaultHandledError(error)) return false;
// failed to upload current file // failed to upload current file
if ((requestsSent.find(requestId) != requestsSent.cend()) if ((requestsSent.find(requestId) != requestsSent.cend())
|| (docRequestsSent.find(requestId) != docRequestsSent.cend())) { || (docRequestsSent.find(requestId) != docRequestsSent.cend())) {
currentFailed(); currentFailed();
} }
sendNext(); sendNext();
return true;
} }
} // namespace Storage } // namespace Storage

View file

@ -119,7 +119,7 @@ private:
struct File; struct File;
void partLoaded(const MTPBool &result, mtpRequestId requestId); void partLoaded(const MTPBool &result, mtpRequestId requestId);
bool partFailed(const RPCError &err, mtpRequestId requestId); void partFailed(const RPCError &error, mtpRequestId requestId);
void currentFailed(); void currentFailed();