/*
* Copyright (C) 2015 Actor LLC. <https://actor.im>
*/
package im.actor.core.modules;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
import im.actor.core.api.ApiGroupOutPeer;
import im.actor.core.api.ApiOutPeer;
import im.actor.core.api.ApiPeer;
import im.actor.core.api.ApiPeerType;
import im.actor.core.api.ApiUserOutPeer;
import im.actor.core.api.rpc.RequestEditUserLocalName;
import im.actor.core.api.rpc.RequestGetReferencedEntitites;
import im.actor.core.api.rpc.ResponseSeq;
import im.actor.core.entity.Group;
import im.actor.core.entity.Peer;
import im.actor.core.entity.PeerType;
import im.actor.core.entity.User;
import im.actor.core.modules.sequence.Updates;
import im.actor.core.network.RpcCallback;
import im.actor.core.network.RpcException;
import im.actor.core.network.parser.Request;
import im.actor.core.network.parser.Response;
import im.actor.runtime.actors.ActorRef;
import im.actor.runtime.actors.messages.Void;
import im.actor.runtime.function.Function;
import im.actor.runtime.function.Tuple2;
import im.actor.runtime.mtproto.ManagedConnection;
import im.actor.runtime.promise.Promise;
import im.actor.runtime.promise.PromiseFunc;
import im.actor.runtime.promise.PromiseResolver;
import im.actor.runtime.promise.Promises;
import im.actor.runtime.promise.PromisesArray;
import im.actor.runtime.storage.KeyValueEngine;
import im.actor.runtime.storage.KeyValueStorage;
import im.actor.runtime.storage.PreferencesStorage;
public abstract class AbsModule {
public static final int RPC_TIMEOUT = (int) (1.1 * ManagedConnection.CONNECTION_TIMEOUT);
public static final String STORAGE_DIALOGS = "dialogs";
public static final String STORAGE_USERS = "users";
public static final String STORAGE_GROUPS = "groups";
public static final String STORAGE_DOWNLOADS = "downloads";
public static final String STORAGE_CONTACTS = "contacts";
public static final String STORAGE_PHONE_BOOK = "phone_book";
public static final String STORAGE_NOTIFICATIONS = "notifications";
public static final String STORAGE_SEARCH = "search";
public static final String STORAGE_BOOK_IMPORT = "book_import";
public static final String STORAGE_CHAT_STATES = "chat_states";
public static final String STORAGE_CHAT_PREFIX = "chat_";
public static final String STORAGE_CHAT_DOCS_PREFIX = "chat_docs_";
public static final String STORAGE_CURSOR = "chat_cursor";
public static final String STORAGE_BLOB = "blob";
public static final long BLOB_DIALOGS_ACTIVE = 0;
private ModuleContext context;
public AbsModule(ModuleContext context) {
this.context = context;
}
public ModuleContext context() {
return context;
}
public Updates updates() {
return context.getUpdatesModule();
}
public void runOnUiThread(Runnable runnable) {
im.actor.runtime.Runtime.postToMainThread(runnable);
}
public ActorRef sendActor() {
return context().getMessagesModule().getSendMessageActor();
}
public ActorRef stickersActor() {
return context().getStickersModule().getStickersActor();
}
public PreferencesStorage preferences() {
return context.getPreferences();
}
public int myUid() {
return context.getAuthModule().myUid();
}
public <T extends Response> void request(Request<T> request, RpcCallback<T> callback, long timeout) {
context.getActorApi().request(request, callback, timeout);
}
public <T extends Response> void request(Request<T> request, RpcCallback<T> callback) {
request(request, callback, 0);
}
public <T extends Response> void request(Request<T> request, long timeout) {
context.getActorApi().request(request, new RpcCallback<T>() {
@Override
public void onResult(T response) {
}
@Override
public void onError(RpcException e) {
}
}, timeout);
}
public <T extends Response> Promise<T> api(Request<T> request) {
return new Promise<>((PromiseFunc<T>) resolver -> {
request(request, new RpcCallback<T>() {
@Override
public void onResult(T response) {
resolver.result(response);
}
@Override
public void onError(RpcException e) {
resolver.error(e);
}
});
});
}
public <T extends Response> void request(Request<T> request) {
request(request, 0);
}
public KeyValueEngine<User> users() {
return context.getUsersModule().getUsersStorage();
}
public KeyValueEngine<Group> groups() {
return context.getGroupsModule().getGroups();
}
public ApiPeer buildApiPeer(Peer peer) {
if (peer.getPeerType() == PeerType.PRIVATE) {
return new ApiPeer(ApiPeerType.PRIVATE, peer.getPeerId());
} else if (peer.getPeerType() == PeerType.GROUP) {
return new ApiPeer(ApiPeerType.GROUP, peer.getPeerId());
} else {
return null;
}
}
public ApiOutPeer getApiOutPeer(Peer peer) {
if (peer.getPeerType() == PeerType.PRIVATE) {
return new ApiOutPeer(ApiPeerType.PRIVATE, peer.getPeerId(),
users().getValue(peer.getPeerId()).getAccessHash());
} else if (peer.getPeerType() == PeerType.GROUP) {
return new ApiOutPeer(ApiPeerType.GROUP, peer.getPeerId(),
groups().getValue(peer.getPeerId()).getAccessHash());
} else {
return null;
}
}
public Promise<ApiOutPeer> buildOutPeer(Peer peer) {
return new Promise<>((PromiseFunc<ApiOutPeer>) resolver -> {
if (peer.getPeerType() == PeerType.PRIVATE) {
users().getValueAsync(peer.getPeerId())
.map(user -> new ApiOutPeer(ApiPeerType.PRIVATE, user.getUid(), user.getAccessHash()))
.pipeTo(resolver);
} else if (peer.getPeerType() == PeerType.GROUP) {
groups().getValueAsync(peer.getPeerId())
.map(group -> new ApiOutPeer(ApiPeerType.GROUP, group.getGroupId(), group.getAccessHash()))
.pipeTo(resolver);
} else {
throw new RuntimeException("Unknown peer: " + peer);
}
});
}
}