108 lines
3.7 KiB
Haxe
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);
|
|
}
|
|
}
|