func (Lobby) LobbySpectatorLeave(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"` } if err := chelpers.GetParams(data, &args); err != nil { return helpers.NewTPErrorFromError(err).Encode() } steamId := chelpers.GetSteamId(so.Id()) player, tperr := models.GetPlayerBySteamId(steamId) if tperr != nil { return tperr.Encode() } lob, tperr := models.GetLobbyById(*args.Id) if tperr != nil { return tperr.Encode() } if !player.IsSpectatingId(lob.ID) { if id, _ := player.GetLobbyId(); id == *args.Id { chelpers.AfterLobbySpecLeave(server, so, lob) return chelpers.EmptySuccessJS } return helpers.NewTPError("Player is not spectating", -1).Encode() } lob.RemoveSpectator(player, true) chelpers.AfterLobbySpecLeave(server, so, lob) return chelpers.EmptySuccessJS }
func LobbyKick(so socketio.Socket) func(string) string { return chelpers.FilterRequest(so, lobbyKickFilters, func(params map[string]interface{}) string { steamid := params["steamid"].(string) ban := params["ban"].(bool) lobbyid := params["id"].(uint) var self bool selfSteamid := chelpers.GetSteamId(so.Id()) // TODO check authorization, currently can kick anyone if steamid == "" { self = true steamid = selfSteamid } //player to kick player, tperr := models.GetPlayerBySteamId(steamid) if tperr != nil { bytes, _ := tperr.ErrorJSON().Encode() return string(bytes) } lob, tperr := models.GetLobbyById(uint(lobbyid)) if tperr != nil { bytes, _ := chelpers.BuildFailureJSON(tperr.Error(), -1).Encode() return string(bytes) } if !self && selfSteamid != lob.CreatedBySteamID { // TODO proper authorization checks bytes, _ := chelpers.BuildFailureJSON( "Not authorized to remove players", 1).Encode() return string(bytes) } _, err := lob.GetPlayerSlot(player) helpers.LockRecord(lob.ID, lob) defer helpers.UnlockRecord(lob.ID, lob) var spec bool if err == nil { lob.RemovePlayer(player) } else if player.IsSpectatingId(lob.ID) { spec = true lob.RemoveSpectator(player) } else { bytes, _ := chelpers.BuildFailureJSON("Player neither playing nor spectating", 2).Encode() return string(bytes) } if ban { lob.BanPlayer(player) } if !spec { chelpers.AfterLobbyLeave(so, lob, player) } else { chelpers.AfterLobbySpecLeave(so, lob) } if !self { broadcaster.SendMessage(steamid, "sendNotification", fmt.Sprintf("You have been removed from Lobby #%d", lobbyid)) } bytes, _ := chelpers.BuildSuccessJSON(simplejson.New()).Encode() return string(bytes) }) }