Files
puzzlez/src/app/haxe/ru/m/puzzlez/net/Network.hx
2020-05-25 17:29:31 +03:00

108 lines
3.7 KiB
Haxe

package ru.m.puzzlez.net;
import haxe.Unserializer;
import hw.connect.ConnectionFactory;
import hw.connect.IConnection;
import hw.signal.Signal;
import hw.storage.SharedObjectStorage;
import promhx.Promise;
import ru.m.data.IDataSource;
import ru.m.puzzlez.core.GameEvent;
import ru.m.puzzlez.core.GameState;
import ru.m.puzzlez.core.Id;
import ru.m.puzzlez.proto.core.GameProto;
import ru.m.puzzlez.proto.core.UserProto;
import ru.m.puzzlez.proto.pack.GameCreateRequest;
import ru.m.puzzlez.proto.pack.GameJoinRequest;
import ru.m.puzzlez.proto.pack.LoginRequest;
import ru.m.puzzlez.proto.pack.Request;
import ru.m.puzzlez.proto.pack.Response;
@:provide class Network implements IDataIndex<ImageId> {
public var user(default, null):UserProto;
public var userSignal(default, null):Signal<UserProto> = new Signal();
public var gameList(default, null):Array<GameProto>;
public var gameListSignal(default, null):Signal<Array<GameProto>> = new Signal();
public var game(default, null):GameProto;
public var gameSignal(default, null):Signal<GameProto> = new Signal();
public var gameEventSignal(default, null):Signal<GameEvent> = new Signal();
private var connection:IConnection<Request, Response>;
private var storage:SharedObjectStorage;
private static var USER_KEY = "user";
public function new() {
gameList = [];
storage = new SharedObjectStorage("network");
if (storage.exists(USER_KEY)) {
user = storage.read(USER_KEY);
} else {
user = new UserProto().setName('Anonimus #${IdUtil.generate()}');
storage.write(USER_KEY, user);
}
connection = ConnectionFactory.buildClientConnection("127.0.0.1", 5000, Response);
connection.handler.connect(onConnectionChange);
connection.receiveHandler.connect(onReceivePacket);
connection.connect().catchError(_ -> {});
}
public function login():Void {
connection.send(new Request().setLogin(new LoginRequest().setUser(user)));
}
public function startGame(state:GameState):Void {
connection.send(new Request().setGameCreate(new GameCreateRequest().setImageId(state.preset.imageId)));
}
public function joinGame(state:GameState):Void {
connection.send(new Request().setGameJoin(new GameJoinRequest().setGameId(state.id)));
}
private function onConnectionChange(event:ConnectionEvent):Void {
L.i("network", '${event}');
switch event {
case CONNECTED:
login();
case DISCONNECTED:
//
case ERROR(error):
// ToDo: reconnect
}
}
private function onReceivePacket(packet:Response):Void {
if (packet.hasLogin()) {
user = packet.login.user;
storage.write(USER_KEY, user);
userSignal.emit(user);
} else if (packet.hasLogout()) {
user = null;
userSignal.emit(user);
} else if (packet.hasGameList()) {
gameList = packet.gameList.games;
gameListSignal.emit(gameList);
} else if (packet.hasGame()) {
game = packet.game.game;
gameSignal.emit(game);
} else if (packet.hasGameEvent()) {
for (event in packet.gameEvent.events) {
gameEventSignal.emit(Unserializer.run(event.event));
}
}
}
public function getIndexPage(page:Page):Promise<DataPage<ImageId>> {
// ToDo: return gameList
var data = {
page: page,
total: 1,
data: [new ImageId('asset', 'resources/image/raccoon.jpg')],
}
return Promise.promise(data);
}
}