diff --git a/gametable/server.go b/gametable/server.go index 8b579e9..ed4a728 100644 --- a/gametable/server.go +++ b/gametable/server.go @@ -1,7 +1,7 @@ package gametable import ( - "bytes" + "bytes" "context" "encoding/json" "errors" @@ -16,6 +16,7 @@ import ( "log" "net/http" "nhooyr.io/websocket" + "strings" "sync" "time" ) @@ -56,7 +57,15 @@ func (self *GameTableServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { } func (self *GameTableServer) subscribeHandler(w http.ResponseWriter, r *http.Request) { - c, err := websocket.Accept(w, r, nil) + protocols, err := self.dbAdapter.GetProtocols() + if err != nil { + self.logf("%v", err) + return + } + + c, err := websocket.Accept(w, r, &websocket.AcceptOptions{ + Subprotocols: protocols, + }) if err != nil { self.logf("%v", err) return @@ -87,14 +96,16 @@ func (self *GameTableServer) subscribe(r *http.Request, c *websocket.Conn) error c.Close(websocket.StatusPolicyViolation, "connection too slow to keep up with messages") }, } - - tableKey := models.TableKey{} - err := json.NewDecoder(r.Body).Decode(&tableKey) - if err != nil { - fmt.Println(err.Error()) - return err + subprotoParts := strings.Split(c.Subprotocol(), ".") + if len(subprotoParts) != 2 { + return errors.New("Couldn't decode subprotocol") + } + tableKey := models.TableKey{ + Name: subprotoParts[0], + Passcode: subprotoParts[1], } + // subprotocol is guaranteed to be an existing table, but maybe just leave this here if !self.dbAdapter.CheckTable(tableKey) { return errors.New("Table with matching key was not found on this server") } @@ -165,12 +176,32 @@ func (self *GameTableServer) publish(msg []byte) { } } -func (self *GameTableServer) getCurrentState(tableKey models.TableKey) ([]byte) { +func (self *GameTableServer) getCurrentState(tableKey models.TableKey) []byte { // get diceroll log, map, and token state + if self.dbAdapter.CheckTable(tableKey) { + mapUrl, _ := self.dbAdapter.GetMapImageUrl(tableKey) + auxMessage, _ := self.dbAdapter.GetAuxMessage(tableKey) + availableTokens, _ := self.dbAdapter.GetTokens(tableKey, true) + activeTokens, _ := self.dbAdapter.GetTokens(tableKey, false) + diceRolls, _ := self.dbAdapter.GetDiceRolls(tableKey) - // build into a []byte message - - return make([]byte, 1) + table := models.Table{ + Name: tableKey.Name, + Passcode: tableKey.Passcode, + DiceRolls: diceRolls, + MapImageUrl: mapUrl, + Tokens: activeTokens, + AvailableTokens: availableTokens, + AuxMessage: auxMessage, + } + data, err := json.Marshal(table) + if err != nil { + return []byte("{\"error\": \"" + err.Error() + "\"}") + } else { + return data + } + } + return []byte("{\"error\": \"table not found\"}") } func (self *GameTableServer) writeToDB(tableMsg models.TableMessage) error { diff --git a/mongodb/adapter.go b/mongodb/adapter.go index e02262c..650cbf9 100644 --- a/mongodb/adapter.go +++ b/mongodb/adapter.go @@ -23,6 +23,7 @@ type DbAdapter interface { DestroyTable(table models.TableKey) error CheckTable(table models.TableKey) bool + GetProtocols() ([]string, error) InsertDiceRoll(table models.TableKey, diceRoll models.DiceRoll) error GetDiceRolls(table models.TableKey) ([]models.DiceRoll, error) @@ -134,6 +135,30 @@ func (self *DbEngine) CheckTable(table models.TableKey) bool { return false } +func (self *DbEngine) GetProtocols() ([]string, error) { + tables := self.db.Collection("tables") + if tables != nil { + var results []models.Table + cursor, err := tables.Find(self.mkCtx(10), bson.D{}) + if err != nil { + return []string{}, err + } + + if err = cursor.All(self.mkCtx(10), &results); err != nil { + return []string{}, err + } + + var protocols []string + + for _, t := range results { + protocols = append(protocols, fmt.Sprintf("%s.%s", t.Name, t.Passcode)) + } + return protocols, nil + + } + return []string{}, errors.New(fmt.Sprintf(errNoCollection, "tables")) +} + func (self *DbEngine) InsertDiceRoll(table models.TableKey, diceRoll models.DiceRoll) error { tables := self.db.Collection("tables") if tables != nil { diff --git a/static/index.html b/static/index.html index ef49402..6c50547 100644 --- a/static/index.html +++ b/static/index.html @@ -11,9 +11,14 @@
+