[app] add Network

This commit is contained in:
2020-03-27 16:25:16 +03:00
parent 8da310a6e5
commit cfb9ddc8f8
7 changed files with 140 additions and 72 deletions

View File

@@ -1,12 +1,8 @@
package ru.m.puzzlez;
import hw.connect.ConnectionFactory;
import ru.m.puzzlez.proto.pack.Request;
import ru.m.puzzlez.proto.pack.Response;
import hw.connect.IConnection;
import hw.log.TraceLogger;
import hw.app.App;
import hw.app.Const;
import hw.log.TraceLogger;
import ru.m.puzzlez.storage.GameStorage;
import ru.m.puzzlez.storage.ImageStorage;
import ru.m.puzzlez.storage.SettingsStorage;
@@ -16,7 +12,6 @@ import ru.m.update.Updater;
class PuzzlezApp {
@:provide static var updater:Updater;
@:provide static var connection:IConnection<Response, Request>;
public static function main() {
// ToDo: fix @:provide macro
@@ -24,8 +19,6 @@ class PuzzlezApp {
ImageStorage;
SettingsStorage;
L.push(new TraceLogger());
connection = ConnectionFactory.buildClientConnection("127.0.0.1", 6000, Request);
connection.connect().then(_ -> L.i("connect", "success")).catchError(error -> L.e("connect", "", error));
updater = new Updater(Const.instance.VERSION, "https://shmyga.ru/repo/puzzlez/packages.json");
var app = new App();
app.theme = new PuzzlezTheme();

View File

@@ -0,0 +1,60 @@
package ru.m.puzzlez.net;
import com.hurlant.crypto.extra.UUID;
import com.hurlant.crypto.prng.Random;
import hw.connect.ConnectionFactory;
import hw.connect.IConnection;
import hw.signal.Signal;
import hw.storage.SharedObjectStorage;
import ru.m.puzzlez.proto.core.UserProto;
import ru.m.puzzlez.proto.pack.LoginRequest;
import ru.m.puzzlez.proto.pack.Request;
import ru.m.puzzlez.proto.pack.Response;
@:provide class Network {
public var user(default, null):UserProto;
public var userSignal(default, null):Signal<UserProto> = new Signal();
private var connection:IConnection<Request, Response>;
private var storage:SharedObjectStorage;
private static var USER_KEY = "user";
public function new() {
storage = new SharedObjectStorage("netwok");
if (storage.exists(USER_KEY)) {
user = storage.read(USER_KEY);
} else {
user = new UserProto().setName('Anonimus #${UUID.generateRandom(new Random()).toString().split("-").shift()}');
storage.write(USER_KEY, user);
}
connection = ConnectionFactory.buildClientConnection("127.0.0.1", 6000, Response);
connection.handler.connect(onConnectionChange);
connection.receiveHandler.connect(onReceivePacket);
connection.connect();
}
public function login():Void {
connection.send(new Request().setLogin(new LoginRequest().setName(user.name).setUuid(user.uuid)));
}
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);
}
}
}

View File

@@ -2,17 +2,21 @@ package ru.m.puzzlez.view;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import hw.app.App;
import hw.view.form.ButtonView;
import hw.view.form.LabelView;
import hw.view.frame.FrameSwitcher;
import hw.view.group.VGroupView;
import hw.app.App;
import ru.m.puzzlez.net.Network;
@:template class PuzzlezAppView extends VGroupView {
@:view("switcher") var switcherView:FrameSwitcher;
@:view("fullscreen") var fullscreenButton:ButtonView;
@:view("user") var userLabel:LabelView;
@:provide static var switcher:FrameSwitcher;
@:provide static var network:Network;
@:provide static var app:App;
public function new() {
@@ -30,5 +34,6 @@ import hw.app.App;
case _:
}
});
network.userSignal.connect(user -> userLabel.text = user.name);
}
}

View File

@@ -9,12 +9,17 @@ views:
_image_list_: {$class: ru.m.puzzlez.view.ImageListFrame}
_preset_: {$class: ru.m.puzzlez.view.PresetFrame}
_game_: {$class: ru.m.puzzlez.view.GameFrame}
- id: fullscreen
$type: hw.view.form.ButtonView
- $type: hw.view.group.HGroupView
geometry.position: absolute
geometry.hAlign: right
geometry.vAlign: bottom
geometry.margin: 10
style: icon.expand
+onPress: ~_ -> app.fullScreen = !app.fullScreen
visible: false
layout.vAlign: middle
views:
- id: user
$type: hw.view.form.LabelView
- id: fullscreen
$type: hw.view.form.ButtonView
style: icon.expand
+onPress: ~_ -> app.fullScreen = !app.fullScreen
visible: false