Analyze fatal errors during preprocess

This commit is contained in:
Andrea Cavalli 2021-01-10 02:28:23 +01:00
parent 94ae49ea83
commit 261cc30abf
2 changed files with 29 additions and 10 deletions

View File

@ -1,5 +1,5 @@
package it.tdlight.tdlibsession; package it.tdlight.tdlibsession;
public enum FatalErrorType { public enum FatalErrorType {
ACCESS_TOKEN_INVALID, PHONE_NUMBER_INVALID, CONNECTION_KILLED, INVALID_UPDATE ACCESS_TOKEN_INVALID, PHONE_NUMBER_INVALID, CONNECTION_KILLED, INVALID_UPDATE, PHONE_NUMBER_BANNED
} }

View File

@ -329,6 +329,21 @@ public class AsyncTdEasy {
case "PASSWORD_HASH_INVALID": case "PASSWORD_HASH_INVALID":
globalErrors.onNext(error); globalErrors.onNext(error);
return Mono.just(new UpdateAuthorizationState(new AuthorizationStateWaitPassword())); return Mono.just(new UpdateAuthorizationState(new AuthorizationStateWaitPassword()));
default:
globalErrors.onNext(error);
break;
}
analyzeFatalErrors(error);
return Mono.empty();
} else {
return Mono.just((Update) obj);
}
}
private void analyzeFatalErrors(Object obj) {
if (obj != null && obj.getConstructor() == Error.CONSTRUCTOR) {
var error = (Error) obj;
switch (error.message) {
case "PHONE_NUMBER_INVALID": case "PHONE_NUMBER_INVALID":
fatalErrors.onNext(FatalErrorType.PHONE_NUMBER_INVALID); fatalErrors.onNext(FatalErrorType.PHONE_NUMBER_INVALID);
break; break;
@ -341,13 +356,10 @@ public class AsyncTdEasy {
case "INVALID_UPDATE": case "INVALID_UPDATE":
fatalErrors.onNext(FatalErrorType.INVALID_UPDATE); fatalErrors.onNext(FatalErrorType.INVALID_UPDATE);
break; break;
default: case "PHONE_NUMBER_BANNED":
globalErrors.onNext(error); fatalErrors.onNext(FatalErrorType.PHONE_NUMBER_BANNED);
break; break;
} }
return Mono.empty();
} else {
return Mono.just((Update) obj);
} }
} }
@ -364,7 +376,7 @@ public class AsyncTdEasy {
.flatMap(obj -> { .flatMap(obj -> {
switch (obj.getConstructor()) { switch (obj.getConstructor()) {
case AuthorizationStateWaitTdlibParameters.CONSTRUCTOR: case AuthorizationStateWaitTdlibParameters.CONSTRUCTOR:
return MonoUtils.thenOrError(Mono.from(this.settings).map(settings -> { return thenOrFatalError(Mono.from(this.settings).map(settings -> {
var parameters = new TdlibParameters(); var parameters = new TdlibParameters();
parameters.useTestDc = settings.useTestDc; parameters.useTestDc = settings.useTestDc;
parameters.databaseDirectory = settings.databaseDirectory; parameters.databaseDirectory = settings.databaseDirectory;
@ -384,14 +396,13 @@ public class AsyncTdEasy {
return new SetTdlibParameters(parameters); return new SetTdlibParameters(parameters);
}).flatMap((SetTdlibParameters obj1) -> sendDirectly(obj1, false))); }).flatMap((SetTdlibParameters obj1) -> sendDirectly(obj1, false)));
case AuthorizationStateWaitEncryptionKey.CONSTRUCTOR: case AuthorizationStateWaitEncryptionKey.CONSTRUCTOR:
return MonoUtils return thenOrFatalError(sendDirectly(new CheckDatabaseEncryptionKey(), false))
.thenOrError(sendDirectly(new CheckDatabaseEncryptionKey(), false))
.onErrorResume((error) -> { .onErrorResume((error) -> {
logger.error("Error while checking TDLib encryption key", error); logger.error("Error while checking TDLib encryption key", error);
return sendDirectly(new TdApi.Close(), false).then(); return sendDirectly(new TdApi.Close(), false).then();
}); });
case AuthorizationStateWaitPhoneNumber.CONSTRUCTOR: case AuthorizationStateWaitPhoneNumber.CONSTRUCTOR:
return MonoUtils.thenOrError(Mono.from(this.settings).flatMap(settings -> { return thenOrFatalError(Mono.from(this.settings).flatMap(settings -> {
if (settings.isPhoneNumberSet()) { if (settings.isPhoneNumberSet()) {
return sendDirectly(new SetAuthenticationPhoneNumber(String.valueOf(settings.getPhoneNumber()), return sendDirectly(new SetAuthenticationPhoneNumber(String.valueOf(settings.getPhoneNumber()),
new PhoneNumberAuthenticationSettings(false, false, false) new PhoneNumberAuthenticationSettings(false, false, false)
@ -520,4 +531,12 @@ public class AsyncTdEasy {
}) })
.then(Mono.justOrEmpty(updateObj.getConstructor() == Error.CONSTRUCTOR ? null : (Update) updateObj)); .then(Mono.justOrEmpty(updateObj.getConstructor() == Error.CONSTRUCTOR ? null : (Update) updateObj));
} }
public <T extends TdApi.Object> Mono<Void> thenOrFatalError(Mono<TdResult<T>> optionalMono) {
return MonoUtils.thenOrError(optionalMono.doOnNext(result -> {
if (result.failed()) {
analyzeFatalErrors(result.cause());
}
}));
}
} }