[proto] update

This commit is contained in:
2020-05-15 21:16:23 +03:00
parent 75c6e835c2
commit c878bd60d9
10 changed files with 106 additions and 173 deletions

View File

@@ -2,8 +2,6 @@
"protoPath": "src/common/proto", "protoPath": "src/common/proto",
"protoFiles": [ "protoFiles": [
"src/common/proto/core.proto", "src/common/proto/core.proto",
"src/common/proto/game.proto",
"src/common/proto/room.proto",
"src/common/proto/pack.proto" "src/common/proto/pack.proto"
], ],
"cleanOut": true, "cleanOut": true,

View File

@@ -1,11 +1,14 @@
package ru.m.puzzlez.net; package ru.m.puzzlez.net;
import haxe.Unserializer;
import com.hurlant.crypto.extra.UUID; import com.hurlant.crypto.extra.UUID;
import com.hurlant.crypto.prng.Random; import com.hurlant.crypto.prng.Random;
import hw.connect.ConnectionFactory; import hw.connect.ConnectionFactory;
import hw.connect.IConnection; import hw.connect.IConnection;
import hw.signal.Signal; import hw.signal.Signal;
import hw.storage.SharedObjectStorage; import hw.storage.SharedObjectStorage;
import ru.m.puzzlez.core.GameEvent;
import ru.m.puzzlez.proto.core.GameProto;
import ru.m.puzzlez.proto.core.UserProto; import ru.m.puzzlez.proto.core.UserProto;
import ru.m.puzzlez.proto.pack.LoginRequest; import ru.m.puzzlez.proto.pack.LoginRequest;
import ru.m.puzzlez.proto.pack.Request; import ru.m.puzzlez.proto.pack.Request;
@@ -15,12 +18,21 @@ import ru.m.puzzlez.proto.pack.Response;
public var user(default, null):UserProto; public var user(default, null):UserProto;
public var userSignal(default, null):Signal<UserProto> = new Signal(); 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 connection:IConnection<Request, Response>;
private var storage:SharedObjectStorage; private var storage:SharedObjectStorage;
private static var USER_KEY = "user"; private static var USER_KEY = "user";
public function new() { public function new() {
gameList = [];
storage = new SharedObjectStorage("netwok"); storage = new SharedObjectStorage("netwok");
if (storage.exists(USER_KEY)) { if (storage.exists(USER_KEY)) {
user = storage.read(USER_KEY); user = storage.read(USER_KEY);
@@ -35,7 +47,7 @@ import ru.m.puzzlez.proto.pack.Response;
} }
public function login():Void { public function login():Void {
connection.send(new Request().setLogin(new LoginRequest().setName(user.name).setUuid(user.uuid))); connection.send(new Request().setLogin(new LoginRequest().setUser(user)));
} }
private function onConnectionChange(event:ConnectionEvent):Void { private function onConnectionChange(event:ConnectionEvent):Void {
@@ -55,6 +67,19 @@ import ru.m.puzzlez.proto.pack.Response;
user = packet.login.user; user = packet.login.user;
storage.write(USER_KEY, user); storage.write(USER_KEY, user);
userSignal.emit(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));
}
} }
} }
} }

View File

