From b520dd19f31392bbb52652d60efe3f48accbbafc Mon Sep 17 00:00:00 2001 From: giongto35 Date: Sun, 9 Jun 2019 15:34:11 +0800 Subject: [PATCH] Join room directly (#53) --- emulator/director.go | 12 +++++------- emulator/gameview.go | 4 ++-- static/js/init.js | 2 +- worker/room/room.go | 32 +++++++++++++++++++++++--------- 4 files changed, 31 insertions(+), 19 deletions(-) diff --git a/emulator/director.go b/emulator/director.go index f2da2700..9374cc3a 100644 --- a/emulator/director.go +++ b/emulator/director.go @@ -63,18 +63,16 @@ func (d *Director) Step() { } // Start ... -func (d *Director) Start(paths []string) { +func (d *Director) Start(path string) { // portaudio.Initialize() // defer portaudio.Terminate() // audio := NewAudio() // audio.Start() // d.audio = audio - log.Println("Start game: ", paths) + log.Println("Start game: ", path) - if len(paths) == 1 { - d.PlayGame(paths[0]) - } + d.PlayGame(path) d.Run() } @@ -115,7 +113,7 @@ func (d *Director) PlayGame(path string) { // SaveGame creates save events and doing extra step for load func (d *Director) SaveGame(saveExtraFunc func() error) error { if d.roomID != "" { - d.view.Save(d.roomID, saveExtraFunc) + d.view.Save(saveExtraFunc) return nil } else { return nil @@ -125,7 +123,7 @@ func (d *Director) SaveGame(saveExtraFunc func() error) error { // LoadGame creates load events and doing extra step for load func (d *Director) LoadGame() error { if d.roomID != "" { - d.view.Load(d.roomID) + d.view.Load() return nil } else { return nil diff --git a/emulator/gameview.go b/emulator/gameview.go index 8c7113e2..795e1052 100644 --- a/emulator/gameview.go +++ b/emulator/gameview.go @@ -144,7 +144,7 @@ func (view *GameView) Update(t, dt float64) { view.imageChannel <- console.Buffer() } -func (view *GameView) Save(hash string, extraSaveFunc func() error) { +func (view *GameView) Save(extraSaveFunc func() error) { // put saving event to queue, process in updateEvent view.savingJob = &job{ path: savePath(view.saveFile), @@ -152,7 +152,7 @@ func (view *GameView) Save(hash string, extraSaveFunc func() error) { } } -func (view *GameView) Load(path string) { +func (view *GameView) Load() { // put saving event to queue, process in updateEvent view.loadingJob = &job{ path: savePath(view.saveFile), diff --git a/static/js/init.js b/static/js/init.js index cf5bb5b8..417633c1 100644 --- a/static/js/init.js +++ b/static/js/init.js @@ -27,7 +27,7 @@ function parseURLForRoom() { queryDict[item.split("=")[0]] = item.split("=")[1] }); if (typeof queryDict["id"] === "string") { - return queryDict["id"]; + return decodeURI(queryDict["id"]); } return null; } diff --git a/worker/room/room.go b/worker/room/room.go index 16105efc..8e90ec53 100644 --- a/worker/room/room.go +++ b/worker/room/room.go @@ -8,6 +8,7 @@ import ( "os" "runtime" "strconv" + "strings" "sync" "time" @@ -39,13 +40,15 @@ type Room struct { director *emulator.Director // Cloud storage to store room state online onlineStorage *storage.Client + // GameName + gameName string } // NewRoom creates a new room -func NewRoom(roomID, gamepath, gameName string, onlineStorage *storage.Client) *Room { +func NewRoom(roomID, gamePath, gameName string, onlineStorage *storage.Client) *Room { // if no roomID is given, generate it if roomID == "" { - roomID = generateRoomID() + roomID = generateRoomID(gameName) } log.Println("Init new room", roomID, gameName) imageChannel := make(chan *image.RGBA, 30) @@ -74,8 +77,7 @@ func NewRoom(roomID, gamepath, gameName string, onlineStorage *storage.Client) * go room.startAudio() // Check if room is on local storage, if not, pull from GCS to local storage - path := gamepath + "/" + gameName - go func(path, roomID string) { + go func(gamePath, gameName, roomID string) { // Check room is on local or fetch from server savepath := emulator.GetSavePath(roomID) log.Println("Check ", savepath, " on local : ", room.isGameOnLocal(savepath)) @@ -87,21 +89,33 @@ func NewRoom(roomID, gamepath, gameName string, onlineStorage *storage.Client) * } } - log.Printf("Room %s started", roomID) - director.Start([]string{path}) + if roomID != "" { + gameName = getGameNameFromRoomID(roomID) + } + log.Printf("Room %s started. GameName: %s", roomID, gameName) + path := gamePath + "/" + gameName + director.Start(path) log.Printf("Room %s ended", roomID) start := time.Now() runtime.GC() log.Printf("GC takes %s\n", time.Since(start)) - }(path, roomID) + }(gamePath, gameName, roomID) return room } +func getGameNameFromRoomID(roomID string) string { + parts := strings.Split(roomID, "-") + if len(parts) <= 1 { + return "" + } + return parts[1] +} + // generateRoomID generate a unique room ID containing 16 digits -func generateRoomID() string { - roomID := strconv.FormatInt(rand.Int63(), 16) +func generateRoomID(gameName string) string { + roomID := strconv.FormatInt(rand.Int63(), 16) + "-" + gameName log.Println("Generate Room ID", roomID) //roomID := uuid.Must(uuid.NewV4()).String() return roomID