func TwitchBadge(w http.ResponseWriter, r *http.Request) { if !reValidPath.MatchString(r.URL.Path) { http.NotFound(w, r) return } matches := reValidPath.FindStringSubmatch(r.URL.Path) steamid := matches[1] player, err := player.GetPlayerBySteamID(steamid) if err != nil { //player not found http.Error(w, "Player with given SteamID not found", http.StatusNotFound) return } id, err := player.GetLobbyID(false) if err != nil { //player not in lobby right now, just serve a page that refreshes every 5 seconds w.Write([]byte(emptyPage)) return } lobby, _ := lobby.GetLobbyByID(id) err = twitchBadge.Execute(w, lobby) }
func (Player) PlayerNotReady(so *wsevent.Client, _ struct{}) interface{} { player := chelpers.GetPlayer(so.Token) lobbyid, tperr := player.GetLobbyID(false) if tperr != nil { return tperr } lob, err := lobby.GetLobbyByID(lobbyid) if err != nil { return err } if lob.State != lobby.ReadyingUp { return errors.New("Lobby hasn't been filled up yet.") } err = lob.UnreadyPlayer(player) lob.RemovePlayer(player) hooks.AfterLobbyLeave(lob, player, false, false) if spec := sessions.IsSpectating(so.ID, lob.ID); spec { // IsSpectating checks if the player has joined the lobby's public room lob.AddSpectator(player) } if tperr != nil { return tperr } lob.SetState(lobby.Waiting) lob.UnreadyAllPlayers() lobby.BroadcastLobby(lob) return emptySuccess }
func (Player) PlayerReady(so *wsevent.Client, _ struct{}) interface{} { player := chelpers.GetPlayer(so.Token) lobbyid, tperr := player.GetLobbyID(false) if tperr != nil { return tperr } lob, err := lobby.GetLobbyByIDServer(lobbyid) if err != nil { return err } if lob.State != lobby.ReadyingUp { return errors.New("Lobby hasn't been filled up yet.") } err = lob.ReadyPlayer(player) if err != nil { return err } if lob.IsEveryoneReady() { lob.Start() hooks.BroadcastLobbyStart(lob) lobby.BroadcastLobbyList() } return emptySuccess }
func (Player) PlayerSettingsSet(so *wsevent.Client, args struct { Key *string `json:"key"` Value *string `json:"value"` }) interface{} { player := chelpers.GetPlayer(so.Token) switch *args.Key { case "siteAlias": if len(*args.Value) > 32 { return errors.New("Site alias must be under 32 characters long.") } player.SetSetting(*args.Key, *args.Value) player.SetPlayerProfile() so.EmitJSON(helpers.NewRequest("playerProfile", player)) if lobbyID, _ := player.GetLobbyID(true); lobbyID != 0 { lob, _ := lobby.GetLobbyByID(lobbyID) slot, _ := lob.GetPlayerSlot(player) player.SetMumbleUsername(lob.Type, slot) lobby.BroadcastLobby(lob) } default: player.SetSetting(*args.Key, *args.Value) } return emptySuccess }
func (Lobby) LobbySpectatorJoin(so *wsevent.Client, args struct { Id *uint `json:"id"` }) interface{} { lob, err := lobby.GetLobbyByID(*args.Id) if err != nil { return err } player := chelpers.GetPlayer(so.Token) var specSameLobby bool arr, tperr := player.GetSpectatingIds() if len(arr) != 0 { for _, id := range arr { if id == *args.Id { specSameLobby = true continue } //a socket should only spectate one lobby, remove socket from //any other lobby room //multiple sockets from one player can spectatte multiple lobbies socket.AuthServer.Leave(so, 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(false); id != *args.Id && !specSameLobby { tperr = lob.AddSpectator(player) if tperr != nil { return tperr } } hooks.AfterLobbySpec(socket.AuthServer, so, player, lob) lobby.BroadcastLobbyToUser(lob, player.SteamID) return emptySuccess }
func (Lobby) LobbySpectatorLeave(so *wsevent.Client, args struct { Id *uint `json:"id"` }) interface{} { player := chelpers.GetPlayer(so.Token) lob, tperr := lobby.GetLobbyByID(*args.Id) if tperr != nil { return tperr } if !player.IsSpectatingID(lob.ID) { if id, _ := player.GetLobbyID(false); id == *args.Id { hooks.AfterLobbySpecLeave(so, lob) return emptySuccess } } lob.RemoveSpectator(player, true) hooks.AfterLobbySpecLeave(so, lob) return emptySuccess }