Handle DataCenterMigration exceptions in all methods exposed by TelegramClient

This handles the data center migration in more cases.
Fixes bugs like mentioned in #599.
This commit is contained in:
Robert Massa 2017-11-07 16:34:40 +01:00 committed by Andres G. Aragoneses
parent 0015cf494b
commit 3ba3ea53fd

View file

@ -95,6 +95,24 @@ namespace TLSharp.Core
await ConnectAsync(true); await ConnectAsync(true);
} }
private async Task RequestWithDcMigration(TLMethod request)
{
var completed = false;
while(!completed)
{
try
{
await _sender.Send(request);
await _sender.Receive(request);
completed = true;
}
catch(DataCenterMigrationException e)
{
await ReconnectToDcAsync(e.DC);
}
}
}
public bool IsUserAuthorized() public bool IsUserAuthorized()
{ {
return _session.TLUser != null; return _session.TLUser != null;
@ -109,20 +127,9 @@ namespace TLSharp.Core
throw new InvalidOperationException("Not connected!"); throw new InvalidOperationException("Not connected!");
var authCheckPhoneRequest = new TLRequestCheckPhone() { phone_number = phoneNumber }; var authCheckPhoneRequest = new TLRequestCheckPhone() { phone_number = phoneNumber };
var completed = false;
while(!completed) await RequestWithDcMigration(authCheckPhoneRequest);
{
try
{
await _sender.Send(authCheckPhoneRequest);
await _sender.Receive(authCheckPhoneRequest);
completed = true;
}
catch(PhoneMigrationException e)
{
await ReconnectToDcAsync(e.DC);
}
}
return authCheckPhoneRequest.Response.phone_registered; return authCheckPhoneRequest.Response.phone_registered;
} }
@ -131,25 +138,9 @@ namespace TLSharp.Core
if (String.IsNullOrWhiteSpace(phoneNumber)) if (String.IsNullOrWhiteSpace(phoneNumber))
throw new ArgumentNullException(nameof(phoneNumber)); throw new ArgumentNullException(nameof(phoneNumber));
var completed = false; var request = new TLRequestSendCode() { phone_number = phoneNumber, api_id = _apiId, api_hash = _apiHash };
TLRequestSendCode request = null; await RequestWithDcMigration(request);
while (!completed)
{
request = new TLRequestSendCode() { phone_number = phoneNumber, api_id = _apiId, api_hash = _apiHash };
try
{
await _sender.Send(request);
await _sender.Receive(request);
completed = true;
}
catch (DataCenterMigrationException ex)
{
await ReconnectToDcAsync(ex.DC);
}
}
return request.Response.phone_code_hash; return request.Response.phone_code_hash;
} }
@ -167,32 +158,18 @@ namespace TLSharp.Core
var request = new TLRequestSignIn() { phone_number = phoneNumber, phone_code_hash = phoneCodeHash, phone_code = code }; var request = new TLRequestSignIn() { phone_number = phoneNumber, phone_code_hash = phoneCodeHash, phone_code = code };
var completed = false; await RequestWithDcMigration(request);
while (!completed)
{
try
{
await _sender.Send(request);
await _sender.Receive(request);
completed = true;
}
catch (PhoneMigrationException e)
{
await ReconnectToDcAsync(e.DC);
}
}
OnUserAuthenticated(((TLUser)request.Response.user)); OnUserAuthenticated(((TLUser)request.Response.user));
return ((TLUser)request.Response.user); return ((TLUser)request.Response.user);
} }
public async Task<TLPassword> GetPasswordSetting() public async Task<TLPassword> GetPasswordSetting()
{ {
var request = new TLRequestGetPassword(); var request = new TLRequestGetPassword();
await _sender.Send(request); await RequestWithDcMigration(request);
await _sender.Receive(request);
return ((TLPassword)request.Response); return ((TLPassword)request.Response);
} }
@ -207,8 +184,8 @@ namespace TLSharp.Core
var password_hash = hashstring.ComputeHash(rv.ToArray()); var password_hash = hashstring.ComputeHash(rv.ToArray());
var request = new TLRequestCheckPassword() { password_hash = password_hash }; var request = new TLRequestCheckPassword() { password_hash = password_hash };
await _sender.Send(request);
await _sender.Receive(request); await RequestWithDcMigration(request);
OnUserAuthenticated(((TLUser)request.Response.user)); OnUserAuthenticated(((TLUser)request.Response.user));
@ -218,8 +195,8 @@ namespace TLSharp.Core
public async Task<TLUser> SignUpAsync(string phoneNumber, string phoneCodeHash, string code, string firstName, string lastName) public async Task<TLUser> SignUpAsync(string phoneNumber, string phoneCodeHash, string code, string firstName, string lastName)
{ {
var request = new TLRequestSignUp() { phone_number = phoneNumber, phone_code = code, phone_code_hash = phoneCodeHash, first_name = firstName, last_name = lastName }; var request = new TLRequestSignUp() { phone_number = phoneNumber, phone_code = code, phone_code_hash = phoneCodeHash, first_name = firstName, last_name = lastName };
await _sender.Send(request);
await _sender.Receive(request); await RequestWithDcMigration(request);
OnUserAuthenticated(((TLUser)request.Response.user)); OnUserAuthenticated(((TLUser)request.Response.user));
@ -227,8 +204,7 @@ namespace TLSharp.Core
} }
public async Task<T> SendRequestAsync<T>(TLMethod methodToExecute) public async Task<T> SendRequestAsync<T>(TLMethod methodToExecute)
{ {
await _sender.Send(methodToExecute); await RequestWithDcMigration(methodToExecute);
await _sender.Receive(methodToExecute);
var result = methodToExecute.GetType().GetProperty("Response").GetValue(methodToExecute); var result = methodToExecute.GetType().GetProperty("Response").GetValue(methodToExecute);