@@ -9,4 +9,12 @@ message UserProto {
message GameProto { message GameProto {
int32 id = 1; int32 id = 1;
string imageId = 2;
string status = 3;
repeated UserProto users = 4;
}
message GameEventProto {
int32 time = 1;
string event = 2;
} }

View File

@@ -1,8 +0,0 @@
syntax = "proto3";
package ru.m.puzzlez.proto.game;
message GameEventProto {
int32 time = 1;
string event = 2;
}

View File

@@ -1,8 +1,6 @@
syntax = "proto3"; syntax = "proto3";
import "core.proto"; import "core.proto";
import "game.proto";
import "room.proto";
package ru.m.puzzlez.proto.pack; package ru.m.puzzlez.proto.pack;
@@ -12,8 +10,7 @@ message ErrorResponse {
} }
message LoginRequest { message LoginRequest {
string uuid = 1; ru.m.puzzlez.proto.core.UserProto user = 1;
string name = 2;
} }
message LoginResponse { message LoginResponse {
@@ -24,21 +21,48 @@ message LogoutRequest {}
message LogoutResponse {} message LogoutResponse {}
message GameCreateRequest {
string imageId = 1;
}
message GameJoinRequest {
int32 gameId = 1;
}
message GameLeaveRequest {}
message GameResponse {
ru.m.puzzlez.proto.core.GameProto game = 1;
}
message GameListRequest {
bool subscribe = 1;
}
message GameListResponse {
repeated ru.m.puzzlez.proto.core.GameProto games = 1;
}
message GameEventRequest { message GameEventRequest {
ru.m.puzzlez.proto.game.GameEventProto event = 1; repeated ru.m.puzzlez.proto.core.GameEventProto events = 1;
} }
message GameEventResponse { message GameEventResponse {
ru.m.puzzlez.proto.game.GameEventProto event = 1; repeated ru.m.puzzlez.proto.core.GameEventProto events = 1;
} }
message Request { message Request {
oneof content { oneof content {
LoginRequest login = 1; LoginRequest login = 1;
LogoutRequest logout = 2; LogoutRequest logout = 2;
ru.m.puzzlez.proto.room.RoomRequest room = 3;
ru.m.puzzlez.proto.room.RoomListRequest roomList = 4; GameCreateRequest gameCreate = 10;
GameEventRequest gameEvent = 6; GameLeaveRequest gameJoin = 11;
GameLeaveRequest gameLeave = 12;
GameListRequest gameList = 20;
GameEventRequest gameEvent = 100;
} }
} }
@@ -46,9 +70,12 @@ message Response {
oneof content { oneof content {
LoginResponse login = 1; LoginResponse login = 1;
LogoutResponse logout = 2; LogoutResponse logout = 2;
ru.m.puzzlez.proto.room.RoomResponse room = 3;
ru.m.puzzlez.proto.room.RoomListResponse roomList = 4; GameResponse game = 10;
GameEventResponse gameEvent = 6;
GameListResponse gameList = 20;
GameEventResponse gameEvent = 100;
ErrorResponse error = 999; ErrorResponse error = 999;
} }

View File

@@ -1,64 +0,0 @@
syntax = "proto3";
import "core.proto";
package ru.m.puzzlez.proto.room;
message SlotProto {
string team = 3;
int32 index = 4;
}
message RoomSlotProto {
SlotProto slot = 1;
ru.m.puzzlez.proto.core.UserProto user = 2;
}
message RoomProto {
ru.m.puzzlez.proto.core.GameProto game = 1;
ru.m.puzzlez.proto.core.UserProto creator = 2;
repeated ru.m.puzzlez.proto.core.UserProto users = 3;
repeated RoomSlotProto slots = 4;
}
message CreateRequest {
string type = 2;
int32 level = 3;
}
message JoinRequest {
int32 gameId = 1;
bool restore = 2;
}
message LeaveRequest {
}
message SlotRequest {
SlotProto slot = 3;
}
message StartRequest {
}
message RoomRequest {
oneof content {
CreateRequest create = 1;
JoinRequest join = 2;
LeaveRequest leave = 3;
SlotRequest slot = 4;
StartRequest start = 5;
}
}
message RoomResponse {
RoomProto room = 1;
}
message RoomListRequest {
bool subscribe = 1;
}
message RoomListResponse {
repeated RoomProto rooms = 1;
}

View File

@@ -9,16 +9,16 @@ import hw.log.BaseLogger.LoggerUtil;
import ru.m.puzzlez.core.GameEvent; import ru.m.puzzlez.core.GameEvent;
import ru.m.puzzlez.game.IGameManager; import ru.m.puzzlez.game.IGameManager;
import ru.m.puzzlez.game.ServerGame; import ru.m.puzzlez.game.ServerGame;
import ru.m.puzzlez.proto.core.GameEventProto;
import ru.m.puzzlez.proto.core.UserProto; import ru.m.puzzlez.proto.core.UserProto;
import ru.m.puzzlez.proto.game.GameEventProto;
import ru.m.puzzlez.proto.pack.ErrorResponse; import ru.m.puzzlez.proto.pack.ErrorResponse;
import ru.m.puzzlez.proto.pack.GameEventResponse; import ru.m.puzzlez.proto.pack.GameEventResponse;
import ru.m.puzzlez.proto.pack.GameListResponse;
import ru.m.puzzlez.proto.pack.GameResponse;
import ru.m.puzzlez.proto.pack.LoginResponse; import ru.m.puzzlez.proto.pack.LoginResponse;
import ru.m.puzzlez.proto.pack.LogoutResponse; import ru.m.puzzlez.proto.pack.LogoutResponse;
import ru.m.puzzlez.proto.pack.Request; import ru.m.puzzlez.proto.pack.Request;
import ru.m.puzzlez.proto.pack.Response; import ru.m.puzzlez.proto.pack.Response;
import ru.m.puzzlez.proto.room.RoomListResponse;
import ru.m.puzzlez.proto.room.RoomResponse;
import sys.net.Socket; import sys.net.Socket;
class GameSession extends ProtoSession<Response, Request> implements GameManagerListener { class GameSession extends ProtoSession<Response, Request> implements GameManagerListener {
@@ -45,9 +45,9 @@ class GameSession extends ProtoSession<Response, Request> implements GameManager
send(new Response().setError(new ErrorResponse().setCode(code).setMessage(message))); send(new Response().setError(new ErrorResponse().setCode(code).setMessage(message)));
} }
private function listGame():RoomListResponse { private function listGame():GameListResponse {
var games = gameManager.games; var games = gameManager.games;
return new RoomListResponse().setRooms([for (game in games) game.room]); return new GameListResponse().setGames([for (game in games) game.proto]);
} }
override public function send(packet:Response):Void { override public function send(packet:Response):Void {
@@ -139,7 +139,7 @@ class GameSession extends ProtoSession<Response, Request> implements GameManager
public function onCreate(game:ServerGame):Void { public function onCreate(game:ServerGame):Void {
if (subscribed) { if (subscribed) {
send(new Response().setRoomList(listGame())); send(new Response().setGameList(listGame()));
} }
} }
@@ -149,31 +149,33 @@ class GameSession extends ProtoSession<Response, Request> implements GameManager
case LEAVE(user): case LEAVE(user):
if (user.uuid == this.user.uuid) { if (user.uuid == this.user.uuid) {
gameId = -1; gameId = -1;
send(new Response().setRoom(new RoomResponse())); send(new Response().setGame(new GameResponse()));
return; return;
} }
case _: case _:
} }
send(new Response().setRoom(new RoomResponse().setRoom(game.room))); send(new Response().setGame(new GameResponse().setGame(game.proto)));
} }
if (subscribed) { if (subscribed) {
send(new Response().setRoomList(listGame())); send(new Response().setGameList(listGame()));
} }
} }
public function onDelete(game:ServerGame):Void { public function onDelete(game:ServerGame):Void {
if (gameId == game.id) { if (gameId == game.id) {
gameId = -1; gameId = -1;
send(new Response().setRoom(new RoomResponse())); send(new Response().setGame(new GameResponse()));
} }
if (subscribed) { if (subscribed) {
send(new Response().setRoomList(listGame())); send(new Response().setGameList(listGame()));
} }
} }
public function onEvent(game:ServerGame, event:GameEvent):Void { public function onEvent(game:ServerGame, event:GameEvent):Void {
if (gameId == game.id) { if (gameId == game.id) {
send(new Response().setGameEvent(new GameEventResponse().setEvent(new GameEventProto().setTime(0).setEvent(Serializer.run(event))))); send(new Response().setGameEvent(new GameEventResponse().setEvents([
new GameEventProto().setTime(0).setEvent(Serializer.run(event))
])));
} }
} }
} }

