/*
* Copyright (C) 2015 Actor LLC. <https://actor.im>
*/
package im.actor.core.modules;
import java.util.List;
import im.actor.core.Configuration;
import im.actor.core.api.ApiGroupOutPeer;
import im.actor.core.api.ApiPeer;
import im.actor.core.api.ApiPeerType;
import im.actor.core.api.ApiOutPeer;
import im.actor.core.api.ApiUserOutPeer;
import im.actor.core.api.rpc.RequestGetReferencedEntitites;
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.core.viewmodel.GroupVM;
import im.actor.core.viewmodel.UserVM;
import im.actor.runtime.actors.AskcableActor;
import im.actor.runtime.actors.messages.Void;
import im.actor.runtime.function.Function;
import im.actor.runtime.promise.Promise;
import im.actor.runtime.promise.PromiseFunc;
import im.actor.runtime.promise.PromiseResolver;
import im.actor.runtime.eventbus.BusSubscriber;
import im.actor.runtime.eventbus.Event;
import im.actor.runtime.promise.Promises;
import im.actor.runtime.promise.PromisesArray;
import im.actor.runtime.storage.KeyValueEngine;
import im.actor.runtime.storage.PreferencesStorage;
public class ModuleActor extends AskcableActor implements BusSubscriber {
protected static final long CURSOR_RECEIVED = 0;
protected static final long CURSOR_READ = 1;
protected static final long CURSOR_OWN_READ = 2;
protected static final long CURSOR_DELETE = 3;
private ModuleContext context;
private BusSubscriber subscriber;
public ModuleActor(ModuleContext context) {
this.context = context;
}
public void subscribe(String eventType) {
if (subscriber == null) {
subscriber = event -> self().post(() -> ModuleActor.this.onBusEvent(event));
}
context().getEvents().subscribe(subscriber, eventType);
}
public ApiOutPeer buidOutPeer(Peer peer) {
if (peer.getPeerType() == PeerType.PRIVATE) {
User user = getUser(peer.getPeerId());
if (user == null) {
return null;
}
return new ApiOutPeer(ApiPeerType.PRIVATE, user.getUid(), user.getAccessHash());
} else if (peer.getPeerType() == PeerType.GROUP) {
Group group = getGroup(peer.getPeerId());
if (group == null) {
return null;
}
return new ApiOutPeer(ApiPeerType.GROUP, group.getGroupId(), group.getAccessHash());
} else {
throw new RuntimeException("Unknown peer: " + peer);
}
}
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 KeyValueEngine<User> users() {
return context.getUsersModule().getUsersStorage();
}
public KeyValueEngine<Group> groups() {
return context.getGroupsModule().getGroups();
}
public Group getGroup(int gid) {
return groups().getValue(gid);
}
public User getUser(int uid) {
return users().getValue(uid);
}
public UserVM getUserVM(int uid) {
return context.getUsersModule().getUsers().get(uid);
}
public GroupVM getGroupVM(int gid) {
return context.getGroupsModule().getGroupsCollection().get(gid);
}
public PreferencesStorage preferences() {
return context.getPreferences();
}
public Configuration config() {
return context.getConfiguration();
}
public Updates updates() {
return context.getUpdatesModule();
}
public int myUid() {
return context.getAuthModule().myUid();
}
public ModuleContext context() {
return context;
}
public <T extends Response> long request(Request<T> request) {
return request(request, new RpcCallback<T>() {
@Override
public void onResult(T response) {
}
@Override
public void onError(RpcException e) {
}
});
}
public <T extends Response> long request(final Request<T> request, final RpcCallback<T> callback) {
return context.getActorApi().request(request, new RpcCallback<T>() {
@Override
public void onResult(final T response) {
self().send(new Runnable() {
@Override
public void run() {
callback.onResult(response);
}
@Override
public String toString() {
return "Response {" + response + "}";
}
});
}
@Override
public void onError(final RpcException e) {
self().send(new Runnable() {
@Override
public void run() {
callback.onError(e);
}
@Override
public String toString() {
return "Error {" + e + "}";
}
});
}
});
}
public <T extends Response> Promise<T> api(final Request<T> request) {
return new Promise<>((PromiseFunc<T>) executor -> context.getActorApi().request(request, new RpcCallback<T>() {
@Override
public void onResult(T response) {
executor.result(response);
}
@Override
public void onError(RpcException e) {
executor.error(e);
}
}));
}
public void cancelRequest(long rid) {
context.getActorApi().cancelRequest(rid);
}
@Override
public void onBusEvent(Event event) {
}
}