From 4e316fce10d0419d107e3f6bac647293548ce42e Mon Sep 17 00:00:00 2001 From: giongto35 Date: Sun, 19 May 2019 20:00:24 +0800 Subject: [PATCH] Update save and load --- overlord/browser.go | 127 +++++++++++--------------------------------- overlord/session.go | 1 + worker/overlord.go | 61 ++++++++++++++++++--- 3 files changed, 84 insertions(+), 105 deletions(-) diff --git a/overlord/browser.go b/overlord/browser.go index a96113e4..f1327827 100644 --- a/overlord/browser.go +++ b/overlord/browser.go @@ -29,7 +29,7 @@ func (s *Session) RouteBrowser() { }) browserClient.Receive("initwebrtc", func(resp cws.WSPacket) cws.WSPacket { - log.Println("Overlord: Received a sdp request from a browser") + log.Println("Overlord: Received sdp request from a browser") log.Println("Overlord: Relay sdp request from a browser to worker") // relay SDP to target worker and get back SDP of the worker @@ -44,7 +44,7 @@ func (s *Session) RouteBrowser() { }) browserClient.Receive("quit", func(resp cws.WSPacket) (req cws.WSPacket) { - log.Println("Overlord: Received a relay quit request from a browser") + log.Println("Overlord: Received quit request from a browser") log.Println("Overlord: Relay quit request from a browser to worker") // TODO: Async @@ -57,10 +57,26 @@ func (s *Session) RouteBrowser() { }) browserClient.Receive("start", func(resp cws.WSPacket) cws.WSPacket { - log.Println("Overlord: Received a relay start request from a browser") + log.Println("Overlord: Received start request from a browser") log.Println("Overlord: Relay start request from a browser to worker") // TODO: Async resp.SessionID = s.ID + workerResp := s.handler.workerClients[s.ServerID].SyncSend( + resp, + ) + // Response from worker contains initialized roomID. Set roomID to the session + s.RoomID = workerResp.RoomID + log.Println("Received room response from browser: ", workerResp.RoomID) + + return workerResp + }) + + browserClient.Receive("save", func(resp cws.WSPacket) (req cws.WSPacket) { + log.Println("Overlord: Received save request from a browser") + log.Println("Overlord: Relay save request from a browser to worker") + // TODO: Async + resp.SessionID = s.ID + resp.RoomID = s.RoomID resp = s.handler.workerClients[s.ServerID].SyncSend( resp, ) @@ -68,101 +84,18 @@ func (s *Session) RouteBrowser() { return resp }) - // TODO: Add save and load - //browserClient.Receive("save", func(resp cws.WSPacket) (req cws.WSPacket) { - //log.Println("Saving game state") - //req.ID = "save" - //req.Data = "ok" - //if s.RoomID != "" { - //room := s.handler.getRoom(s.RoomID) - //if room == nil { - //return - //} - //err := room.SaveGame() - //if err != nil { - //log.Println("[!] Cannot save game state: ", err) - //req.Data = "error" - //} - //} else { - //req.Data = "error" - //} + browserClient.Receive("load", func(resp cws.WSPacket) (req cws.WSPacket) { + log.Println("Overlord: Received load request from a browser") + log.Println("Overlord: Relay load request from a browser to worker") + // TODO: Async + resp.SessionID = s.ID + resp.RoomID = s.RoomID + resp = s.handler.workerClients[s.ServerID].SyncSend( + resp, + ) - //return req - //}) - - //browserClient.Receive("load", func(resp cws.WSPacket) (req cws.WSPacket) { - //log.Println("Loading game state") - //req.ID = "load" - //req.Data = "ok" - //if s.RoomID != "" { - //room := s.handler.getRoom(s.RoomID) - //err := room.LoadGame() - //if err != nil { - //log.Println("[!] Cannot load game state: ", err) - //req.Data = "error" - //} - //} else { - //req.Data = "error" - //} - - //return req - //}) - - //browserClient.Receive("start", func(resp cws.WSPacket) (req cws.WSPacket) { - //s.GameName = resp.Data - //s.RoomID = resp.RoomID - //s.PlayerIndex = resp.PlayerIndex - - //log.Println("Starting game") - //// If we are connecting to overlord, request corresponding serverID based on roomID - //if s.OverlordClient != nil { - //roomServerID := getServerIDOfRoom(s.OverlordClient, s.RoomID) - //log.Println("Server of RoomID ", s.RoomID, " is ", roomServerID, " while current server is ", s.ServerID) - //// If the target serverID is different from current serverID - //if roomServerID != "" && s.ServerID != roomServerID { - //// TODO: Re -register - //// Bridge Connection to the target serverID - //go s.bridgeConnection(roomServerID, s.GameName, s.RoomID, s.PlayerIndex) - //return - //} - //} - - //// Get Room in local server - //// TODO: check if roomID is in the current server - //room := s.handler.getRoom(s.RoomID) - //log.Println("Got Room from local ", room, " ID: ", s.RoomID) - //// If room is not running - //if room == nil { - //// Create new room - //room = s.handler.createNewRoom(s.GameName, s.RoomID, s.PlayerIndex) - //// Wait for done signal from room - //go func() { - //<-room.Done - //s.handler.detachRoom(room.ID) - //}() - //} - - //// Attach peerconnection to room. If PC is already in room, don't detach - //log.Println("Is PC in room", room.IsPCInRoom(s.peerconnection)) - //if !room.IsPCInRoom(s.peerconnection) { - //s.handler.detachPeerConn(s.peerconnection) - //room.AddConnectionToRoom(s.peerconnection, s.PlayerIndex) - //} - //s.RoomID = room.ID - - //// Register room to overlord if we are connecting to overlord - //if room != nil && s.OverlordClient != nil { - //s.OverlordClient.Send(cws.WSPacket{ - //ID: "registerRoom", - //Data: s.RoomID, - //}, nil) - //} - //req.ID = "start" - //req.RoomID = s.RoomID - //req.SessionID = s.ID - - //return req - //}) + return resp + }) } // NewOverlordClient returns a client connecting to browser. This connection exchanges information between clients and server diff --git a/overlord/session.go b/overlord/session.go index f1cb1565..43db8479 100644 --- a/overlord/session.go +++ b/overlord/session.go @@ -15,4 +15,5 @@ type Session struct { handler *Server ServerID string + RoomID string } diff --git a/worker/overlord.go b/worker/overlord.go index 196de07a..00c5e8d6 100644 --- a/worker/overlord.go +++ b/worker/overlord.go @@ -22,19 +22,19 @@ func NewOverlordClient(oc *websocket.Conn) *OverlordClient { return nil } - oclient := &OverlordClient{ + oClient := &OverlordClient{ Client: cws.NewClient(oc), } - return oclient + return oClient } // RouteOverlord are all routes server received from overlord func (h *Handler) RouteOverlord() { iceCandidates := [][]byte{} - oclient := h.oClient + oClient := h.oClient // Received from overlord the serverID - oclient.Receive( + oClient.Receive( "serverID", func(response cws.WSPacket) (request cws.WSPacket) { // Stick session with serverID got from overlord @@ -45,7 +45,7 @@ func (h *Handler) RouteOverlord() { }, ) - oclient.Receive( + oClient.Receive( "initwebrtc", func(resp cws.WSPacket) (req cws.WSPacket) { log.Println("Received relay SDP of a browser from overlord") @@ -73,7 +73,7 @@ func (h *Handler) RouteOverlord() { }, ) - oclient.Receive( + oClient.Receive( "start", func(resp cws.WSPacket) (req cws.WSPacket) { log.Println("Received a start request from overlord") @@ -93,7 +93,7 @@ func (h *Handler) RouteOverlord() { }, ) - oclient.Receive( + oClient.Receive( "quit", func(resp cws.WSPacket) (req cws.WSPacket) { log.Println("Received a quit request from overlord") @@ -111,7 +111,52 @@ func (h *Handler) RouteOverlord() { }, ) - oclient.Receive( + oClient.Receive( + "save", + func(resp cws.WSPacket) (req cws.WSPacket) { + log.Println("Received a save game from overlord") + log.Println("RoomID:", resp.RoomID) + req.ID = "save" + req.Data = "ok" + if resp.RoomID != "" { + room := h.getRoom(resp.RoomID) + if room == nil { + return + } + err := room.SaveGame() + if err != nil { + log.Println("[!] Cannot save game state: ", err) + req.Data = "error" + } + } else { + req.Data = "error" + } + + return req + }) + + oClient.Receive( + "load", + func(resp cws.WSPacket) (req cws.WSPacket) { + log.Println("Received a load game from overlord") + log.Println("Loading game state") + req.ID = "load" + req.Data = "ok" + if resp.RoomID != "" { + room := h.getRoom(resp.RoomID) + err := room.LoadGame() + if err != nil { + log.Println("[!] Cannot load game state: ", err) + req.Data = "error" + } + } else { + req.Data = "error" + } + + return req + }) + + oClient.Receive( "terminateSession", func(resp cws.WSPacket) (req cws.WSPacket) { log.Println("Received a terminate session ", resp.SessionID)