View File

@@ -1,11 +1,9 @@
package ru.m.puzzlez.game; package ru.m.puzzlez.game;
import ru.m.puzzlez.core.Id;
import ru.m.puzzlez.core.GameEvent; import ru.m.puzzlez.core.GameEvent;
import ru.m.puzzlez.game.IGameManager; import ru.m.puzzlez.game.IGameManager;
import ru.m.puzzlez.proto.room.SlotProto;
import ru.m.puzzlez.proto.room.RoomSlotProto;
import ru.m.puzzlez.proto.core.GameProto; import ru.m.puzzlez.proto.core.GameProto;
import ru.m.puzzlez.proto.room.RoomProto;
import ru.m.puzzlez.proto.core.UserProto; import ru.m.puzzlez.proto.core.UserProto;
class _GameListener implements GameListener { class _GameListener implements GameListener {
@@ -37,7 +35,6 @@ class _GameListener implements GameListener {
@:dispatcher(GameManagerListener) class GameManager implements IGameManager { @:dispatcher(GameManagerListener) class GameManager implements IGameManager {
public var games(default, null):Array<ServerGame>; public var games(default, null):Array<ServerGame>;
public var gamesById(default, null):Map<Int, ServerGame>; public var gamesById(default, null):Map<Int, ServerGame>;
public var gamesByCreator(default, null):Map<String, ServerGame>;
public var gamesByUser(default, null):Map<String, ServerGame>; public var gamesByUser(default, null):Map<String, ServerGame>;
private var counter:Int; private var counter:Int;
@@ -46,26 +43,18 @@ class _GameListener implements GameListener {
counter = 0; counter = 0;
games = []; games = [];
gamesById = new Map(); gamesById = new Map();
gamesByCreator = new Map();
gamesByUser = new Map(); gamesByUser = new Map();
} }
public function create(user:UserProto):ServerGame { public function create(user:UserProto, imageId:ImageId):ServerGame {
if (gamesByCreator.exists(user.uuid)) { if (gamesByCreator.exists(user.uuid)) {
delete(gamesByCreator[user.uuid].id); delete(gamesByCreator[user.uuid].id);
} }
var room = new RoomProto() var gameProto = new GameProto().setId(++counter).setImageId(imageId);
.setGame( gameProto.users.push(user);
new GameProto() var game = new ServerGame(gameProto);
.setId(++counter)
)
.setCreator(user);
var game = new ServerGame(room);
var slots:Array<RoomSlotProto> = [];
game.room.setSlots(slots);
games.push(game); games.push(game);
gamesById[game.id] = game; gamesById[game.id] = game;
gamesByCreator[game.room.creator.uuid] = game;
createSignal.emit(game); createSignal.emit(game);
join(game.id, user); join(game.id, user);
return game; return game;
@@ -85,15 +74,12 @@ class _GameListener implements GameListener {
var game = gamesById[gameId]; var game = gamesById[gameId];
games.remove(game); games.remove(game);
gamesById.remove(game.id); gamesById.remove(game.id);
gamesByCreator.remove(game.room.creator.uuid);
deleteSignal.emit(game); deleteSignal.emit(game);
} }
} }
public function leave(user:UserProto):Void { public function leave(user:UserProto):Void {
/*if (gamesByCreator.exists(user.uuid)) { if (gamesByUser.exists(user.uuid)) {
delete(gamesByCreator[user.uuid].proto.id);
} else*/ if (gamesByUser.exists(user.uuid)) {
var game = gamesByUser[user.uuid]; var game = gamesByUser[user.uuid];
gamesByUser.remove(user.uuid); gamesByUser.remove(user.uuid);
game.leave(user); game.leave(user);
@@ -101,14 +87,6 @@ class _GameListener implements GameListener {
} }
} }
public function slot(user:UserProto, slot:SlotProto):Void {
if (gamesByUser.exists(user.uuid)) {
var game = gamesByUser[user.uuid];
game.slot(user, slot);
changeSignal.emit(game, SLOT(user, slot));
}
}
public function start(gameId:Int):Void { public function start(gameId:Int):Void {
if (gamesById.exists(gameId)) { if (gamesById.exists(gameId)) {
var game:ServerGame = gamesById[gameId]; var game:ServerGame = gamesById[gameId];

View File

@@ -1,14 +1,13 @@
package ru.m.puzzlez.game; package ru.m.puzzlez.game;
import ru.m.puzzlez.core.Id;
import hw.signal.Signal; import hw.signal.Signal;
import ru.m.puzzlez.core.GameEvent; import ru.m.puzzlez.core.GameEvent;
import ru.m.puzzlez.proto.core.UserProto; import ru.m.puzzlez.proto.core.UserProto;
import ru.m.puzzlez.proto.room.SlotProto;
enum GameChange { enum GameChange {
JOIN(user:UserProto); JOIN(user:UserProto);
LEAVE(user:UserProto); LEAVE(user:UserProto);
SLOT(user:UserProto, slot:SlotProto);
START(); START();
} }
@@ -35,10 +34,9 @@ interface GameManagerListener {
public function connect(listener:GameManagerListener):Void; public function connect(listener:GameManagerListener):Void;
public function disconnect(listener:GameManagerListener):Void; public function disconnect(listener:GameManagerListener):Void;
public function create(user:UserProto):ServerGame; public function create(user:UserProto, imageId:ImageId):ServerGame;
public function delete(gameId:Int):Void; public function delete(gameId:Int):Void;
public function join(gameId:Int, user:UserProto):Void; public function join(gameId:Int, user:UserProto):Void;
public function slot(user:UserProto, slot:SlotProto):Void;
public function leave(user:UserProto):Void; public function leave(user:UserProto):Void;
public function start(gameId:Int):Void; public function start(gameId:Int):Void;
} }

View File

@@ -1,29 +1,28 @@
package ru.m.puzzlez.game; package ru.m.puzzlez.game;
import haxe.Timer; import haxe.Timer;
import ru.m.puzzlez.core.GameEvent; import ru.m.puzzlez.core.Game;
import ru.m.puzzlez.proto.core.GameProto;
import ru.m.puzzlez.proto.core.UserProto; import ru.m.puzzlez.proto.core.UserProto;
import ru.m.puzzlez.proto.room.RoomProto;
import ru.m.puzzlez.proto.room.SlotProto;
@:dispatcher(GameListener) class ServerGame { @:dispatcher(GameListener) class ServerGame extends Game {
public var room(default, null):RoomProto;
public var id(get, null):Int; public var id(get, null):Int;
public var proto(default, default):GameProto;
private var timer:Timer; private var timer:Timer;
public function new(room:RoomProto) { public function new(proto:GameProto) {
this.room = room; this.proto = proto;
} }
private inline function get_id():Int { private inline function get_id():Int {
return room.game.id; return proto.id;
} }
public function contains(user:UserProto):Bool { public function contains(user:UserProto):Bool {
for (slot in room.slots) { for (user in proto.users) {
if (slot.hasUser() && slot.user.uuid == user.uuid) { if (user.uuid == user.uuid) {
return true; return true;
} }
} }
@@ -32,41 +31,11 @@ import ru.m.puzzlez.proto.room.SlotProto;
public function join(user:UserProto):Void { public function join(user:UserProto):Void {
if (!contains(user)) { if (!contains(user)) {
room.users.push(user); proto.users.push(user);
}
}
public function slot(user:UserProto, slot:SlotProto):Void {
join(user);
for (s in room.slots) {
if (s.hasUser() && s.user.uuid == user.uuid) {
s.clearUser();
break;
}
}
for (s in room.slots) {
if (s.slot.team == slot.team && s.slot.index == slot.index) {
s.setUser(user);
break;
}
} }
} }
public function leave(user:UserProto):Void { public function leave(user:UserProto):Void {
for (slot in room.slots) { proto.setUsers(proto.users.filter(function(u:UserProto) return u.uuid != user.uuid));
if (slot.user != null && slot.user.uuid == user.uuid) {
slot.clearUser();
break;
}
}
room.setUsers(room.users.filter(function(u:UserProto) return u.uuid != user.uuid));
}
public function start():Void {
}
public function restore():Array<GameEvent> {
return [];
} }
} }