func (Lobby) LobbySpectatorJoin(server *wsevent.Server, so *wsevent.Client, data []byte) []byte { reqerr := chelpers.FilterRequest(so, authority.AuthAction(0), true) if reqerr != nil { bytes, _ := json.Marshal(reqerr) return bytes } var args struct { Id *uint `json:"id"` } if err := chelpers.GetParams(data, &args); err != nil { return helpers.NewTPErrorFromError(err).Encode() } var lob *models.Lobby lob, tperr := models.GetLobbyById(*args.Id) if tperr != nil { return tperr.Encode() } player, tperr := models.GetPlayerBySteamId(chelpers.GetSteamId(so.Id())) if tperr != nil { return tperr.Encode() } var specSameLobby bool arr, tperr := player.GetSpectatingIds() if len(arr) != 0 { for _, id := range arr { if id == *args.Id { specSameLobby = true continue } lobby, _ := models.GetLobbyById(id) lobby.RemoveSpectator(player, true) server.RemoveClient(so.Id(), fmt.Sprintf("%d_public", id)) } } // If the player is already in the lobby (either joined a slot or is spectating), don't add them. // Just Broadcast the lobby to them, so the frontend displays it. if id, _ := player.GetLobbyId(); id != *args.Id && !specSameLobby { tperr = lob.AddSpectator(player) if tperr != nil { return tperr.Encode() } chelpers.AfterLobbySpec(server, so, lob) } models.BroadcastLobbyToUser(lob, player.SteamId) return chelpers.EmptySuccessJS }
func AfterLobbyJoin(server *wsevent.Server, so *wsevent.Client, lobby *models.Lobby, player *models.Player) { room := fmt.Sprintf("%s_private", GetLobbyRoom(lobby.ID)) server.AddClient(so, room) bytes, _ := json.Marshal(models.DecorateLobbyData(lobby, false)) broadcaster.SendMessage(player.SteamId, "lobbyJoined", string(bytes)) }
func SetupHTTPRoutes(server *wsevent.Server, noauth *wsevent.Server) { http.HandleFunc("/", controllers.MainHandler) http.HandleFunc("/openidcallback", controllers.LoginCallbackHandler) http.HandleFunc("/startLogin", controllers.LoginHandler) http.HandleFunc("/logout", controllers.LogoutHandler) if config.Constants.MockupAuth { http.HandleFunc("/startMockLogin/", controllers.MockLoginHandler) } http.HandleFunc("/websocket/", func(w http.ResponseWriter, r *http.Request) { if config.Constants.SteamIDWhitelist != "" { session, err := chelpers.GetSessionHTTP(r) allowed := true if err == nil { steamid, ok := session.Values["steam_id"] if !ok { allowed = false } else if !chelpers.IsSteamIDWhitelisted(steamid.(string)) { allowed = false } } else { allowed = false } if !allowed { http.Error(w, "Sorry, but you're not in the closed alpha", 403) return } } session, err := chelpers.GetSessionHTTP(r) var so *wsevent.Client if err == nil { _, ok := session.Values["steam_id"] if ok { so, err = server.NewClient(upgrader, w, r) } else { so, err = noauth.NewClient(upgrader, w, r) } } else { var estr = "Couldn't create WebSocket connection." //estr = err.Error() http.Error(w, estr, 500) return } if err != nil || so == nil { controllers.LogoutSession(w, r) return } //helpers.Logger.Debug("Connected to Socket") err = socket.SocketInit(server, noauth, so) if err != nil { controllers.LogoutSession(w, r) } }) }
func (Global) GetSocketInfo(server *wsevent.Server, so *wsevent.Client, data []byte) []byte { socketinfo := struct { ID string `json:"id"` Rooms []string `json:"rooms"` }{so.Id(), server.RoomsJoined(so.Id())} bytes, _ := json.Marshal(socketinfo) return bytes }
func AfterLobbyLeave(server *wsevent.Server, so *wsevent.Client, lobby *models.Lobby, player *models.Player) { //pub := fmt.Sprintf("%s_public", GetLobbyRoom(lobby.ID)) // bytes, _ := json.Marshal(models.DecorateLobbyData(lobby, true)) // broadcaster.SendMessageToRoom(pub, "lobbyData", string(bytes)) bytes, _ := json.Marshal(models.DecorateLobbyLeave(lobby)) broadcaster.SendMessage(player.SteamId, "lobbyLeft", string(bytes)) server.RemoveClient(so.Id(), fmt.Sprintf("%s_private", GetLobbyRoom(lobby.ID))) }
func AfterLobbySpec(server *wsevent.Server, so *wsevent.Client, lobby *models.Lobby) { //remove socket from room of the previous lobby the socket was spectating (if any) lobbyID, ok := sessions.GetSpectating(so.ID) if ok { server.RemoveClient(so, fmt.Sprintf("%d_public", lobbyID)) sessions.RemoveSpectator(so.ID) } server.AddClient(so, fmt.Sprintf("%s_public", GetLobbyRoom(lobby.ID))) chelpers.BroadcastScrollback(so, lobby.ID) sessions.SetSpectator(so.ID, lobby.ID) }
func AfterConnect(server *wsevent.Server, so *wsevent.Client) { server.AddClient(so, fmt.Sprintf("%s_public", config.GlobalChatRoom)) //room for global chat var lobbies []models.Lobby err := db.DB.Where("state = ?", models.LobbyStateWaiting).Order("id desc").Find(&lobbies).Error if err != nil { logrus.Error(err) return } so.EmitJSON(helpers.NewRequest("lobbyListData", models.DecorateLobbyListData(lobbies))) chelpers.BroadcastScrollback(so, 0) so.EmitJSON(helpers.NewRequest("subListData", models.DecorateSubstituteList())) }
func AfterLobbySpec(server *wsevent.Server, so *wsevent.Client, player *player.Player, lob *lobby.Lobby) { //remove socket from room of the previous lobby the socket was spectating (if any) lobbyID, ok := sessions.GetSpectating(so.ID) if ok { server.Leave(so, fmt.Sprintf("%d_public", lobbyID)) sessions.RemoveSpectator(so.ID) if player != nil { prevLobby, _ := lobby.GetLobbyByID(lobbyID) prevLobby.RemoveSpectator(player, true) } } server.Join(so, fmt.Sprintf("%d_public", lob.ID)) chelpers.BroadcastScrollback(so, lob.ID) sessions.SetSpectator(so.ID, lob.ID) }
func AfterConnect(server *wsevent.Server, so *wsevent.Client) { server.AddClient(so, fmt.Sprintf("%s_public", config.Constants.GlobalChatRoom)) //room for global chat var lobbies []models.Lobby err := db.DB.Where("state = ?", models.LobbyStateWaiting).Order("id desc").Find(&lobbies).Error if err != nil { helpers.Logger.Critical("%s", err.Error()) return } bytes, _ := json.Marshal(models.DecorateLobbyListData(lobbies)) if err != nil { helpers.Logger.Critical("Failed to send lobby list: %s", err.Error()) return } so.EmitJSON(helpers.NewRequest("lobbyListData", string(bytes))) BroadcastScrollback(so, 0) bytes, _ = json.Marshal(helpers.NewRequestFromObj("subListData", models.GetSubList())) so.EmitJSON(helpers.NewRequest("subListData", string(bytes))) }
func (Lobby) LobbyJoin(server *wsevent.Server, so *wsevent.Client, data []byte) []byte { reqerr := chelpers.FilterRequest(so, authority.AuthAction(0), true) if reqerr != nil { return reqerr.Encode() } var args struct { Id *uint `json:"id"` Class *string `json:"class"` Team *string `json:"team" valid:"red,blu"` } if err := chelpers.GetParams(data, &args); err != nil { return helpers.NewTPErrorFromError(err).Encode() } //helpers.Logger.Debug("id %d class %s team %s", *args.Id, *args.Class, *args.Team) player, tperr := models.GetPlayerBySteamId(chelpers.GetSteamId(so.Id())) if tperr != nil { return tperr.Encode() } lob, tperr := models.GetLobbyById(*args.Id) if tperr != nil { return tperr.Encode() } if lob.State == models.LobbyStateEnded { return helpers.NewTPError("Cannot join a closed lobby.", -1).Encode() } //Check if player is in the same lobby var sameLobby bool if id, err := player.GetLobbyId(); err == nil && id == *args.Id { sameLobby = true } slot, tperr := models.LobbyGetPlayerSlot(lob.Type, *args.Team, *args.Class) if tperr != nil { return tperr.Encode() } if prevId, err := player.GetLobbyId(); err != nil { server.RemoveClient(so.Id(), fmt.Sprintf("%d_public", prevId)) server.RemoveClient(so.Id(), fmt.Sprintf("%d_private", prevId)) } tperr = lob.AddPlayer(player, slot, *args.Team, *args.Class) if tperr != nil { return tperr.Encode() } if !sameLobby { chelpers.AfterLobbyJoin(server, so, lob, player) } if lob.IsFull() { lob.State = models.LobbyStateReadyingUp lob.ReadyUpTimestamp = time.Now().Unix() + 30 lob.Save() tick := time.After(time.Second * 30) id := lob.ID stop := make(chan struct{}) go func() { select { case <-tick: lobby := &models.Lobby{} db.DB.First(lobby, id) if lobby.State != models.LobbyStateInProgress { err := lobby.RemoveUnreadyPlayers() if err != nil { helpers.Logger.Error("RemoveUnreadyPlayers: ", err.Error()) err = nil } err = lobby.UnreadyAllPlayers() if err != nil { helpers.Logger.Error("UnreadyAllPlayers: ", err.Error()) } lobby.State = models.LobbyStateWaiting lobby.Save() } case <-stop: return } }() room := fmt.Sprintf("%s_private", chelpers.GetLobbyRoom(lob.ID)) broadcaster.SendMessageToRoom(room, "lobbyReadyUp", `{"timeout":30}`) models.BroadcastLobbyList() } err := models.AllowPlayer(*args.Id, player.SteamId, *args.Team+*args.Class) if err != nil { helpers.Logger.Error(err.Error()) } if lob.State == models.LobbyStateInProgress { bytes, _ := json.Marshal(models.DecorateLobbyConnect(lob, player.Name, *args.Class)) broadcaster.SendMessage(player.SteamId, "lobbyStart", string(bytes)) } return chelpers.EmptySuccessJS }
func AfterLobbySpecLeave(server *wsevent.Server, so *wsevent.Client, lobby *models.Lobby) { server.RemoveClient(so.Id(), fmt.Sprintf("%s_public", GetLobbyRoom(lobby.ID))) }
func AfterLobbySpec(server *wsevent.Server, so *wsevent.Client, lobby *models.Lobby) { server.AddClient(so, fmt.Sprintf("%s_public", GetLobbyRoom(lobby.ID))) BroadcastScrollback(so, lobby.ID) }
func ServerInit(server *wsevent.Server, noAuthServer *wsevent.Server) { server.OnDisconnect = onDisconnect server.Extractor = getEvent noAuthServer.OnDisconnect = onDisconnect noAuthServer.Extractor = getEvent server.On("authenticationTest", func(server *wsevent.Server, so *wsevent.Client, data []byte) []byte { reqerr := chelpers.FilterRequest(so, 0, true) if reqerr != nil { bytes, _ := json.Marshal(reqerr) return bytes } bytes, _ := json.Marshal(struct { Message string `json:"message"` }{"authenticated"}) return bytes }) //Global Handlers server.Register(handler.Global{}) //Lobby Handlers server.Register(handler.Lobby{}) //server.On("lobbyCreate", handler.LobbyCreate) //Player Handlers server.Register(handler.Player{}) //Chat Handlers server.Register(handler.Chat{}) //Admin Handlers server.Register(handler.Admin{}) //Debugging handlers // if config.Constants.ServerMockUp { // server.On("debugLobbyFill", handler.DebugLobbyFill) // server.On("debugLobbyReady", handler.DebugLobbyReady) // server.On("debugUpdateStatsFilter", handler.DebugUpdateStatsFilter) // server.On("debugPlayerSub", handler.DebugPlayerSub) // } noAuthServer.On("lobbySpectatorJoin", func(s *wsevent.Server, so *wsevent.Client, data []byte) []byte { var args struct { Id *uint `json:"id"` } if err := chelpers.GetParams(data, &args); err != nil { return helpers.NewTPErrorFromError(err).Encode() } var lob *models.Lobby lob, tperr := models.GetLobbyById(*args.Id) if tperr != nil { return tperr.Encode() } chelpers.AfterLobbySpec(s, so, lob) bytes, _ := json.Marshal(models.DecorateLobbyData(lob, true)) so.EmitJSON(helpers.NewRequest("lobbyData", string(bytes))) return chelpers.EmptySuccessJS }) noAuthServer.On("getSocketInfo", (handler.Global{}).GetSocketInfo) noAuthServer.DefaultHandler = func(_ *wsevent.Server, so *wsevent.Client, data []byte) []byte { return helpers.NewTPError("Player isn't logged in.", -4).Encode() } }