[proto] update
This commit is contained in:
@@ -1,11 +1,14 @@
|
||||
package ru.m.puzzlez.net;
|
||||
|
||||
import haxe.Unserializer;
|
||||
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.core.GameEvent;
|
||||
import ru.m.puzzlez.proto.core.GameProto;
|
||||
import ru.m.puzzlez.proto.core.UserProto;
|
||||
import ru.m.puzzlez.proto.pack.LoginRequest;
|
||||
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 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("netwok");
|
||||
if (storage.exists(USER_KEY)) {
|
||||
user = storage.read(USER_KEY);
|
||||
@@ -35,7 +47,7 @@ import ru.m.puzzlez.proto.pack.Response;
|
||||
}
|
||||
|
||||
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 {
|
||||
@@ -55,6 +67,19 @@ import ru.m.puzzlez.proto.pack.Response;
|
||||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,4 +9,12 @@ message UserProto {
|
||||
|
||||
message GameProto {
|
||||
int32 id = 1;
|
||||
string imageId = 2;
|
||||
string status = 3;
|
||||
repeated UserProto users = 4;
|
||||
}
|
||||
|
||||
message GameEventProto {
|
||||
int32 time = 1;
|
||||
string event = 2;
|
||||
}
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
syntax = "proto3";
|
||||
|
||||
package ru.m.puzzlez.proto.game;
|
||||
|
||||
message GameEventProto {
|
||||
int32 time = 1;
|
||||
string event = 2;
|
||||
}
|
||||
@@ -1,8 +1,6 @@
|
||||
syntax = "proto3";
|
||||
|
||||
import "core.proto";
|
||||
import "game.proto";
|
||||
import "room.proto";
|
||||
|
||||
package ru.m.puzzlez.proto.pack;
|
||||
|
||||
@@ -12,8 +10,7 @@ message ErrorResponse {
|
||||
}
|
||||
|
||||
message LoginRequest {
|
||||
string uuid = 1;
|
||||
string name = 2;
|
||||
ru.m.puzzlez.proto.core.UserProto user = 1;
|
||||
}
|
||||
|
||||
message LoginResponse {
|
||||
@@ -24,21 +21,48 @@ message LogoutRequest {}
|
||||
|
||||
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 {
|
||||
ru.m.puzzlez.proto.game.GameEventProto event = 1;
|
||||
repeated ru.m.puzzlez.proto.core.GameEventProto events = 1;
|
||||
}
|
||||
|
||||
message GameEventResponse {
|
||||
ru.m.puzzlez.proto.game.GameEventProto event = 1;
|
||||
repeated ru.m.puzzlez.proto.core.GameEventProto events = 1;
|
||||
}
|
||||
|
||||
message Request {
|
||||
oneof content {
|
||||
LoginRequest login = 1;
|
||||
LogoutRequest logout = 2;
|
||||
ru.m.puzzlez.proto.room.RoomRequest room = 3;
|
||||
ru.m.puzzlez.proto.room.RoomListRequest roomList = 4;
|
||||
GameEventRequest gameEvent = 6;
|
||||
|
||||
GameCreateRequest gameCreate = 10;
|
||||
GameLeaveRequest gameJoin = 11;
|
||||
GameLeaveRequest gameLeave = 12;
|
||||
|
||||
GameListRequest gameList = 20;
|
||||
|
||||
GameEventRequest gameEvent = 100;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,9 +70,12 @@ message Response {
|
||||
oneof content {
|
||||
LoginResponse login = 1;
|
||||
LogoutResponse logout = 2;
|
||||
ru.m.puzzlez.proto.room.RoomResponse room = 3;
|
||||
ru.m.puzzlez.proto.room.RoomListResponse roomList = 4;
|
||||
GameEventResponse gameEvent = 6;
|
||||
|
||||
GameResponse game = 10;
|
||||
|
||||
GameListResponse gameList = 20;
|
||||
|
||||
GameEventResponse gameEvent = 100;
|
||||
|
||||
ErrorResponse error = 999;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -9,16 +9,16 @@ import hw.log.BaseLogger.LoggerUtil;
|
||||
import ru.m.puzzlez.core.GameEvent;
|
||||
import ru.m.puzzlez.game.IGameManager;
|
||||
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.game.GameEventProto;
|
||||
import ru.m.puzzlez.proto.pack.ErrorResponse;
|
||||
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.LogoutResponse;
|
||||
import ru.m.puzzlez.proto.pack.Request;
|
||||
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;
|
||||
|
||||
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)));
|
||||
}
|
||||
|
||||
private function listGame():RoomListResponse {
|
||||
private function listGame():GameListResponse {
|
||||
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 {
|
||||
@@ -139,7 +139,7 @@ class GameSession extends ProtoSession<Response, Request> implements GameManager
|
||||
|
||||
public function onCreate(game:ServerGame):Void {
|
||||
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):
|
||||
if (user.uuid == this.user.uuid) {
|
||||
gameId = -1;
|
||||
send(new Response().setRoom(new RoomResponse()));
|
||||
send(new Response().setGame(new GameResponse()));
|
||||
return;
|
||||
}
|
||||
case _:
|
||||
}
|
||||
send(new Response().setRoom(new RoomResponse().setRoom(game.room)));
|
||||
send(new Response().setGame(new GameResponse().setGame(game.proto)));
|
||||
}
|
||||
if (subscribed) {
|
||||
send(new Response().setRoomList(listGame()));
|
||||
send(new Response().setGameList(listGame()));
|
||||
}
|
||||
}
|
||||
|
||||
public function onDelete(game:ServerGame):Void {
|
||||
if (gameId == game.id) {
|
||||
gameId = -1;
|
||||
send(new Response().setRoom(new RoomResponse()));
|
||||
send(new Response().setGame(new GameResponse()));
|
||||
}
|
||||
if (subscribed) {
|
||||
send(new Response().setRoomList(listGame()));
|
||||
send(new Response().setGameList(listGame()));
|
||||
}
|
||||
}
|
||||
|
||||
public function onEvent(game:ServerGame, event:GameEvent):Void {
|
||||
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))
|
||||
])));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
package ru.m.puzzlez.game;
|
||||
|
||||
import ru.m.puzzlez.core.Id;
|
||||
import ru.m.puzzlez.core.GameEvent;
|
||||
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.room.RoomProto;
|
||||
import ru.m.puzzlez.proto.core.UserProto;
|
||||
|
||||
class _GameListener implements GameListener {
|
||||
@@ -37,7 +35,6 @@ class _GameListener implements GameListener {
|
||||
@:dispatcher(GameManagerListener) class GameManager implements IGameManager {
|
||||
public var games(default, null):Array<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>;
|
||||
|
||||
private var counter:Int;
|
||||
@@ -46,26 +43,18 @@ class _GameListener implements GameListener {
|
||||
counter = 0;
|
||||
games = [];
|
||||
gamesById = new Map();
|
||||
gamesByCreator = new Map();
|
||||
gamesByUser = new Map();
|
||||
}
|
||||
|
||||
public function create(user:UserProto):ServerGame {
|
||||
public function create(user:UserProto, imageId:ImageId):ServerGame {
|
||||
if (gamesByCreator.exists(user.uuid)) {
|
||||
delete(gamesByCreator[user.uuid].id);
|
||||
}
|
||||
var room = new RoomProto()
|
||||
.setGame(
|
||||
new GameProto()
|
||||
.setId(++counter)
|
||||
)
|
||||
.setCreator(user);
|
||||
var game = new ServerGame(room);
|
||||
var slots:Array<RoomSlotProto> = [];
|
||||
game.room.setSlots(slots);
|
||||
var gameProto = new GameProto().setId(++counter).setImageId(imageId);
|
||||
gameProto.users.push(user);
|
||||
var game = new ServerGame(gameProto);
|
||||
games.push(game);
|
||||
gamesById[game.id] = game;
|
||||
gamesByCreator[game.room.creator.uuid] = game;
|
||||
createSignal.emit(game);
|
||||
join(game.id, user);
|
||||
return game;
|
||||
@@ -85,15 +74,12 @@ class _GameListener implements GameListener {
|
||||
var game = gamesById[gameId];
|
||||
games.remove(game);
|
||||
gamesById.remove(game.id);
|
||||
gamesByCreator.remove(game.room.creator.uuid);
|
||||
deleteSignal.emit(game);
|
||||
}
|
||||
}
|
||||
|
||||
public function leave(user:UserProto):Void {
|
||||
/*if (gamesByCreator.exists(user.uuid)) {
|
||||
delete(gamesByCreator[user.uuid].proto.id);
|
||||
} else*/ if (gamesByUser.exists(user.uuid)) {
|
||||
if (gamesByUser.exists(user.uuid)) {
|
||||
var game = gamesByUser[user.uuid];
|
||||
gamesByUser.remove(user.uuid);
|
||||
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 {
|
||||
if (gamesById.exists(gameId)) {
|
||||
var game:ServerGame = gamesById[gameId];
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
package ru.m.puzzlez.game;
|
||||
|
||||
import ru.m.puzzlez.core.Id;
|
||||
import hw.signal.Signal;
|
||||
import ru.m.puzzlez.core.GameEvent;
|
||||
import ru.m.puzzlez.proto.core.UserProto;
|
||||
import ru.m.puzzlez.proto.room.SlotProto;
|
||||
|
||||
enum GameChange {
|
||||
JOIN(user:UserProto);
|
||||
LEAVE(user:UserProto);
|
||||
SLOT(user:UserProto, slot:SlotProto);
|
||||
START();
|
||||
}
|
||||
|
||||
@@ -35,10 +34,9 @@ interface GameManagerListener {
|
||||
public function connect(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 join(gameId:Int, user:UserProto):Void;
|
||||
public function slot(user:UserProto, slot:SlotProto):Void;
|
||||
public function leave(user:UserProto):Void;
|
||||
public function start(gameId:Int):Void;
|
||||
}
|
||||
|
||||
@@ -1,29 +1,28 @@
|
||||
package ru.m.puzzlez.game;
|
||||
|
||||
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.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 proto(default, default):GameProto;
|
||||
|
||||
private var timer:Timer;
|
||||
|
||||
public function new(room:RoomProto) {
|
||||
this.room = room;
|
||||
public function new(proto:GameProto) {
|
||||
this.proto = proto;
|
||||
}
|
||||
|
||||
private inline function get_id():Int {
|
||||
return room.game.id;
|
||||
return proto.id;
|
||||
}
|
||||
|
||||
public function contains(user:UserProto):Bool {
|
||||
for (slot in room.slots) {
|
||||
if (slot.hasUser() && slot.user.uuid == user.uuid) {
|
||||
for (user in proto.users) {
|
||||
if (user.uuid == user.uuid) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -32,41 +31,11 @@ import ru.m.puzzlez.proto.room.SlotProto;
|
||||
|
||||
public function join(user:UserProto):Void {
|
||||
if (!contains(user)) {
|
||||
room.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;
|
||||
}
|
||||
proto.users.push(user);
|
||||
}
|
||||
}
|
||||
|
||||
public function leave(user:UserProto):Void {
|
||||
for (slot in room.slots) {
|
||||
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 [];
|
||||
proto.setUsers(proto.users.filter(function(u:UserProto) return u.uuid != user.uuid));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user