From c9698f1f5c008029e4f8ba3af6c8a7c392459ca7 Mon Sep 17 00:00:00 2001 From: shmyga Date: Thu, 22 Feb 2018 17:18:55 +0300 Subject: [PATCH] [client] added NetworkManager --- package.json | 3 +- project.xml | 1 + src/client/haxe/ru/m/tankz/Client.hx | 4 +- .../haxe/ru/m/tankz/frame/NetworkFrame.hx | 68 ++++----------- .../haxe/ru/m/tankz/network/NetworkManager.hx | 82 +++++++++++++++++++ .../haxe/ru/m/tankz/storage/UserStorage.hx | 2 +- src/common/haxe/ru/m/connect/IConnection.hx | 1 + 7 files changed, 105 insertions(+), 56 deletions(-) create mode 100644 src/client/haxe/ru/m/tankz/network/NetworkManager.hx 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;