diff --git a/package.json b/package.json
index 6e48186..b84c8ee 100755
--- a/package.json
+++ b/package.json
@@ -39,6 +39,7 @@
"haxework": "git@bitbucket.org:shmyga/haxework.git",
"orm": "2.1.0",
"yield": "1.1.2",
- "haxe-crypto": "0.0.7"
+ "haxe-crypto": "0.0.7",
+ "hxsignal": "0.9.2"
}
}
diff --git a/project.xml b/project.xml
index dbf7251..e65b08c 100755
--- a/project.xml
+++ b/project.xml
@@ -13,6 +13,7 @@
+
diff --git a/src/client/haxe/ru/m/tankz/Client.hx b/src/client/haxe/ru/m/tankz/Client.hx
index af1804c..0ec72a8 100755
--- a/src/client/haxe/ru/m/tankz/Client.hx
+++ b/src/client/haxe/ru/m/tankz/Client.hx
@@ -1,5 +1,6 @@
package ru.m.tankz;
+import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.storage.UserStorage;
import openfl.Assets;
import ru.m.tankz.sound.SoundManager;
@@ -93,6 +94,7 @@ class Client implements IConnectionHandler {
Provider.setFactory(SaveStorage, SaveStorage);
Provider.setFactory(UserStorage, UserStorage);
Provider.setFactory(SoundManager, SoundManager);
+ Provider.setFactory(NetworkManager, NetworkManager);
Provider.setFactory(Game, ClassicGame, ClassicGame.TYPE);
Provider.setFactory(Game, DotaGame, DotaGame.TYPE);
@@ -119,6 +121,6 @@ class Client implements IConnectionHandler {
public function onError(error:Dynamic):Void {
L.e(TAG, '', error);
- view.switcher.change(StartFrame.ID);
+ //view.switcher.change(StartFrame.ID);
}
}
diff --git a/src/client/haxe/ru/m/tankz/frame/NetworkFrame.hx b/src/client/haxe/ru/m/tankz/frame/NetworkFrame.hx
index 4bd5387..74b96dc 100644
--- a/src/client/haxe/ru/m/tankz/frame/NetworkFrame.hx
+++ b/src/client/haxe/ru/m/tankz/frame/NetworkFrame.hx
@@ -6,11 +6,7 @@ import haxework.gui.LabelView;
import haxework.gui.VGroupView;
import haxework.gui.ViewBuilder;
import haxework.provider.Provider;
-import protohx.Message;
-import ru.m.connect.IConnection;
-import ru.m.tankz.proto.pack.LoginRequest;
-import ru.m.tankz.proto.pack.LoginResponse;
-import ru.m.tankz.storage.UserStorage;
+import ru.m.tankz.network.NetworkManager;
interface NetworkFrameLayout {
@@ -20,15 +16,13 @@ interface NetworkFrameLayout {
}
@:template("ru/m/tankz/frame/NetworkFrame.yaml", "ru/m/tankz/Style.yaml")
-class NetworkFrame extends VGroupView implements ViewBuilder implements NetworkFrameLayout implements IPacketHandler implements IConnectionHandler {
+class NetworkFrame extends VGroupView implements ViewBuilder implements NetworkFrameLayout {
public static var ID(default, never):String = "network";
- private var state(null, set):String;
+ private var network(get, never):NetworkManager;
- private function set_state(value:String):String {
- stateLabel.text = value;
- loginButton.disabled = value != 'online';
- return value;
+ private function get_network():NetworkManager {
+ return Provider.get(NetworkManager);
}
public function init():Void {
@@ -36,53 +30,21 @@ class NetworkFrame extends VGroupView implements ViewBuilder implements NetworkF
}
public function onShow():Void {
- var user:User = Provider.get(UserStorage).read();
- nameInput.text = user.name;
- var connection:IConnection = Provider.get(IConnection);
- connection.packetHandler.addListener(this);
- connection.handler.addListener(this);
- state = connection.connected ? 'online' : 'offline';
- if (!connection.connected) {
- connection.connect();
- }
+ nameInput.text = network.user.name;
+ onStateChange(network.state);
+ network.stateSignal.connect(onStateChange);
+ }
+
+ private function onStateChange(state:String):Void {
+ loginButton.disabled = !(state == "offline" || state == "error");
+ stateLabel.text = state;
}
public function onHide():Void {
- Provider.get(IConnection).packetHandler.removeListener(this);
- Provider.get(IConnection).handler.removeListener(this);
+ network.stateSignal.disconnect(onStateChange);
}
public function onPress(view:ButtonView):Void {
- var user:User = Provider.get(UserStorage).read();
- user.name = nameInput.text;
- Provider.get(IConnection).send(
- new LoginRequest()
- .setUuid(user.uuid)
- .setName(user.name)
- );
- }
-
- public function onLoginResponse(packet:LoginResponse):Void {
- var user:User = {
- uuid: packet.user.uuid,
- name: packet.user.name,
- };
- Provider.get(UserStorage).write(user);
- //Provider.set(User, user);
- state = 'logined';
- }
-
- public function onPacket(packet:Message):Void {}
-
- public function onConnected():Void {
- state = 'online';
- }
-
- public function onDisconnected():Void {
- state = 'offline';
- }
-
- public function onError(error:Dynamic):Void {
- state = 'offline';
+ network.login(nameInput.text);
}
}
\ No newline at end of file
diff --git a/src/client/haxe/ru/m/tankz/network/NetworkManager.hx b/src/client/haxe/ru/m/tankz/network/NetworkManager.hx
new file mode 100644
index 0000000..0579ef7
--- /dev/null
+++ b/src/client/haxe/ru/m/tankz/network/NetworkManager.hx
@@ -0,0 +1,82 @@
+package ru.m.tankz.network;
+
+import haxework.provider.Provider;
+import hxsignal.impl.Signal1;
+import protohx.Message;
+import ru.m.connect.IConnection;
+import ru.m.tankz.proto.pack.LoginRequest;
+import ru.m.tankz.proto.pack.LoginResponse;
+import ru.m.tankz.storage.UserStorage;
+
+
+class NetworkManager implements IPacketHandler implements IConnectionHandler {
+
+ public var state(default, null):String;
+ public var stateSignal:Signal1;
+ public var user(default, null):User;
+
+ private var connection(get, never):IConnection;
+ private var storage(get, never):UserStorage;
+
+ inline private function get_connection():IConnection {
+ return Provider.get(IConnection);
+ }
+
+ inline private function get_storage():UserStorage {
+ return Provider.get(UserStorage);
+ }
+
+ public function new() {
+ stateSignal = new Signal1();
+ updateState('offline');
+ connection.handler.addListener(this);
+ connection.packetHandler.addListener(this);
+ user = storage.read();
+ if (user == null) {
+ user = {name: 'User', uuid: null};
+ }
+ }
+
+ private function updateState(value:String):Void {
+ state = value;
+ stateSignal.emit(value);
+ }
+
+ public function login(name:String):Void {
+ user.name = name;
+ if (!connection.connected) {
+ updateState('connect...');
+ connection.connect();
+ } else {
+ onConnected();
+ }
+ }
+
+ public function onConnected():Void {
+ updateState('login...');
+ connection.send(
+ new LoginRequest()
+ .setUuid(user.uuid)
+ .setName(user.name)
+ );
+ }
+
+ public function onDisconnected():Void {
+ updateState('offline');
+ }
+
+ public function onError(error:Dynamic):Void {
+ updateState('error');
+ }
+
+ public function onLoginResponse(packet:LoginResponse):Void {
+ user = {
+ uuid: packet.user.uuid,
+ name: packet.user.name,
+ };
+ storage.write(user);
+ updateState('online');
+ }
+
+ public function onPacket(packet:Message):Void {}
+}
diff --git a/src/client/haxe/ru/m/tankz/storage/UserStorage.hx b/src/client/haxe/ru/m/tankz/storage/UserStorage.hx
index c48345c..d708a14 100644
--- a/src/client/haxe/ru/m/tankz/storage/UserStorage.hx
+++ b/src/client/haxe/ru/m/tankz/storage/UserStorage.hx
@@ -16,7 +16,7 @@ class UserStorage {
public function read():Null {
var user:User = Reflect.getProperty(so.data, 'user');
L.d(TAG, 'read: ${user}');
- return user != null ? user : {name: 'User', uuid: null};
+ return user;
}
public function write(user:User):Void {
diff --git a/src/common/haxe/ru/m/connect/IConnection.hx b/src/common/haxe/ru/m/connect/IConnection.hx
index b31f074..dda625f 100755
--- a/src/common/haxe/ru/m/connect/IConnection.hx
+++ b/src/common/haxe/ru/m/connect/IConnection.hx
@@ -1,5 +1,6 @@
package ru.m.connect;
+import promhx.Promise;
import haxework.dispath.IDispatcher;
import haxe.io.Bytes;
import protohx.Message;