tdlib-session-container/src/main/java/it/tdlight/tdlibsession/td/direct/TestClient.java

157 lines
5.0 KiB
Java
Raw Normal View History

2021-01-24 23:08:14 +01:00
package it.tdlight.tdlibsession.td.direct;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import it.tdlight.jni.TdApi;
2021-02-13 17:42:22 +01:00
import it.tdlight.jni.TdApi.AuthorizationStateClosed;
import it.tdlight.jni.TdApi.AuthorizationStateClosing;
2021-02-13 01:36:12 +01:00
import it.tdlight.jni.TdApi.AuthorizationStateReady;
2021-02-13 17:42:22 +01:00
import it.tdlight.jni.TdApi.Close;
2021-02-13 01:36:12 +01:00
import it.tdlight.jni.TdApi.ConnectionStateReady;
import it.tdlight.jni.TdApi.FormattedText;
2021-01-24 23:08:14 +01:00
import it.tdlight.jni.TdApi.Function;
2021-08-01 00:49:12 +02:00
import it.tdlight.jni.TdApi.GetMe;
2021-02-13 01:36:12 +01:00
import it.tdlight.jni.TdApi.Message;
import it.tdlight.jni.TdApi.MessageSenderUser;
import it.tdlight.jni.TdApi.MessageText;
2021-01-24 23:08:14 +01:00
import it.tdlight.jni.TdApi.Ok;
import it.tdlight.jni.TdApi.SetLogTagVerbosityLevel;
import it.tdlight.jni.TdApi.SetLogVerbosityLevel;
import it.tdlight.jni.TdApi.SetOption;
import it.tdlight.jni.TdApi.SetTdlibParameters;
2021-02-13 01:36:12 +01:00
import it.tdlight.jni.TdApi.TextEntity;
2021-01-24 23:08:14 +01:00
import it.tdlight.jni.TdApi.UpdateAuthorizationState;
2021-02-13 01:36:12 +01:00
import it.tdlight.jni.TdApi.UpdateConnectionState;
import it.tdlight.jni.TdApi.UpdateNewMessage;
2021-08-01 00:49:12 +02:00
import it.tdlight.jni.TdApi.User;
2021-02-13 17:42:22 +01:00
import it.tdlight.tdlibsession.td.ReactorTelegramClient;
2021-10-02 16:48:56 +02:00
import java.time.Duration;
2021-01-24 23:08:14 +01:00
import java.util.ArrayList;
2021-02-13 17:42:22 +01:00
import java.util.Iterator;
2021-01-24 23:08:14 +01:00
import java.util.List;
2021-02-13 01:36:12 +01:00
import java.util.concurrent.atomic.AtomicLong;
2021-02-13 17:42:22 +01:00
import org.jetbrains.annotations.Nullable;
2021-02-20 21:25:11 +01:00
import org.warp.commonutils.log.Logger;
import org.warp.commonutils.log.LoggerFactory;
2021-02-13 17:42:22 +01:00
import reactor.core.publisher.Flux;
2021-01-24 23:08:14 +01:00
import reactor.core.publisher.Mono;
import reactor.core.publisher.Sinks;
2021-02-13 17:42:22 +01:00
import reactor.core.publisher.Sinks.Empty;
2021-01-24 23:08:14 +01:00
2021-02-13 17:42:22 +01:00
public class TestClient implements ReactorTelegramClient {
2021-01-24 23:08:14 +01:00
private static final Logger logger = LoggerFactory.getLogger(TestClient.class);
2021-02-13 01:36:12 +01:00
private static final AtomicLong incrementalMessageId = new AtomicLong(1);
2021-01-24 23:08:14 +01:00
private final List<String> features;
2021-02-13 17:42:22 +01:00
private final Empty<java.lang.Object> closedSink = Sinks.empty();
2021-01-24 23:08:14 +01:00
public TestClient(JsonObject testClientSettings) {
JsonArray features = testClientSettings.getJsonArray("features", new JsonArray());
this.features = new ArrayList<>();
for (java.lang.Object feature : features) {
var featureName = (String) feature;
this.features.add(featureName);
}
}
2021-02-13 01:36:12 +01:00
private static Message generateRandomMessage(boolean randomSender, boolean randomChat, boolean randomText) {
var msg = new Message();
msg.sender = new MessageSenderUser(312042);
msg.chatId = 240213;
msg.id = incrementalMessageId.getAndIncrement();
var content = new MessageText();
content.text = new FormattedText("Text", new TextEntity[0]);
msg.content = content;
msg.date = (int) System.currentTimeMillis() / 1000;
return msg;
}
2021-01-24 23:08:14 +01:00
@Override
2021-02-25 11:21:03 +01:00
public Mono<Void> initialize() {
return Mono.empty();
}
@Override
public Flux<TdApi.Object> receive() {
2021-02-13 17:42:22 +01:00
return Flux.fromIterable(features).flatMap(featureName -> {
switch (featureName) {
case "status-update":
2021-08-01 00:49:12 +02:00
return Flux
.<TdApi.Object>just(
new UpdateAuthorizationState(new AuthorizationStateReady()),
new UpdateConnectionState(new ConnectionStateReady())
)
.mergeWith(closedSink
.asMono()
.thenMany(Flux.just(new UpdateAuthorizationState(new AuthorizationStateClosing()),
new UpdateAuthorizationState(new AuthorizationStateClosed())
))
);
2021-02-13 17:42:22 +01:00
case "infinite-messages":
var randomSenders = features.contains("random-senders");
var randomChats = features.contains("random-chats");
var randomTexts = features.contains("random-text");
return Flux
.<TdApi.Object>fromIterable(() -> new Iterator<>() {
@Override
public boolean hasNext() {
return true;
}
@Override
public TdApi.Object next() {
return new UpdateNewMessage(generateRandomMessage(randomSenders, randomChats, randomTexts));
}
}).takeUntilOther(this.closedSink.asMono());
default:
return Mono.fromCallable(() -> {
throw new IllegalArgumentException("Unknown feature name: " + featureName);
});
}
});
}
@Override
2021-10-02 16:48:56 +02:00
public Mono<TdApi.Object> send(Function query, Duration timeout) {
2021-04-13 21:48:36 +02:00
return Mono.fromCallable(() -> {
2021-02-13 17:42:22 +01:00
TdApi.Object result = executeCommon(query);
if (result != null) {
2021-04-13 21:48:36 +02:00
return result;
2021-02-13 17:42:22 +01:00
}
2021-04-13 21:48:36 +02:00
return new TdApi.Error(500, "Unsupported");
2021-02-13 17:42:22 +01:00
});
2021-01-24 23:08:14 +01:00
}
@Override
2021-04-13 21:48:36 +02:00
public TdApi.Object execute(Function query) {
2021-02-13 17:42:22 +01:00
TdApi.Object result = executeCommon(query);
if (result != null) {
2021-04-13 21:48:36 +02:00
return result;
2021-02-13 17:42:22 +01:00
}
2021-04-13 21:48:36 +02:00
return new TdApi.Error(500, "Unsupported");
2021-02-13 17:42:22 +01:00
}
@Nullable
public TdApi.Object executeCommon(Function query) {
2021-01-24 23:08:14 +01:00
switch (query.getConstructor()) {
case SetLogVerbosityLevel.CONSTRUCTOR:
case SetLogTagVerbosityLevel.CONSTRUCTOR:
case SetTdlibParameters.CONSTRUCTOR:
case SetOption.CONSTRUCTOR:
return new Ok();
2021-08-01 00:49:12 +02:00
case GetMe.CONSTRUCTOR:
var user = new User();
user.id = 420;
user.firstName = "Test";
user.lastName = "Test";
user.phoneNumber = "+77";
return user;
2021-02-13 17:42:22 +01:00
case Close.CONSTRUCTOR:
closedSink.tryEmitEmpty();
return new Ok();
2021-01-24 23:08:14 +01:00
}
2021-02-13 17:42:22 +01:00
return null;
2021-01-24 23:08:14 +01:00
}
}