From 0fb86393236fd88de9b406f4314873dfc59387b8 Mon Sep 17 00:00:00 2001 From: Jordan Roher Date: Sat, 12 Oct 2024 12:33:25 -0700 Subject: [PATCH 1/5] Added static content for index page --- website/index.html | 295 ++- website/public/PlayFabAdminApi.js | 1398 +++++++------- website/public/PlayFabClientApi.js | 2120 +++++++++++----------- website/public/PlayFabCloudScriptApi.js | 614 +++---- website/public/PlayFabEconomyApi.js | 862 ++++----- website/public/assets/logo-square.png | Bin 0 -> 42164 bytes website/public/assets/logo-text-dark.png | Bin 0 -> 55088 bytes website/public/assets/playfab-logo.png | Bin 0 -> 2037 bytes 8 files changed, 2704 insertions(+), 2585 deletions(-) create mode 100644 website/public/assets/logo-square.png create mode 100644 website/public/assets/logo-text-dark.png create mode 100644 website/public/assets/playfab-logo.png diff --git a/website/index.html b/website/index.html index b867d07..bf87e39 100644 --- a/website/index.html +++ b/website/index.html @@ -195,94 +195,213 @@
diff --git a/website/public/PlayFabAdminApi.js b/website/public/PlayFabAdminApi.js index 082f48a..a2730eb 100644 --- a/website/public/PlayFabAdminApi.js +++ b/website/public/PlayFabAdminApi.js @@ -1,699 +1,699 @@ -/// - -var PlayFab = typeof PlayFab != "undefined" ? PlayFab : {}; - -if(!PlayFab.settings) { - PlayFab.settings = { - titleId: null, // You must set this value for PlayFabSdk to work properly (Found in the Game Manager for your title, at the PlayFab Website) - developerSecretKey: null, // For security reasons you must never expose this value to the client or players - You must set this value for Server-APIs to work properly (Found in the Game Manager for your title, at the PlayFab Website) - GlobalHeaderInjection: null, - productionServerUrl: ".playfabapi.com" - } -} - -if(!PlayFab._internalSettings) { - PlayFab._internalSettings = { - entityToken: null, - sdkVersion: "1.180.240913", - requestGetParams: { - sdk: "JavaScriptSDK-1.180.240913" - }, - sessionTicket: null, - verticalName: null, // The name of a customer vertical. This is only for customers running a private cluster. Generally you shouldn't touch this - errorTitleId: "Must be have PlayFab.settings.titleId set to call this method", - errorLoggedIn: "Must be logged in to call this method", - errorEntityToken: "You must successfully call GetEntityToken before calling this", - errorSecretKey: "Must have PlayFab.settings.developerSecretKey set to call this method", - - GetServerUrl: function () { - if (!(PlayFab.settings.productionServerUrl.substring(0, 4) === "http")) { - if (PlayFab._internalSettings.verticalName) { - return "https://" + PlayFab._internalSettings.verticalName + PlayFab.settings.productionServerUrl; - } else { - return "https://" + PlayFab.settings.titleId + PlayFab.settings.productionServerUrl; - } - } else { - return PlayFab.settings.productionServerUrl; - } - }, - - InjectHeaders: function (xhr, headersObj) { - if (!headersObj) - return; - - for (var headerKey in headersObj) - { - try { - xhr.setRequestHeader(gHeaderKey, headersObj[headerKey]); - } catch (e) { - console.log("Failed to append header: " + headerKey + " = " + headersObj[headerKey] + "Error: " + e); - } - } - }, - - ExecuteRequest: function (url, request, authkey, authValue, callback, customData, extraHeaders) { - var resultPromise = new Promise(function (resolve, reject) { - if (callback != null && typeof (callback) !== "function") - throw "Callback must be null or a function"; - - if (request == null) - request = {}; - - var startTime = new Date(); - var requestBody = JSON.stringify(request); - - var urlArr = [url]; - var getParams = PlayFab._internalSettings.requestGetParams; - if (getParams != null) { - var firstParam = true; - for (var key in getParams) { - if (firstParam) { - urlArr.push("?"); - firstParam = false; - } else { - urlArr.push("&"); - } - urlArr.push(key); - urlArr.push("="); - urlArr.push(getParams[key]); - } - } - - var completeUrl = urlArr.join(""); - - var xhr = new XMLHttpRequest(); - // window.console.log("URL: " + completeUrl); - xhr.open("POST", completeUrl, true); - - xhr.setRequestHeader("Content-Type", "application/json"); - xhr.setRequestHeader("X-PlayFabSDK", "JavaScriptSDK-" + PlayFab._internalSettings.sdkVersion); - if (authkey != null) - xhr.setRequestHeader(authkey, authValue); - PlayFab._internalSettings.InjectHeaders(xhr, PlayFab.settings.GlobalHeaderInjection); - PlayFab._internalSettings.InjectHeaders(xhr, extraHeaders); - - xhr.onloadend = function () { - if (callback == null) - return; - - var result = PlayFab._internalSettings.GetPlayFabResponse(request, xhr, startTime, customData); - if (result.code === 200) { - callback(result, null); - } else { - callback(null, result); - } - } - - xhr.onerror = function () { - if (callback == null) - return; - - var result = PlayFab._internalSettings.GetPlayFabResponse(request, xhr, startTime, customData); - callback(null, result); - } - - xhr.send(requestBody); - xhr.onreadystatechange = function () { - if (this.readyState === 4) { - var xhrResult = PlayFab._internalSettings.GetPlayFabResponse(request, this, startTime, customData); - if (this.status === 200) { - resolve(xhrResult); - } else { - reject(xhrResult); - } - } - }; - }); - // Return a Promise so that calls to various API methods can be handled asynchronously - return resultPromise; - }, - - GetPlayFabResponse: function(request, xhr, startTime, customData) { - var result = null; - try { - // window.console.log("parsing json result: " + xhr.responseText); - result = JSON.parse(xhr.responseText); - } catch (e) { - result = { - code: 503, // Service Unavailable - status: "Service Unavailable", - error: "Connection error", - errorCode: 2, // PlayFabErrorCode.ConnectionError - errorMessage: xhr.responseText - }; - } - - result.CallBackTimeMS = new Date() - startTime; - result.Request = request; - result.CustomData = customData; - return result; - }, - - authenticationContext: { - PlayFabId: null, - EntityId: null, - EntityType: null, - SessionTicket: null, - EntityToken: null - }, - - UpdateAuthenticationContext: function (authenticationContext, result) { - var authenticationContextUpdates = {}; - if(result.data.PlayFabId !== null) { - PlayFab._internalSettings.authenticationContext.PlayFabId = result.data.PlayFabId; - authenticationContextUpdates.PlayFabId = result.data.PlayFabId; - } - if(result.data.SessionTicket !== null) { - PlayFab._internalSettings.authenticationContext.SessionTicket = result.data.SessionTicket; - authenticationContextUpdates.SessionTicket = result.data.SessionTicket; - } - if (result.data.EntityToken !== null) { - PlayFab._internalSettings.authenticationContext.EntityId = result.data.EntityToken.Entity.Id; - authenticationContextUpdates.EntityId = result.data.EntityToken.Entity.Id; - PlayFab._internalSettings.authenticationContext.EntityType = result.data.EntityToken.Entity.Type; - authenticationContextUpdates.EntityType = result.data.EntityToken.Entity.Type; - PlayFab._internalSettings.authenticationContext.EntityToken = result.data.EntityToken.EntityToken; - authenticationContextUpdates.EntityToken = result.data.EntityToken.EntityToken; - } - // Update the authenticationContext with values from the result - authenticationContext = Object.assign(authenticationContext, authenticationContextUpdates); - return authenticationContext; - }, - - AuthInfoMap: { - "X-EntityToken": { - authAttr: "entityToken", - authError: "errorEntityToken" - }, - "X-Authorization": { - authAttr: "sessionTicket", - authError: "errorLoggedIn" - }, - "X-SecretKey": { - authAttr: "developerSecretKey", - authError: "errorSecretKey" - } - }, - - GetAuthInfo: function (request, authKey) { - // Use the most-recently saved authKey, unless one was provided in the request via the AuthenticationContext - var authError = PlayFab._internalSettings.AuthInfoMap[authKey].authError; - var authAttr = PlayFab._internalSettings.AuthInfoMap[authKey].authAttr; - var defaultAuthValue = null; - if (authAttr === "entityToken") - defaultAuthValue = PlayFab._internalSettings.entityToken; - else if (authAttr === "sessionTicket") - defaultAuthValue = PlayFab._internalSettings.sessionTicket; - else if (authAttr === "developerSecretKey") - defaultAuthValue = PlayFab.settings.developerSecretKey; - var authValue = request.AuthenticationContext ? request.AuthenticationContext[authAttr] : defaultAuthValue; - return {"authKey": authKey, "authValue": authValue, "authError": authError}; - }, - - ExecuteRequestWrapper: function (apiURL, request, authKey, callback, customData, extraHeaders) { - var authValue = null; - if (authKey !== null){ - var authInfo = PlayFab._internalSettings.GetAuthInfo(request, authKey=authKey); - var authKey = authInfo.authKey, authValue = authInfo.authValue, authError = authInfo.authError; - - if (!authValue) throw authError; - } - return PlayFab._internalSettings.ExecuteRequest(PlayFab._internalSettings.GetServerUrl() + apiURL, request, authKey, authValue, callback, customData, extraHeaders); - } - } -} - -PlayFab.buildIdentifier = "adobuild_javascriptsdk_114"; -PlayFab.sdkVersion = "1.180.240913"; -PlayFab.GenerateErrorReport = function (error) { - if (error == null) - return ""; - var fullErrors = error.errorMessage; - for (var paramName in error.errorDetails) - for (var msgIdx in error.errorDetails[paramName]) - fullErrors += "\n" + paramName + ": " + error.errorDetails[paramName][msgIdx]; - return fullErrors; -}; - -PlayFab.AdminApi = { - ForgetAllCredentials: function () { - PlayFab._internalSettings.sessionTicket = null; - PlayFab._internalSettings.entityToken = null; - }, - - AbortTaskInstance: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/AbortTaskInstance", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - AddLocalizedNews: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/AddLocalizedNews", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - AddNews: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/AddNews", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - AddPlayerTag: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/AddPlayerTag", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - AddUserVirtualCurrency: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/AddUserVirtualCurrency", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - AddVirtualCurrencyTypes: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/AddVirtualCurrencyTypes", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - BanUsers: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/BanUsers", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - CheckLimitedEditionItemAvailability: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/CheckLimitedEditionItemAvailability", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - CreateActionsOnPlayersInSegmentTask: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/CreateActionsOnPlayersInSegmentTask", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - CreateCloudScriptTask: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/CreateCloudScriptTask", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - CreateInsightsScheduledScalingTask: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/CreateInsightsScheduledScalingTask", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - CreateOpenIdConnection: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/CreateOpenIdConnection", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - CreatePlayerSharedSecret: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/CreatePlayerSharedSecret", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - CreatePlayerStatisticDefinition: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/CreatePlayerStatisticDefinition", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - CreateSegment: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/CreateSegment", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - DeleteContent: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeleteContent", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - DeleteMasterPlayerAccount: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeleteMasterPlayerAccount", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - DeleteMasterPlayerEventData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeleteMasterPlayerEventData", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - DeleteMembershipSubscription: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeleteMembershipSubscription", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - DeleteOpenIdConnection: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeleteOpenIdConnection", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - DeletePlayer: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeletePlayer", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - DeletePlayerSharedSecret: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeletePlayerSharedSecret", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - DeleteSegment: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeleteSegment", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - DeleteStore: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeleteStore", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - DeleteTask: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeleteTask", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - DeleteTitle: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeleteTitle", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - DeleteTitleDataOverride: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeleteTitleDataOverride", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - ExportMasterPlayerData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/ExportMasterPlayerData", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - ExportPlayersInSegment: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/ExportPlayersInSegment", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetActionsOnPlayersInSegmentTaskInstance: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetActionsOnPlayersInSegmentTaskInstance", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetAllSegments: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetAllSegments", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetCatalogItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetCatalogItems", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetCloudScriptRevision: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetCloudScriptRevision", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetCloudScriptTaskInstance: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetCloudScriptTaskInstance", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetCloudScriptVersions: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetCloudScriptVersions", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetContentList: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetContentList", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetContentUploadUrl: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetContentUploadUrl", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetDataReport: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetDataReport", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetPlayedTitleList: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetPlayedTitleList", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetPlayerIdFromAuthToken: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetPlayerIdFromAuthToken", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetPlayerProfile: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetPlayerProfile", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetPlayerSegments: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetPlayerSegments", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetPlayerSharedSecrets: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetPlayerSharedSecrets", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetPlayersInSegment: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetPlayersInSegment", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetPlayerStatisticDefinitions: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetPlayerStatisticDefinitions", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetPlayerStatisticVersions: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetPlayerStatisticVersions", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetPlayerTags: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetPlayerTags", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetPolicy: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetPolicy", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetPublisherData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetPublisherData", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetRandomResultTables: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetRandomResultTables", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetSegmentExport: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetSegmentExport", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetSegments: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetSegments", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetStoreItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetStoreItems", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetTaskInstances: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetTaskInstances", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetTasks: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetTasks", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetTitleData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetTitleData", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetTitleInternalData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetTitleInternalData", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetUserAccountInfo: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetUserAccountInfo", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetUserBans: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetUserBans", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetUserData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetUserData", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetUserInternalData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetUserInternalData", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetUserInventory: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetUserInventory", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetUserPublisherData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetUserPublisherData", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetUserPublisherInternalData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetUserPublisherInternalData", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetUserPublisherReadOnlyData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetUserPublisherReadOnlyData", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GetUserReadOnlyData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetUserReadOnlyData", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - GrantItemsToUsers: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GrantItemsToUsers", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - IncrementLimitedEditionItemAvailability: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/IncrementLimitedEditionItemAvailability", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - IncrementPlayerStatisticVersion: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/IncrementPlayerStatisticVersion", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - ListOpenIdConnection: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/ListOpenIdConnection", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - ListVirtualCurrencyTypes: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/ListVirtualCurrencyTypes", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - RefundPurchase: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/RefundPurchase", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - RemovePlayerTag: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/RemovePlayerTag", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - RemoveVirtualCurrencyTypes: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/RemoveVirtualCurrencyTypes", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - ResetCharacterStatistics: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/ResetCharacterStatistics", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - ResetPassword: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/ResetPassword", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - ResetUserStatistics: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/ResetUserStatistics", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - ResolvePurchaseDispute: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/ResolvePurchaseDispute", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - RevokeAllBansForUser: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/RevokeAllBansForUser", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - RevokeBans: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/RevokeBans", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - RevokeInventoryItem: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/RevokeInventoryItem", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - RevokeInventoryItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/RevokeInventoryItems", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - RunTask: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/RunTask", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - SendAccountRecoveryEmail: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SendAccountRecoveryEmail", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - SetCatalogItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SetCatalogItems", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - SetMembershipOverride: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SetMembershipOverride", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - SetPlayerSecret: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SetPlayerSecret", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - SetPublishedRevision: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SetPublishedRevision", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - SetPublisherData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SetPublisherData", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - SetStoreItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SetStoreItems", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - SetTitleData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SetTitleData", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - SetTitleDataAndOverrides: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SetTitleDataAndOverrides", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - SetTitleInternalData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SetTitleInternalData", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - SetupPushNotification: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SetupPushNotification", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - SubtractUserVirtualCurrency: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SubtractUserVirtualCurrency", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - UpdateBans: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateBans", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - UpdateCatalogItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateCatalogItems", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - UpdateCloudScript: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateCloudScript", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - UpdateOpenIdConnection: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateOpenIdConnection", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - UpdatePlayerSharedSecret: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdatePlayerSharedSecret", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - UpdatePlayerStatisticDefinition: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdatePlayerStatisticDefinition", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - UpdatePolicy: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdatePolicy", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - UpdateRandomResultTables: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateRandomResultTables", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - UpdateSegment: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateSegment", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - UpdateStoreItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateStoreItems", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - UpdateTask: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateTask", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - UpdateUserData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateUserData", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - UpdateUserInternalData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateUserInternalData", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - UpdateUserPublisherData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateUserPublisherData", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - UpdateUserPublisherInternalData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateUserPublisherInternalData", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - UpdateUserPublisherReadOnlyData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateUserPublisherReadOnlyData", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - UpdateUserReadOnlyData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateUserReadOnlyData", request, "X-SecretKey", callback, customData, extraHeaders); - }, - - UpdateUserTitleDisplayName: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateUserTitleDisplayName", request, "X-SecretKey", callback, customData, extraHeaders); - }, - -}; - -var PlayFabAdminSDK = PlayFab.AdminApi; - +/// + +var PlayFab = typeof PlayFab != "undefined" ? PlayFab : {}; + +if(!PlayFab.settings) { + PlayFab.settings = { + titleId: null, // You must set this value for PlayFabSdk to work properly (Found in the Game Manager for your title, at the PlayFab Website) + developerSecretKey: null, // For security reasons you must never expose this value to the client or players - You must set this value for Server-APIs to work properly (Found in the Game Manager for your title, at the PlayFab Website) + GlobalHeaderInjection: null, + productionServerUrl: ".playfabapi.com" + } +} + +if(!PlayFab._internalSettings) { + PlayFab._internalSettings = { + entityToken: null, + sdkVersion: "1.180.240913", + requestGetParams: { + sdk: "JavaScriptSDK-1.180.240913" + }, + sessionTicket: null, + verticalName: null, // The name of a customer vertical. This is only for customers running a private cluster. Generally you shouldn't touch this + errorTitleId: "Must be have PlayFab.settings.titleId set to call this method", + errorLoggedIn: "Must be logged in to call this method", + errorEntityToken: "You must successfully call GetEntityToken before calling this", + errorSecretKey: "Must have PlayFab.settings.developerSecretKey set to call this method", + + GetServerUrl: function () { + if (!(PlayFab.settings.productionServerUrl.substring(0, 4) === "http")) { + if (PlayFab._internalSettings.verticalName) { + return "https://" + PlayFab._internalSettings.verticalName + PlayFab.settings.productionServerUrl; + } else { + return "https://" + PlayFab.settings.titleId + PlayFab.settings.productionServerUrl; + } + } else { + return PlayFab.settings.productionServerUrl; + } + }, + + InjectHeaders: function (xhr, headersObj) { + if (!headersObj) + return; + + for (var headerKey in headersObj) + { + try { + xhr.setRequestHeader(gHeaderKey, headersObj[headerKey]); + } catch (e) { + console.log("Failed to append header: " + headerKey + " = " + headersObj[headerKey] + "Error: " + e); + } + } + }, + + ExecuteRequest: function (url, request, authkey, authValue, callback, customData, extraHeaders) { + var resultPromise = new Promise(function (resolve, reject) { + if (callback != null && typeof (callback) !== "function") + throw "Callback must be null or a function"; + + if (request == null) + request = {}; + + var startTime = new Date(); + var requestBody = JSON.stringify(request); + + var urlArr = [url]; + var getParams = PlayFab._internalSettings.requestGetParams; + if (getParams != null) { + var firstParam = true; + for (var key in getParams) { + if (firstParam) { + urlArr.push("?"); + firstParam = false; + } else { + urlArr.push("&"); + } + urlArr.push(key); + urlArr.push("="); + urlArr.push(getParams[key]); + } + } + + var completeUrl = urlArr.join(""); + + var xhr = new XMLHttpRequest(); + // window.console.log("URL: " + completeUrl); + xhr.open("POST", completeUrl, true); + + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.setRequestHeader("X-PlayFabSDK", "JavaScriptSDK-" + PlayFab._internalSettings.sdkVersion); + if (authkey != null) + xhr.setRequestHeader(authkey, authValue); + PlayFab._internalSettings.InjectHeaders(xhr, PlayFab.settings.GlobalHeaderInjection); + PlayFab._internalSettings.InjectHeaders(xhr, extraHeaders); + + xhr.onloadend = function () { + if (callback == null) + return; + + var result = PlayFab._internalSettings.GetPlayFabResponse(request, xhr, startTime, customData); + if (result.code === 200) { + callback(result, null); + } else { + callback(null, result); + } + } + + xhr.onerror = function () { + if (callback == null) + return; + + var result = PlayFab._internalSettings.GetPlayFabResponse(request, xhr, startTime, customData); + callback(null, result); + } + + xhr.send(requestBody); + xhr.onreadystatechange = function () { + if (this.readyState === 4) { + var xhrResult = PlayFab._internalSettings.GetPlayFabResponse(request, this, startTime, customData); + if (this.status === 200) { + resolve(xhrResult); + } else { + reject(xhrResult); + } + } + }; + }); + // Return a Promise so that calls to various API methods can be handled asynchronously + return resultPromise; + }, + + GetPlayFabResponse: function(request, xhr, startTime, customData) { + var result = null; + try { + // window.console.log("parsing json result: " + xhr.responseText); + result = JSON.parse(xhr.responseText); + } catch (e) { + result = { + code: 503, // Service Unavailable + status: "Service Unavailable", + error: "Connection error", + errorCode: 2, // PlayFabErrorCode.ConnectionError + errorMessage: xhr.responseText + }; + } + + result.CallBackTimeMS = new Date() - startTime; + result.Request = request; + result.CustomData = customData; + return result; + }, + + authenticationContext: { + PlayFabId: null, + EntityId: null, + EntityType: null, + SessionTicket: null, + EntityToken: null + }, + + UpdateAuthenticationContext: function (authenticationContext, result) { + var authenticationContextUpdates = {}; + if(result.data.PlayFabId !== null) { + PlayFab._internalSettings.authenticationContext.PlayFabId = result.data.PlayFabId; + authenticationContextUpdates.PlayFabId = result.data.PlayFabId; + } + if(result.data.SessionTicket !== null) { + PlayFab._internalSettings.authenticationContext.SessionTicket = result.data.SessionTicket; + authenticationContextUpdates.SessionTicket = result.data.SessionTicket; + } + if (result.data.EntityToken !== null) { + PlayFab._internalSettings.authenticationContext.EntityId = result.data.EntityToken.Entity.Id; + authenticationContextUpdates.EntityId = result.data.EntityToken.Entity.Id; + PlayFab._internalSettings.authenticationContext.EntityType = result.data.EntityToken.Entity.Type; + authenticationContextUpdates.EntityType = result.data.EntityToken.Entity.Type; + PlayFab._internalSettings.authenticationContext.EntityToken = result.data.EntityToken.EntityToken; + authenticationContextUpdates.EntityToken = result.data.EntityToken.EntityToken; + } + // Update the authenticationContext with values from the result + authenticationContext = Object.assign(authenticationContext, authenticationContextUpdates); + return authenticationContext; + }, + + AuthInfoMap: { + "X-EntityToken": { + authAttr: "entityToken", + authError: "errorEntityToken" + }, + "X-Authorization": { + authAttr: "sessionTicket", + authError: "errorLoggedIn" + }, + "X-SecretKey": { + authAttr: "developerSecretKey", + authError: "errorSecretKey" + } + }, + + GetAuthInfo: function (request, authKey) { + // Use the most-recently saved authKey, unless one was provided in the request via the AuthenticationContext + var authError = PlayFab._internalSettings.AuthInfoMap[authKey].authError; + var authAttr = PlayFab._internalSettings.AuthInfoMap[authKey].authAttr; + var defaultAuthValue = null; + if (authAttr === "entityToken") + defaultAuthValue = PlayFab._internalSettings.entityToken; + else if (authAttr === "sessionTicket") + defaultAuthValue = PlayFab._internalSettings.sessionTicket; + else if (authAttr === "developerSecretKey") + defaultAuthValue = PlayFab.settings.developerSecretKey; + var authValue = request.AuthenticationContext ? request.AuthenticationContext[authAttr] : defaultAuthValue; + return {"authKey": authKey, "authValue": authValue, "authError": authError}; + }, + + ExecuteRequestWrapper: function (apiURL, request, authKey, callback, customData, extraHeaders) { + var authValue = null; + if (authKey !== null){ + var authInfo = PlayFab._internalSettings.GetAuthInfo(request, authKey=authKey); + var authKey = authInfo.authKey, authValue = authInfo.authValue, authError = authInfo.authError; + + if (!authValue) throw authError; + } + return PlayFab._internalSettings.ExecuteRequest(PlayFab._internalSettings.GetServerUrl() + apiURL, request, authKey, authValue, callback, customData, extraHeaders); + } + } +} + +PlayFab.buildIdentifier = "adobuild_javascriptsdk_114"; +PlayFab.sdkVersion = "1.180.240913"; +PlayFab.GenerateErrorReport = function (error) { + if (error == null) + return ""; + var fullErrors = error.errorMessage; + for (var paramName in error.errorDetails) + for (var msgIdx in error.errorDetails[paramName]) + fullErrors += "\n" + paramName + ": " + error.errorDetails[paramName][msgIdx]; + return fullErrors; +}; + +PlayFab.AdminApi = { + ForgetAllCredentials: function () { + PlayFab._internalSettings.sessionTicket = null; + PlayFab._internalSettings.entityToken = null; + }, + + AbortTaskInstance: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/AbortTaskInstance", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + AddLocalizedNews: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/AddLocalizedNews", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + AddNews: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/AddNews", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + AddPlayerTag: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/AddPlayerTag", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + AddUserVirtualCurrency: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/AddUserVirtualCurrency", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + AddVirtualCurrencyTypes: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/AddVirtualCurrencyTypes", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + BanUsers: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/BanUsers", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + CheckLimitedEditionItemAvailability: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/CheckLimitedEditionItemAvailability", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + CreateActionsOnPlayersInSegmentTask: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/CreateActionsOnPlayersInSegmentTask", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + CreateCloudScriptTask: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/CreateCloudScriptTask", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + CreateInsightsScheduledScalingTask: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/CreateInsightsScheduledScalingTask", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + CreateOpenIdConnection: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/CreateOpenIdConnection", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + CreatePlayerSharedSecret: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/CreatePlayerSharedSecret", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + CreatePlayerStatisticDefinition: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/CreatePlayerStatisticDefinition", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + CreateSegment: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/CreateSegment", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + DeleteContent: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeleteContent", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + DeleteMasterPlayerAccount: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeleteMasterPlayerAccount", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + DeleteMasterPlayerEventData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeleteMasterPlayerEventData", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + DeleteMembershipSubscription: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeleteMembershipSubscription", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + DeleteOpenIdConnection: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeleteOpenIdConnection", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + DeletePlayer: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeletePlayer", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + DeletePlayerSharedSecret: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeletePlayerSharedSecret", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + DeleteSegment: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeleteSegment", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + DeleteStore: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeleteStore", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + DeleteTask: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeleteTask", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + DeleteTitle: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeleteTitle", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + DeleteTitleDataOverride: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/DeleteTitleDataOverride", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + ExportMasterPlayerData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/ExportMasterPlayerData", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + ExportPlayersInSegment: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/ExportPlayersInSegment", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetActionsOnPlayersInSegmentTaskInstance: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetActionsOnPlayersInSegmentTaskInstance", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetAllSegments: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetAllSegments", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetCatalogItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetCatalogItems", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetCloudScriptRevision: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetCloudScriptRevision", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetCloudScriptTaskInstance: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetCloudScriptTaskInstance", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetCloudScriptVersions: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetCloudScriptVersions", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetContentList: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetContentList", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetContentUploadUrl: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetContentUploadUrl", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetDataReport: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetDataReport", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetPlayedTitleList: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetPlayedTitleList", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetPlayerIdFromAuthToken: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetPlayerIdFromAuthToken", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetPlayerProfile: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetPlayerProfile", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetPlayerSegments: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetPlayerSegments", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetPlayerSharedSecrets: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetPlayerSharedSecrets", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetPlayersInSegment: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetPlayersInSegment", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetPlayerStatisticDefinitions: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetPlayerStatisticDefinitions", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetPlayerStatisticVersions: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetPlayerStatisticVersions", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetPlayerTags: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetPlayerTags", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetPolicy: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetPolicy", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetPublisherData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetPublisherData", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetRandomResultTables: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetRandomResultTables", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetSegmentExport: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetSegmentExport", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetSegments: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetSegments", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetStoreItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetStoreItems", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetTaskInstances: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetTaskInstances", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetTasks: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetTasks", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetTitleData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetTitleData", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetTitleInternalData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetTitleInternalData", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetUserAccountInfo: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetUserAccountInfo", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetUserBans: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetUserBans", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetUserData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetUserData", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetUserInternalData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetUserInternalData", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetUserInventory: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetUserInventory", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetUserPublisherData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetUserPublisherData", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetUserPublisherInternalData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetUserPublisherInternalData", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetUserPublisherReadOnlyData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetUserPublisherReadOnlyData", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GetUserReadOnlyData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GetUserReadOnlyData", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + GrantItemsToUsers: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/GrantItemsToUsers", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + IncrementLimitedEditionItemAvailability: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/IncrementLimitedEditionItemAvailability", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + IncrementPlayerStatisticVersion: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/IncrementPlayerStatisticVersion", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + ListOpenIdConnection: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/ListOpenIdConnection", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + ListVirtualCurrencyTypes: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/ListVirtualCurrencyTypes", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + RefundPurchase: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/RefundPurchase", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + RemovePlayerTag: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/RemovePlayerTag", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + RemoveVirtualCurrencyTypes: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/RemoveVirtualCurrencyTypes", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + ResetCharacterStatistics: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/ResetCharacterStatistics", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + ResetPassword: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/ResetPassword", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + ResetUserStatistics: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/ResetUserStatistics", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + ResolvePurchaseDispute: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/ResolvePurchaseDispute", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + RevokeAllBansForUser: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/RevokeAllBansForUser", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + RevokeBans: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/RevokeBans", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + RevokeInventoryItem: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/RevokeInventoryItem", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + RevokeInventoryItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/RevokeInventoryItems", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + RunTask: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/RunTask", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + SendAccountRecoveryEmail: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SendAccountRecoveryEmail", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + SetCatalogItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SetCatalogItems", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + SetMembershipOverride: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SetMembershipOverride", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + SetPlayerSecret: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SetPlayerSecret", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + SetPublishedRevision: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SetPublishedRevision", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + SetPublisherData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SetPublisherData", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + SetStoreItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SetStoreItems", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + SetTitleData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SetTitleData", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + SetTitleDataAndOverrides: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SetTitleDataAndOverrides", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + SetTitleInternalData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SetTitleInternalData", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + SetupPushNotification: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SetupPushNotification", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + SubtractUserVirtualCurrency: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/SubtractUserVirtualCurrency", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + UpdateBans: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateBans", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + UpdateCatalogItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateCatalogItems", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + UpdateCloudScript: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateCloudScript", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + UpdateOpenIdConnection: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateOpenIdConnection", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + UpdatePlayerSharedSecret: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdatePlayerSharedSecret", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + UpdatePlayerStatisticDefinition: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdatePlayerStatisticDefinition", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + UpdatePolicy: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdatePolicy", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + UpdateRandomResultTables: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateRandomResultTables", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + UpdateSegment: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateSegment", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + UpdateStoreItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateStoreItems", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + UpdateTask: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateTask", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + UpdateUserData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateUserData", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + UpdateUserInternalData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateUserInternalData", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + UpdateUserPublisherData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateUserPublisherData", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + UpdateUserPublisherInternalData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateUserPublisherInternalData", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + UpdateUserPublisherReadOnlyData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateUserPublisherReadOnlyData", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + UpdateUserReadOnlyData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateUserReadOnlyData", request, "X-SecretKey", callback, customData, extraHeaders); + }, + + UpdateUserTitleDisplayName: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Admin/UpdateUserTitleDisplayName", request, "X-SecretKey", callback, customData, extraHeaders); + }, + +}; + +var PlayFabAdminSDK = PlayFab.AdminApi; + diff --git a/website/public/PlayFabClientApi.js b/website/public/PlayFabClientApi.js index c77c07c..0e4f917 100644 --- a/website/public/PlayFabClientApi.js +++ b/website/public/PlayFabClientApi.js @@ -1,616 +1,616 @@ -/// - -var PlayFab = typeof PlayFab != "undefined" ? PlayFab : {}; - -if(!PlayFab.settings) { - PlayFab.settings = { - titleId: null, // You must set this value for PlayFabSdk to work properly (Found in the Game Manager for your title, at the PlayFab Website) - developerSecretKey: null, // For security reasons you must never expose this value to the client or players - You must set this value for Server-APIs to work properly (Found in the Game Manager for your title, at the PlayFab Website) - GlobalHeaderInjection: null, - productionServerUrl: ".playfabapi.com" - } -} - -if(!PlayFab._internalSettings) { - PlayFab._internalSettings = { - entityToken: null, - sdkVersion: "1.180.240913", - requestGetParams: { - sdk: "JavaScriptSDK-1.180.240913" - }, - sessionTicket: null, - verticalName: null, // The name of a customer vertical. This is only for customers running a private cluster. Generally you shouldn't touch this - errorTitleId: "Must be have PlayFab.settings.titleId set to call this method", - errorLoggedIn: "Must be logged in to call this method", - errorEntityToken: "You must successfully call GetEntityToken before calling this", - errorSecretKey: "Must have PlayFab.settings.developerSecretKey set to call this method", - - GetServerUrl: function () { - if (!(PlayFab.settings.productionServerUrl.substring(0, 4) === "http")) { - if (PlayFab._internalSettings.verticalName) { - return "https://" + PlayFab._internalSettings.verticalName + PlayFab.settings.productionServerUrl; - } else { - return "https://" + PlayFab.settings.titleId + PlayFab.settings.productionServerUrl; - } - } else { - return PlayFab.settings.productionServerUrl; - } - }, - - InjectHeaders: function (xhr, headersObj) { - if (!headersObj) - return; - - for (var headerKey in headersObj) - { - try { - xhr.setRequestHeader(gHeaderKey, headersObj[headerKey]); - } catch (e) { - console.log("Failed to append header: " + headerKey + " = " + headersObj[headerKey] + "Error: " + e); - } - } - }, - - ExecuteRequest: function (url, request, authkey, authValue, callback, customData, extraHeaders) { - var resultPromise = new Promise(function (resolve, reject) { - if (callback != null && typeof (callback) !== "function") - throw "Callback must be null or a function"; - - if (request == null) - request = {}; - - var startTime = new Date(); - var requestBody = JSON.stringify(request); - - var urlArr = [url]; - var getParams = PlayFab._internalSettings.requestGetParams; - if (getParams != null) { - var firstParam = true; - for (var key in getParams) { - if (firstParam) { - urlArr.push("?"); - firstParam = false; - } else { - urlArr.push("&"); - } - urlArr.push(key); - urlArr.push("="); - urlArr.push(getParams[key]); - } - } - - var completeUrl = urlArr.join(""); - - var xhr = new XMLHttpRequest(); - // window.console.log("URL: " + completeUrl); - xhr.open("POST", completeUrl, true); - - xhr.setRequestHeader("Content-Type", "application/json"); - xhr.setRequestHeader("X-PlayFabSDK", "JavaScriptSDK-" + PlayFab._internalSettings.sdkVersion); - if (authkey != null) - xhr.setRequestHeader(authkey, authValue); - PlayFab._internalSettings.InjectHeaders(xhr, PlayFab.settings.GlobalHeaderInjection); - PlayFab._internalSettings.InjectHeaders(xhr, extraHeaders); - - xhr.onloadend = function () { - if (callback == null) - return; - - var result = PlayFab._internalSettings.GetPlayFabResponse(request, xhr, startTime, customData); - if (result.code === 200) { - callback(result, null); - } else { - callback(null, result); - } - } - - xhr.onerror = function () { - if (callback == null) - return; - - var result = PlayFab._internalSettings.GetPlayFabResponse(request, xhr, startTime, customData); - callback(null, result); - } - - xhr.send(requestBody); - xhr.onreadystatechange = function () { - if (this.readyState === 4) { - var xhrResult = PlayFab._internalSettings.GetPlayFabResponse(request, this, startTime, customData); - if (this.status === 200) { - resolve(xhrResult); - } else { - reject(xhrResult); - } - } - }; - }); - // Return a Promise so that calls to various API methods can be handled asynchronously - return resultPromise; - }, - - GetPlayFabResponse: function(request, xhr, startTime, customData) { - var result = null; - try { - // window.console.log("parsing json result: " + xhr.responseText); - result = JSON.parse(xhr.responseText); - } catch (e) { - result = { - code: 503, // Service Unavailable - status: "Service Unavailable", - error: "Connection error", - errorCode: 2, // PlayFabErrorCode.ConnectionError - errorMessage: xhr.responseText - }; - } - - result.CallBackTimeMS = new Date() - startTime; - result.Request = request; - result.CustomData = customData; - return result; - }, - - authenticationContext: { - PlayFabId: null, - EntityId: null, - EntityType: null, - SessionTicket: null, - EntityToken: null - }, - - UpdateAuthenticationContext: function (authenticationContext, result) { - var authenticationContextUpdates = {}; - if(result.data.PlayFabId !== null) { - PlayFab._internalSettings.authenticationContext.PlayFabId = result.data.PlayFabId; - authenticationContextUpdates.PlayFabId = result.data.PlayFabId; - } - if(result.data.SessionTicket !== null) { - PlayFab._internalSettings.authenticationContext.SessionTicket = result.data.SessionTicket; - authenticationContextUpdates.SessionTicket = result.data.SessionTicket; - } - if (result.data.EntityToken !== null) { - PlayFab._internalSettings.authenticationContext.EntityId = result.data.EntityToken.Entity.Id; - authenticationContextUpdates.EntityId = result.data.EntityToken.Entity.Id; - PlayFab._internalSettings.authenticationContext.EntityType = result.data.EntityToken.Entity.Type; - authenticationContextUpdates.EntityType = result.data.EntityToken.Entity.Type; - PlayFab._internalSettings.authenticationContext.EntityToken = result.data.EntityToken.EntityToken; - authenticationContextUpdates.EntityToken = result.data.EntityToken.EntityToken; - } - // Update the authenticationContext with values from the result - authenticationContext = Object.assign(authenticationContext, authenticationContextUpdates); - return authenticationContext; - }, - - AuthInfoMap: { - "X-EntityToken": { - authAttr: "entityToken", - authError: "errorEntityToken" - }, - "X-Authorization": { - authAttr: "sessionTicket", - authError: "errorLoggedIn" - }, - "X-SecretKey": { - authAttr: "developerSecretKey", - authError: "errorSecretKey" - } - }, - - GetAuthInfo: function (request, authKey) { - // Use the most-recently saved authKey, unless one was provided in the request via the AuthenticationContext - var authError = PlayFab._internalSettings.AuthInfoMap[authKey].authError; - var authAttr = PlayFab._internalSettings.AuthInfoMap[authKey].authAttr; - var defaultAuthValue = null; - if (authAttr === "entityToken") - defaultAuthValue = PlayFab._internalSettings.entityToken; - else if (authAttr === "sessionTicket") - defaultAuthValue = PlayFab._internalSettings.sessionTicket; - else if (authAttr === "developerSecretKey") - defaultAuthValue = PlayFab.settings.developerSecretKey; - var authValue = request.AuthenticationContext ? request.AuthenticationContext[authAttr] : defaultAuthValue; - return {"authKey": authKey, "authValue": authValue, "authError": authError}; - }, - - ExecuteRequestWrapper: function (apiURL, request, authKey, callback, customData, extraHeaders) { - var authValue = null; - if (authKey !== null){ - var authInfo = PlayFab._internalSettings.GetAuthInfo(request, authKey=authKey); - var authKey = authInfo.authKey, authValue = authInfo.authValue, authError = authInfo.authError; - - if (!authValue) throw authError; - } - return PlayFab._internalSettings.ExecuteRequest(PlayFab._internalSettings.GetServerUrl() + apiURL, request, authKey, authValue, callback, customData, extraHeaders); - } - } -} - -PlayFab.buildIdentifier = "adobuild_javascriptsdk_114"; -PlayFab.sdkVersion = "1.180.240913"; -PlayFab.GenerateErrorReport = function (error) { - if (error == null) - return ""; - var fullErrors = error.errorMessage; - for (var paramName in error.errorDetails) - for (var msgIdx in error.errorDetails[paramName]) - fullErrors += "\n" + paramName + ": " + error.errorDetails[paramName][msgIdx]; - return fullErrors; -}; - -PlayFab.ClientApi = { - - IsClientLoggedIn: function () { - return PlayFab._internalSettings.sessionTicket != null && PlayFab._internalSettings.sessionTicket.length > 0; - }, - ForgetAllCredentials: function () { - PlayFab._internalSettings.sessionTicket = null; - PlayFab._internalSettings.entityToken = null; - }, - - AcceptTrade: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/AcceptTrade", request, "X-Authorization", callback, customData, extraHeaders); - }, - - AddFriend: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/AddFriend", request, "X-Authorization", callback, customData, extraHeaders); - }, - - AddGenericID: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/AddGenericID", request, "X-Authorization", callback, customData, extraHeaders); - }, - - AddOrUpdateContactEmail: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/AddOrUpdateContactEmail", request, "X-Authorization", callback, customData, extraHeaders); - }, - - AddSharedGroupMembers: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/AddSharedGroupMembers", request, "X-Authorization", callback, customData, extraHeaders); - }, - - AddUsernamePassword: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/AddUsernamePassword", request, "X-Authorization", callback, customData, extraHeaders); - }, - - AddUserVirtualCurrency: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/AddUserVirtualCurrency", request, "X-Authorization", callback, customData, extraHeaders); - }, - - AndroidDevicePushNotificationRegistration: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/AndroidDevicePushNotificationRegistration", request, "X-Authorization", callback, customData, extraHeaders); - }, - - AttributeInstall: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/AttributeInstall", request, "X-Authorization", callback, customData, extraHeaders); - }, - - CancelTrade: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/CancelTrade", request, "X-Authorization", callback, customData, extraHeaders); - }, - - ConfirmPurchase: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ConfirmPurchase", request, "X-Authorization", callback, customData, extraHeaders); - }, - - ConsumeItem: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ConsumeItem", request, "X-Authorization", callback, customData, extraHeaders); - }, - - ConsumeMicrosoftStoreEntitlements: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ConsumeMicrosoftStoreEntitlements", request, "X-Authorization", callback, customData, extraHeaders); - }, - - ConsumePS5Entitlements: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ConsumePS5Entitlements", request, "X-Authorization", callback, customData, extraHeaders); - }, - - ConsumePSNEntitlements: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ConsumePSNEntitlements", request, "X-Authorization", callback, customData, extraHeaders); - }, - - ConsumeXboxEntitlements: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ConsumeXboxEntitlements", request, "X-Authorization", callback, customData, extraHeaders); - }, - - CreateSharedGroup: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/CreateSharedGroup", request, "X-Authorization", callback, customData, extraHeaders); - }, - - ExecuteCloudScript: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ExecuteCloudScript", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetAccountInfo: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetAccountInfo", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetAdPlacements: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetAdPlacements", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetAllUsersCharacters: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetAllUsersCharacters", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetCatalogItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetCatalogItems", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetCharacterData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetCharacterData", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetCharacterInventory: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetCharacterInventory", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetCharacterLeaderboard: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetCharacterLeaderboard", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetCharacterReadOnlyData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetCharacterReadOnlyData", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetCharacterStatistics: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetCharacterStatistics", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetContentDownloadUrl: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetContentDownloadUrl", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetFriendLeaderboard: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetFriendLeaderboard", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetFriendLeaderboardAroundPlayer: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetFriendLeaderboardAroundPlayer", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetFriendsList: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetFriendsList", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetLeaderboard: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetLeaderboard", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetLeaderboardAroundCharacter: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetLeaderboardAroundCharacter", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetLeaderboardAroundPlayer: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetLeaderboardAroundPlayer", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetLeaderboardForUserCharacters: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetLeaderboardForUserCharacters", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPaymentToken: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPaymentToken", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPhotonAuthenticationToken: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPhotonAuthenticationToken", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPlayerCombinedInfo: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayerCombinedInfo", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPlayerProfile: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayerProfile", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPlayerSegments: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayerSegments", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPlayerStatistics: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayerStatistics", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPlayerStatisticVersions: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayerStatisticVersions", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPlayerTags: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayerTags", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPlayerTrades: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayerTrades", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPlayFabIDsFromFacebookIDs: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromFacebookIDs", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPlayFabIDsFromFacebookInstantGamesIds: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromFacebookInstantGamesIds", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPlayFabIDsFromGameCenterIDs: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromGameCenterIDs", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPlayFabIDsFromGenericIDs: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromGenericIDs", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPlayFabIDsFromGoogleIDs: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromGoogleIDs", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPlayFabIDsFromGooglePlayGamesPlayerIDs: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromGooglePlayGamesPlayerIDs", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPlayFabIDsFromKongregateIDs: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromKongregateIDs", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPlayFabIDsFromNintendoServiceAccountIds: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromNintendoServiceAccountIds", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPlayFabIDsFromNintendoSwitchDeviceIds: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromNintendoSwitchDeviceIds", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPlayFabIDsFromPSNAccountIDs: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromPSNAccountIDs", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPlayFabIDsFromPSNOnlineIDs: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromPSNOnlineIDs", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPlayFabIDsFromSteamIDs: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromSteamIDs", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPlayFabIDsFromTwitchIDs: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromTwitchIDs", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPlayFabIDsFromXboxLiveIDs: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromXboxLiveIDs", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPublisherData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPublisherData", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetPurchase: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPurchase", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetSharedGroupData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetSharedGroupData", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetStoreItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetStoreItems", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetTime: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetTime", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetTitleData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetTitleData", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetTitleNews: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetTitleNews", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetTitlePublicKey: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetTitlePublicKey", request, null, callback, customData, extraHeaders); - }, - - GetTradeStatus: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetTradeStatus", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetUserData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetUserData", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetUserInventory: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetUserInventory", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetUserPublisherData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetUserPublisherData", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetUserPublisherReadOnlyData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetUserPublisherReadOnlyData", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GetUserReadOnlyData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetUserReadOnlyData", request, "X-Authorization", callback, customData, extraHeaders); - }, - - GrantCharacterToUser: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GrantCharacterToUser", request, "X-Authorization", callback, customData, extraHeaders); - }, - - LinkAndroidDeviceID: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkAndroidDeviceID", request, "X-Authorization", callback, customData, extraHeaders); - }, - - LinkApple: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkApple", request, "X-Authorization", callback, customData, extraHeaders); - }, - - LinkCustomID: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkCustomID", request, "X-Authorization", callback, customData, extraHeaders); - }, - - LinkFacebookAccount: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkFacebookAccount", request, "X-Authorization", callback, customData, extraHeaders); - }, - - LinkFacebookInstantGamesId: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkFacebookInstantGamesId", request, "X-Authorization", callback, customData, extraHeaders); - }, - - LinkGameCenterAccount: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkGameCenterAccount", request, "X-Authorization", callback, customData, extraHeaders); - }, - - LinkGoogleAccount: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkGoogleAccount", request, "X-Authorization", callback, customData, extraHeaders); - }, - - LinkGooglePlayGamesServicesAccount: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkGooglePlayGamesServicesAccount", request, "X-Authorization", callback, customData, extraHeaders); - }, - - LinkIOSDeviceID: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkIOSDeviceID", request, "X-Authorization", callback, customData, extraHeaders); - }, - - LinkKongregate: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkKongregate", request, "X-Authorization", callback, customData, extraHeaders); - }, - - LinkNintendoServiceAccount: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkNintendoServiceAccount", request, "X-Authorization", callback, customData, extraHeaders); - }, - - LinkNintendoSwitchDeviceId: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkNintendoSwitchDeviceId", request, "X-Authorization", callback, customData, extraHeaders); - }, - - LinkOpenIdConnect: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkOpenIdConnect", request, "X-Authorization", callback, customData, extraHeaders); - }, - - LinkPSNAccount: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkPSNAccount", request, "X-Authorization", callback, customData, extraHeaders); - }, - - LinkSteamAccount: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkSteamAccount", request, "X-Authorization", callback, customData, extraHeaders); - }, - - LinkTwitch: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkTwitch", request, "X-Authorization", callback, customData, extraHeaders); - }, - - LinkXboxAccount: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkXboxAccount", request, "X-Authorization", callback, customData, extraHeaders); - }, - - LoginWithAndroidDeviceID: function (request, callback, customData, extraHeaders) { +/// + +var PlayFab = typeof PlayFab != "undefined" ? PlayFab : {}; + +if(!PlayFab.settings) { + PlayFab.settings = { + titleId: null, // You must set this value for PlayFabSdk to work properly (Found in the Game Manager for your title, at the PlayFab Website) + developerSecretKey: null, // For security reasons you must never expose this value to the client or players - You must set this value for Server-APIs to work properly (Found in the Game Manager for your title, at the PlayFab Website) + GlobalHeaderInjection: null, + productionServerUrl: ".playfabapi.com" + } +} + +if(!PlayFab._internalSettings) { + PlayFab._internalSettings = { + entityToken: null, + sdkVersion: "1.180.240913", + requestGetParams: { + sdk: "JavaScriptSDK-1.180.240913" + }, + sessionTicket: null, + verticalName: null, // The name of a customer vertical. This is only for customers running a private cluster. Generally you shouldn't touch this + errorTitleId: "Must be have PlayFab.settings.titleId set to call this method", + errorLoggedIn: "Must be logged in to call this method", + errorEntityToken: "You must successfully call GetEntityToken before calling this", + errorSecretKey: "Must have PlayFab.settings.developerSecretKey set to call this method", + + GetServerUrl: function () { + if (!(PlayFab.settings.productionServerUrl.substring(0, 4) === "http")) { + if (PlayFab._internalSettings.verticalName) { + return "https://" + PlayFab._internalSettings.verticalName + PlayFab.settings.productionServerUrl; + } else { + return "https://" + PlayFab.settings.titleId + PlayFab.settings.productionServerUrl; + } + } else { + return PlayFab.settings.productionServerUrl; + } + }, + + InjectHeaders: function (xhr, headersObj) { + if (!headersObj) + return; + + for (var headerKey in headersObj) + { + try { + xhr.setRequestHeader(gHeaderKey, headersObj[headerKey]); + } catch (e) { + console.log("Failed to append header: " + headerKey + " = " + headersObj[headerKey] + "Error: " + e); + } + } + }, + + ExecuteRequest: function (url, request, authkey, authValue, callback, customData, extraHeaders) { + var resultPromise = new Promise(function (resolve, reject) { + if (callback != null && typeof (callback) !== "function") + throw "Callback must be null or a function"; + + if (request == null) + request = {}; + + var startTime = new Date(); + var requestBody = JSON.stringify(request); + + var urlArr = [url]; + var getParams = PlayFab._internalSettings.requestGetParams; + if (getParams != null) { + var firstParam = true; + for (var key in getParams) { + if (firstParam) { + urlArr.push("?"); + firstParam = false; + } else { + urlArr.push("&"); + } + urlArr.push(key); + urlArr.push("="); + urlArr.push(getParams[key]); + } + } + + var completeUrl = urlArr.join(""); + + var xhr = new XMLHttpRequest(); + // window.console.log("URL: " + completeUrl); + xhr.open("POST", completeUrl, true); + + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.setRequestHeader("X-PlayFabSDK", "JavaScriptSDK-" + PlayFab._internalSettings.sdkVersion); + if (authkey != null) + xhr.setRequestHeader(authkey, authValue); + PlayFab._internalSettings.InjectHeaders(xhr, PlayFab.settings.GlobalHeaderInjection); + PlayFab._internalSettings.InjectHeaders(xhr, extraHeaders); + + xhr.onloadend = function () { + if (callback == null) + return; + + var result = PlayFab._internalSettings.GetPlayFabResponse(request, xhr, startTime, customData); + if (result.code === 200) { + callback(result, null); + } else { + callback(null, result); + } + } + + xhr.onerror = function () { + if (callback == null) + return; + + var result = PlayFab._internalSettings.GetPlayFabResponse(request, xhr, startTime, customData); + callback(null, result); + } + + xhr.send(requestBody); + xhr.onreadystatechange = function () { + if (this.readyState === 4) { + var xhrResult = PlayFab._internalSettings.GetPlayFabResponse(request, this, startTime, customData); + if (this.status === 200) { + resolve(xhrResult); + } else { + reject(xhrResult); + } + } + }; + }); + // Return a Promise so that calls to various API methods can be handled asynchronously + return resultPromise; + }, + + GetPlayFabResponse: function(request, xhr, startTime, customData) { + var result = null; + try { + // window.console.log("parsing json result: " + xhr.responseText); + result = JSON.parse(xhr.responseText); + } catch (e) { + result = { + code: 503, // Service Unavailable + status: "Service Unavailable", + error: "Connection error", + errorCode: 2, // PlayFabErrorCode.ConnectionError + errorMessage: xhr.responseText + }; + } + + result.CallBackTimeMS = new Date() - startTime; + result.Request = request; + result.CustomData = customData; + return result; + }, + + authenticationContext: { + PlayFabId: null, + EntityId: null, + EntityType: null, + SessionTicket: null, + EntityToken: null + }, + + UpdateAuthenticationContext: function (authenticationContext, result) { + var authenticationContextUpdates = {}; + if(result.data.PlayFabId !== null) { + PlayFab._internalSettings.authenticationContext.PlayFabId = result.data.PlayFabId; + authenticationContextUpdates.PlayFabId = result.data.PlayFabId; + } + if(result.data.SessionTicket !== null) { + PlayFab._internalSettings.authenticationContext.SessionTicket = result.data.SessionTicket; + authenticationContextUpdates.SessionTicket = result.data.SessionTicket; + } + if (result.data.EntityToken !== null) { + PlayFab._internalSettings.authenticationContext.EntityId = result.data.EntityToken.Entity.Id; + authenticationContextUpdates.EntityId = result.data.EntityToken.Entity.Id; + PlayFab._internalSettings.authenticationContext.EntityType = result.data.EntityToken.Entity.Type; + authenticationContextUpdates.EntityType = result.data.EntityToken.Entity.Type; + PlayFab._internalSettings.authenticationContext.EntityToken = result.data.EntityToken.EntityToken; + authenticationContextUpdates.EntityToken = result.data.EntityToken.EntityToken; + } + // Update the authenticationContext with values from the result + authenticationContext = Object.assign(authenticationContext, authenticationContextUpdates); + return authenticationContext; + }, + + AuthInfoMap: { + "X-EntityToken": { + authAttr: "entityToken", + authError: "errorEntityToken" + }, + "X-Authorization": { + authAttr: "sessionTicket", + authError: "errorLoggedIn" + }, + "X-SecretKey": { + authAttr: "developerSecretKey", + authError: "errorSecretKey" + } + }, + + GetAuthInfo: function (request, authKey) { + // Use the most-recently saved authKey, unless one was provided in the request via the AuthenticationContext + var authError = PlayFab._internalSettings.AuthInfoMap[authKey].authError; + var authAttr = PlayFab._internalSettings.AuthInfoMap[authKey].authAttr; + var defaultAuthValue = null; + if (authAttr === "entityToken") + defaultAuthValue = PlayFab._internalSettings.entityToken; + else if (authAttr === "sessionTicket") + defaultAuthValue = PlayFab._internalSettings.sessionTicket; + else if (authAttr === "developerSecretKey") + defaultAuthValue = PlayFab.settings.developerSecretKey; + var authValue = request.AuthenticationContext ? request.AuthenticationContext[authAttr] : defaultAuthValue; + return {"authKey": authKey, "authValue": authValue, "authError": authError}; + }, + + ExecuteRequestWrapper: function (apiURL, request, authKey, callback, customData, extraHeaders) { + var authValue = null; + if (authKey !== null){ + var authInfo = PlayFab._internalSettings.GetAuthInfo(request, authKey=authKey); + var authKey = authInfo.authKey, authValue = authInfo.authValue, authError = authInfo.authError; + + if (!authValue) throw authError; + } + return PlayFab._internalSettings.ExecuteRequest(PlayFab._internalSettings.GetServerUrl() + apiURL, request, authKey, authValue, callback, customData, extraHeaders); + } + } +} + +PlayFab.buildIdentifier = "adobuild_javascriptsdk_114"; +PlayFab.sdkVersion = "1.180.240913"; +PlayFab.GenerateErrorReport = function (error) { + if (error == null) + return ""; + var fullErrors = error.errorMessage; + for (var paramName in error.errorDetails) + for (var msgIdx in error.errorDetails[paramName]) + fullErrors += "\n" + paramName + ": " + error.errorDetails[paramName][msgIdx]; + return fullErrors; +}; + +PlayFab.ClientApi = { + + IsClientLoggedIn: function () { + return PlayFab._internalSettings.sessionTicket != null && PlayFab._internalSettings.sessionTicket.length > 0; + }, + ForgetAllCredentials: function () { + PlayFab._internalSettings.sessionTicket = null; + PlayFab._internalSettings.entityToken = null; + }, + + AcceptTrade: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/AcceptTrade", request, "X-Authorization", callback, customData, extraHeaders); + }, + + AddFriend: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/AddFriend", request, "X-Authorization", callback, customData, extraHeaders); + }, + + AddGenericID: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/AddGenericID", request, "X-Authorization", callback, customData, extraHeaders); + }, + + AddOrUpdateContactEmail: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/AddOrUpdateContactEmail", request, "X-Authorization", callback, customData, extraHeaders); + }, + + AddSharedGroupMembers: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/AddSharedGroupMembers", request, "X-Authorization", callback, customData, extraHeaders); + }, + + AddUsernamePassword: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/AddUsernamePassword", request, "X-Authorization", callback, customData, extraHeaders); + }, + + AddUserVirtualCurrency: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/AddUserVirtualCurrency", request, "X-Authorization", callback, customData, extraHeaders); + }, + + AndroidDevicePushNotificationRegistration: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/AndroidDevicePushNotificationRegistration", request, "X-Authorization", callback, customData, extraHeaders); + }, + + AttributeInstall: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/AttributeInstall", request, "X-Authorization", callback, customData, extraHeaders); + }, + + CancelTrade: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/CancelTrade", request, "X-Authorization", callback, customData, extraHeaders); + }, + + ConfirmPurchase: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ConfirmPurchase", request, "X-Authorization", callback, customData, extraHeaders); + }, + + ConsumeItem: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ConsumeItem", request, "X-Authorization", callback, customData, extraHeaders); + }, + + ConsumeMicrosoftStoreEntitlements: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ConsumeMicrosoftStoreEntitlements", request, "X-Authorization", callback, customData, extraHeaders); + }, + + ConsumePS5Entitlements: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ConsumePS5Entitlements", request, "X-Authorization", callback, customData, extraHeaders); + }, + + ConsumePSNEntitlements: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ConsumePSNEntitlements", request, "X-Authorization", callback, customData, extraHeaders); + }, + + ConsumeXboxEntitlements: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ConsumeXboxEntitlements", request, "X-Authorization", callback, customData, extraHeaders); + }, + + CreateSharedGroup: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/CreateSharedGroup", request, "X-Authorization", callback, customData, extraHeaders); + }, + + ExecuteCloudScript: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ExecuteCloudScript", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetAccountInfo: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetAccountInfo", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetAdPlacements: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetAdPlacements", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetAllUsersCharacters: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetAllUsersCharacters", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetCatalogItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetCatalogItems", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetCharacterData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetCharacterData", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetCharacterInventory: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetCharacterInventory", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetCharacterLeaderboard: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetCharacterLeaderboard", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetCharacterReadOnlyData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetCharacterReadOnlyData", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetCharacterStatistics: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetCharacterStatistics", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetContentDownloadUrl: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetContentDownloadUrl", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetFriendLeaderboard: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetFriendLeaderboard", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetFriendLeaderboardAroundPlayer: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetFriendLeaderboardAroundPlayer", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetFriendsList: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetFriendsList", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetLeaderboard: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetLeaderboard", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetLeaderboardAroundCharacter: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetLeaderboardAroundCharacter", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetLeaderboardAroundPlayer: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetLeaderboardAroundPlayer", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetLeaderboardForUserCharacters: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetLeaderboardForUserCharacters", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPaymentToken: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPaymentToken", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPhotonAuthenticationToken: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPhotonAuthenticationToken", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPlayerCombinedInfo: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayerCombinedInfo", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPlayerProfile: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayerProfile", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPlayerSegments: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayerSegments", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPlayerStatistics: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayerStatistics", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPlayerStatisticVersions: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayerStatisticVersions", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPlayerTags: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayerTags", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPlayerTrades: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayerTrades", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPlayFabIDsFromFacebookIDs: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromFacebookIDs", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPlayFabIDsFromFacebookInstantGamesIds: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromFacebookInstantGamesIds", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPlayFabIDsFromGameCenterIDs: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromGameCenterIDs", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPlayFabIDsFromGenericIDs: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromGenericIDs", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPlayFabIDsFromGoogleIDs: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromGoogleIDs", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPlayFabIDsFromGooglePlayGamesPlayerIDs: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromGooglePlayGamesPlayerIDs", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPlayFabIDsFromKongregateIDs: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromKongregateIDs", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPlayFabIDsFromNintendoServiceAccountIds: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromNintendoServiceAccountIds", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPlayFabIDsFromNintendoSwitchDeviceIds: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromNintendoSwitchDeviceIds", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPlayFabIDsFromPSNAccountIDs: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromPSNAccountIDs", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPlayFabIDsFromPSNOnlineIDs: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromPSNOnlineIDs", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPlayFabIDsFromSteamIDs: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromSteamIDs", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPlayFabIDsFromTwitchIDs: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromTwitchIDs", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPlayFabIDsFromXboxLiveIDs: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPlayFabIDsFromXboxLiveIDs", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPublisherData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPublisherData", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetPurchase: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetPurchase", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetSharedGroupData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetSharedGroupData", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetStoreItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetStoreItems", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetTime: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetTime", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetTitleData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetTitleData", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetTitleNews: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetTitleNews", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetTitlePublicKey: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetTitlePublicKey", request, null, callback, customData, extraHeaders); + }, + + GetTradeStatus: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetTradeStatus", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetUserData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetUserData", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetUserInventory: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetUserInventory", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetUserPublisherData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetUserPublisherData", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetUserPublisherReadOnlyData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetUserPublisherReadOnlyData", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GetUserReadOnlyData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GetUserReadOnlyData", request, "X-Authorization", callback, customData, extraHeaders); + }, + + GrantCharacterToUser: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/GrantCharacterToUser", request, "X-Authorization", callback, customData, extraHeaders); + }, + + LinkAndroidDeviceID: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkAndroidDeviceID", request, "X-Authorization", callback, customData, extraHeaders); + }, + + LinkApple: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkApple", request, "X-Authorization", callback, customData, extraHeaders); + }, + + LinkCustomID: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkCustomID", request, "X-Authorization", callback, customData, extraHeaders); + }, + + LinkFacebookAccount: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkFacebookAccount", request, "X-Authorization", callback, customData, extraHeaders); + }, + + LinkFacebookInstantGamesId: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkFacebookInstantGamesId", request, "X-Authorization", callback, customData, extraHeaders); + }, + + LinkGameCenterAccount: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkGameCenterAccount", request, "X-Authorization", callback, customData, extraHeaders); + }, + + LinkGoogleAccount: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkGoogleAccount", request, "X-Authorization", callback, customData, extraHeaders); + }, + + LinkGooglePlayGamesServicesAccount: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkGooglePlayGamesServicesAccount", request, "X-Authorization", callback, customData, extraHeaders); + }, + + LinkIOSDeviceID: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkIOSDeviceID", request, "X-Authorization", callback, customData, extraHeaders); + }, + + LinkKongregate: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkKongregate", request, "X-Authorization", callback, customData, extraHeaders); + }, + + LinkNintendoServiceAccount: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkNintendoServiceAccount", request, "X-Authorization", callback, customData, extraHeaders); + }, + + LinkNintendoSwitchDeviceId: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkNintendoSwitchDeviceId", request, "X-Authorization", callback, customData, extraHeaders); + }, + + LinkOpenIdConnect: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkOpenIdConnect", request, "X-Authorization", callback, customData, extraHeaders); + }, + + LinkPSNAccount: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkPSNAccount", request, "X-Authorization", callback, customData, extraHeaders); + }, + + LinkSteamAccount: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkSteamAccount", request, "X-Authorization", callback, customData, extraHeaders); + }, + + LinkTwitch: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkTwitch", request, "X-Authorization", callback, customData, extraHeaders); + }, + + LinkXboxAccount: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LinkXboxAccount", request, "X-Authorization", callback, customData, extraHeaders); + }, + + LoginWithAndroidDeviceID: function (request, callback, customData, extraHeaders) { request.TitleId = PlayFab.settings.titleId ? PlayFab.settings.titleId : request.TitleId; if (!request.TitleId) throw PlayFab._internalSettings.errorTitleId; // PlayFab._internalSettings.authenticationContext can be modified by other asynchronous login attempts // Deep-copy the authenticationContext here to safely update it var authenticationContext = JSON.parse(JSON.stringify(PlayFab._internalSettings.authenticationContext)); - var overloadCallback = function (result, error) { + var overloadCallback = function (result, error) { if (result != null) { if(result.data.SessionTicket != null) { PlayFab._internalSettings.sessionTicket = result.data.SessionTicket; @@ -620,21 +620,21 @@ PlayFab.ClientApi = { } // Apply the updates for the AuthenticationContext returned to the client authenticationContext = PlayFab._internalSettings.UpdateAuthenticationContext(authenticationContext, result); - } - if (callback != null && typeof (callback) === "function") - callback(result, error); - }; - PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithAndroidDeviceID", request, null, overloadCallback, customData, extraHeaders); - // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() - return new Promise(function(resolve){resolve(authenticationContext);}); - }, - - LoginWithApple: function (request, callback, customData, extraHeaders) { + } + if (callback != null && typeof (callback) === "function") + callback(result, error); + }; + PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithAndroidDeviceID", request, null, overloadCallback, customData, extraHeaders); + // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() + return new Promise(function(resolve){resolve(authenticationContext);}); + }, + + LoginWithApple: function (request, callback, customData, extraHeaders) { request.TitleId = PlayFab.settings.titleId ? PlayFab.settings.titleId : request.TitleId; if (!request.TitleId) throw PlayFab._internalSettings.errorTitleId; // PlayFab._internalSettings.authenticationContext can be modified by other asynchronous login attempts // Deep-copy the authenticationContext here to safely update it var authenticationContext = JSON.parse(JSON.stringify(PlayFab._internalSettings.authenticationContext)); - var overloadCallback = function (result, error) { + var overloadCallback = function (result, error) { if (result != null) { if(result.data.SessionTicket != null) { PlayFab._internalSettings.sessionTicket = result.data.SessionTicket; @@ -644,21 +644,21 @@ PlayFab.ClientApi = { } // Apply the updates for the AuthenticationContext returned to the client authenticationContext = PlayFab._internalSettings.UpdateAuthenticationContext(authenticationContext, result); - } - if (callback != null && typeof (callback) === "function") - callback(result, error); - }; - PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithApple", request, null, overloadCallback, customData, extraHeaders); - // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() - return new Promise(function(resolve){resolve(authenticationContext);}); - }, - - LoginWithCustomID: function (request, callback, customData, extraHeaders) { + } + if (callback != null && typeof (callback) === "function") + callback(result, error); + }; + PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithApple", request, null, overloadCallback, customData, extraHeaders); + // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() + return new Promise(function(resolve){resolve(authenticationContext);}); + }, + + LoginWithCustomID: function (request, callback, customData, extraHeaders) { request.TitleId = PlayFab.settings.titleId ? PlayFab.settings.titleId : request.TitleId; if (!request.TitleId) throw PlayFab._internalSettings.errorTitleId; // PlayFab._internalSettings.authenticationContext can be modified by other asynchronous login attempts // Deep-copy the authenticationContext here to safely update it var authenticationContext = JSON.parse(JSON.stringify(PlayFab._internalSettings.authenticationContext)); - var overloadCallback = function (result, error) { + var overloadCallback = function (result, error) { if (result != null) { if(result.data.SessionTicket != null) { PlayFab._internalSettings.sessionTicket = result.data.SessionTicket; @@ -668,21 +668,21 @@ PlayFab.ClientApi = { } // Apply the updates for the AuthenticationContext returned to the client authenticationContext = PlayFab._internalSettings.UpdateAuthenticationContext(authenticationContext, result); - } - if (callback != null && typeof (callback) === "function") - callback(result, error); - }; - PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithCustomID", request, null, overloadCallback, customData, extraHeaders); - // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() - return new Promise(function(resolve){resolve(authenticationContext);}); - }, - - LoginWithEmailAddress: function (request, callback, customData, extraHeaders) { + } + if (callback != null && typeof (callback) === "function") + callback(result, error); + }; + PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithCustomID", request, null, overloadCallback, customData, extraHeaders); + // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() + return new Promise(function(resolve){resolve(authenticationContext);}); + }, + + LoginWithEmailAddress: function (request, callback, customData, extraHeaders) { request.TitleId = PlayFab.settings.titleId ? PlayFab.settings.titleId : request.TitleId; if (!request.TitleId) throw PlayFab._internalSettings.errorTitleId; // PlayFab._internalSettings.authenticationContext can be modified by other asynchronous login attempts // Deep-copy the authenticationContext here to safely update it var authenticationContext = JSON.parse(JSON.stringify(PlayFab._internalSettings.authenticationContext)); - var overloadCallback = function (result, error) { + var overloadCallback = function (result, error) { if (result != null) { if(result.data.SessionTicket != null) { PlayFab._internalSettings.sessionTicket = result.data.SessionTicket; @@ -692,21 +692,21 @@ PlayFab.ClientApi = { } // Apply the updates for the AuthenticationContext returned to the client authenticationContext = PlayFab._internalSettings.UpdateAuthenticationContext(authenticationContext, result); - } - if (callback != null && typeof (callback) === "function") - callback(result, error); - }; - PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithEmailAddress", request, null, overloadCallback, customData, extraHeaders); - // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() - return new Promise(function(resolve){resolve(authenticationContext);}); - }, - - LoginWithFacebook: function (request, callback, customData, extraHeaders) { + } + if (callback != null && typeof (callback) === "function") + callback(result, error); + }; + PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithEmailAddress", request, null, overloadCallback, customData, extraHeaders); + // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() + return new Promise(function(resolve){resolve(authenticationContext);}); + }, + + LoginWithFacebook: function (request, callback, customData, extraHeaders) { request.TitleId = PlayFab.settings.titleId ? PlayFab.settings.titleId : request.TitleId; if (!request.TitleId) throw PlayFab._internalSettings.errorTitleId; // PlayFab._internalSettings.authenticationContext can be modified by other asynchronous login attempts // Deep-copy the authenticationContext here to safely update it var authenticationContext = JSON.parse(JSON.stringify(PlayFab._internalSettings.authenticationContext)); - var overloadCallback = function (result, error) { + var overloadCallback = function (result, error) { if (result != null) { if(result.data.SessionTicket != null) { PlayFab._internalSettings.sessionTicket = result.data.SessionTicket; @@ -716,21 +716,21 @@ PlayFab.ClientApi = { } // Apply the updates for the AuthenticationContext returned to the client authenticationContext = PlayFab._internalSettings.UpdateAuthenticationContext(authenticationContext, result); - } - if (callback != null && typeof (callback) === "function") - callback(result, error); - }; - PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithFacebook", request, null, overloadCallback, customData, extraHeaders); - // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() - return new Promise(function(resolve){resolve(authenticationContext);}); - }, - - LoginWithFacebookInstantGamesId: function (request, callback, customData, extraHeaders) { + } + if (callback != null && typeof (callback) === "function") + callback(result, error); + }; + PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithFacebook", request, null, overloadCallback, customData, extraHeaders); + // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() + return new Promise(function(resolve){resolve(authenticationContext);}); + }, + + LoginWithFacebookInstantGamesId: function (request, callback, customData, extraHeaders) { request.TitleId = PlayFab.settings.titleId ? PlayFab.settings.titleId : request.TitleId; if (!request.TitleId) throw PlayFab._internalSettings.errorTitleId; // PlayFab._internalSettings.authenticationContext can be modified by other asynchronous login attempts // Deep-copy the authenticationContext here to safely update it var authenticationContext = JSON.parse(JSON.stringify(PlayFab._internalSettings.authenticationContext)); - var overloadCallback = function (result, error) { + var overloadCallback = function (result, error) { if (result != null) { if(result.data.SessionTicket != null) { PlayFab._internalSettings.sessionTicket = result.data.SessionTicket; @@ -740,21 +740,21 @@ PlayFab.ClientApi = { } // Apply the updates for the AuthenticationContext returned to the client authenticationContext = PlayFab._internalSettings.UpdateAuthenticationContext(authenticationContext, result); - } - if (callback != null && typeof (callback) === "function") - callback(result, error); - }; - PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithFacebookInstantGamesId", request, null, overloadCallback, customData, extraHeaders); - // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() - return new Promise(function(resolve){resolve(authenticationContext);}); - }, - - LoginWithGameCenter: function (request, callback, customData, extraHeaders) { + } + if (callback != null && typeof (callback) === "function") + callback(result, error); + }; + PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithFacebookInstantGamesId", request, null, overloadCallback, customData, extraHeaders); + // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() + return new Promise(function(resolve){resolve(authenticationContext);}); + }, + + LoginWithGameCenter: function (request, callback, customData, extraHeaders) { request.TitleId = PlayFab.settings.titleId ? PlayFab.settings.titleId : request.TitleId; if (!request.TitleId) throw PlayFab._internalSettings.errorTitleId; // PlayFab._internalSettings.authenticationContext can be modified by other asynchronous login attempts // Deep-copy the authenticationContext here to safely update it var authenticationContext = JSON.parse(JSON.stringify(PlayFab._internalSettings.authenticationContext)); - var overloadCallback = function (result, error) { + var overloadCallback = function (result, error) { if (result != null) { if(result.data.SessionTicket != null) { PlayFab._internalSettings.sessionTicket = result.data.SessionTicket; @@ -764,21 +764,21 @@ PlayFab.ClientApi = { } // Apply the updates for the AuthenticationContext returned to the client authenticationContext = PlayFab._internalSettings.UpdateAuthenticationContext(authenticationContext, result); - } - if (callback != null && typeof (callback) === "function") - callback(result, error); - }; - PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithGameCenter", request, null, overloadCallback, customData, extraHeaders); - // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() - return new Promise(function(resolve){resolve(authenticationContext);}); - }, - - LoginWithGoogleAccount: function (request, callback, customData, extraHeaders) { + } + if (callback != null && typeof (callback) === "function") + callback(result, error); + }; + PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithGameCenter", request, null, overloadCallback, customData, extraHeaders); + // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() + return new Promise(function(resolve){resolve(authenticationContext);}); + }, + + LoginWithGoogleAccount: function (request, callback, customData, extraHeaders) { request.TitleId = PlayFab.settings.titleId ? PlayFab.settings.titleId : request.TitleId; if (!request.TitleId) throw PlayFab._internalSettings.errorTitleId; // PlayFab._internalSettings.authenticationContext can be modified by other asynchronous login attempts // Deep-copy the authenticationContext here to safely update it var authenticationContext = JSON.parse(JSON.stringify(PlayFab._internalSettings.authenticationContext)); - var overloadCallback = function (result, error) { + var overloadCallback = function (result, error) { if (result != null) { if(result.data.SessionTicket != null) { PlayFab._internalSettings.sessionTicket = result.data.SessionTicket; @@ -788,21 +788,21 @@ PlayFab.ClientApi = { } // Apply the updates for the AuthenticationContext returned to the client authenticationContext = PlayFab._internalSettings.UpdateAuthenticationContext(authenticationContext, result); - } - if (callback != null && typeof (callback) === "function") - callback(result, error); - }; - PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithGoogleAccount", request, null, overloadCallback, customData, extraHeaders); - // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() - return new Promise(function(resolve){resolve(authenticationContext);}); - }, - - LoginWithGooglePlayGamesServices: function (request, callback, customData, extraHeaders) { + } + if (callback != null && typeof (callback) === "function") + callback(result, error); + }; + PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithGoogleAccount", request, null, overloadCallback, customData, extraHeaders); + // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() + return new Promise(function(resolve){resolve(authenticationContext);}); + }, + + LoginWithGooglePlayGamesServices: function (request, callback, customData, extraHeaders) { request.TitleId = PlayFab.settings.titleId ? PlayFab.settings.titleId : request.TitleId; if (!request.TitleId) throw PlayFab._internalSettings.errorTitleId; // PlayFab._internalSettings.authenticationContext can be modified by other asynchronous login attempts // Deep-copy the authenticationContext here to safely update it var authenticationContext = JSON.parse(JSON.stringify(PlayFab._internalSettings.authenticationContext)); - var overloadCallback = function (result, error) { + var overloadCallback = function (result, error) { if (result != null) { if(result.data.SessionTicket != null) { PlayFab._internalSettings.sessionTicket = result.data.SessionTicket; @@ -812,21 +812,21 @@ PlayFab.ClientApi = { } // Apply the updates for the AuthenticationContext returned to the client authenticationContext = PlayFab._internalSettings.UpdateAuthenticationContext(authenticationContext, result); - } - if (callback != null && typeof (callback) === "function") - callback(result, error); - }; - PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithGooglePlayGamesServices", request, null, overloadCallback, customData, extraHeaders); - // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() - return new Promise(function(resolve){resolve(authenticationContext);}); - }, - - LoginWithIOSDeviceID: function (request, callback, customData, extraHeaders) { + } + if (callback != null && typeof (callback) === "function") + callback(result, error); + }; + PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithGooglePlayGamesServices", request, null, overloadCallback, customData, extraHeaders); + // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() + return new Promise(function(resolve){resolve(authenticationContext);}); + }, + + LoginWithIOSDeviceID: function (request, callback, customData, extraHeaders) { request.TitleId = PlayFab.settings.titleId ? PlayFab.settings.titleId : request.TitleId; if (!request.TitleId) throw PlayFab._internalSettings.errorTitleId; // PlayFab._internalSettings.authenticationContext can be modified by other asynchronous login attempts // Deep-copy the authenticationContext here to safely update it var authenticationContext = JSON.parse(JSON.stringify(PlayFab._internalSettings.authenticationContext)); - var overloadCallback = function (result, error) { + var overloadCallback = function (result, error) { if (result != null) { if(result.data.SessionTicket != null) { PlayFab._internalSettings.sessionTicket = result.data.SessionTicket; @@ -836,21 +836,21 @@ PlayFab.ClientApi = { } // Apply the updates for the AuthenticationContext returned to the client authenticationContext = PlayFab._internalSettings.UpdateAuthenticationContext(authenticationContext, result); - } - if (callback != null && typeof (callback) === "function") - callback(result, error); - }; - PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithIOSDeviceID", request, null, overloadCallback, customData, extraHeaders); - // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() - return new Promise(function(resolve){resolve(authenticationContext);}); - }, - - LoginWithKongregate: function (request, callback, customData, extraHeaders) { + } + if (callback != null && typeof (callback) === "function") + callback(result, error); + }; + PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithIOSDeviceID", request, null, overloadCallback, customData, extraHeaders); + // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() + return new Promise(function(resolve){resolve(authenticationContext);}); + }, + + LoginWithKongregate: function (request, callback, customData, extraHeaders) { request.TitleId = PlayFab.settings.titleId ? PlayFab.settings.titleId : request.TitleId; if (!request.TitleId) throw PlayFab._internalSettings.errorTitleId; // PlayFab._internalSettings.authenticationContext can be modified by other asynchronous login attempts // Deep-copy the authenticationContext here to safely update it var authenticationContext = JSON.parse(JSON.stringify(PlayFab._internalSettings.authenticationContext)); - var overloadCallback = function (result, error) { + var overloadCallback = function (result, error) { if (result != null) { if(result.data.SessionTicket != null) { PlayFab._internalSettings.sessionTicket = result.data.SessionTicket; @@ -860,21 +860,21 @@ PlayFab.ClientApi = { } // Apply the updates for the AuthenticationContext returned to the client authenticationContext = PlayFab._internalSettings.UpdateAuthenticationContext(authenticationContext, result); - } - if (callback != null && typeof (callback) === "function") - callback(result, error); - }; - PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithKongregate", request, null, overloadCallback, customData, extraHeaders); - // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() - return new Promise(function(resolve){resolve(authenticationContext);}); - }, - - LoginWithNintendoServiceAccount: function (request, callback, customData, extraHeaders) { + } + if (callback != null && typeof (callback) === "function") + callback(result, error); + }; + PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithKongregate", request, null, overloadCallback, customData, extraHeaders); + // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() + return new Promise(function(resolve){resolve(authenticationContext);}); + }, + + LoginWithNintendoServiceAccount: function (request, callback, customData, extraHeaders) { request.TitleId = PlayFab.settings.titleId ? PlayFab.settings.titleId : request.TitleId; if (!request.TitleId) throw PlayFab._internalSettings.errorTitleId; // PlayFab._internalSettings.authenticationContext can be modified by other asynchronous login attempts // Deep-copy the authenticationContext here to safely update it var authenticationContext = JSON.parse(JSON.stringify(PlayFab._internalSettings.authenticationContext)); - var overloadCallback = function (result, error) { + var overloadCallback = function (result, error) { if (result != null) { if(result.data.SessionTicket != null) { PlayFab._internalSettings.sessionTicket = result.data.SessionTicket; @@ -884,21 +884,21 @@ PlayFab.ClientApi = { } // Apply the updates for the AuthenticationContext returned to the client authenticationContext = PlayFab._internalSettings.UpdateAuthenticationContext(authenticationContext, result); - } - if (callback != null && typeof (callback) === "function") - callback(result, error); - }; - PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithNintendoServiceAccount", request, null, overloadCallback, customData, extraHeaders); - // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() - return new Promise(function(resolve){resolve(authenticationContext);}); - }, - - LoginWithNintendoSwitchDeviceId: function (request, callback, customData, extraHeaders) { + } + if (callback != null && typeof (callback) === "function") + callback(result, error); + }; + PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithNintendoServiceAccount", request, null, overloadCallback, customData, extraHeaders); + // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() + return new Promise(function(resolve){resolve(authenticationContext);}); + }, + + LoginWithNintendoSwitchDeviceId: function (request, callback, customData, extraHeaders) { request.TitleId = PlayFab.settings.titleId ? PlayFab.settings.titleId : request.TitleId; if (!request.TitleId) throw PlayFab._internalSettings.errorTitleId; // PlayFab._internalSettings.authenticationContext can be modified by other asynchronous login attempts // Deep-copy the authenticationContext here to safely update it var authenticationContext = JSON.parse(JSON.stringify(PlayFab._internalSettings.authenticationContext)); - var overloadCallback = function (result, error) { + var overloadCallback = function (result, error) { if (result != null) { if(result.data.SessionTicket != null) { PlayFab._internalSettings.sessionTicket = result.data.SessionTicket; @@ -908,21 +908,21 @@ PlayFab.ClientApi = { } // Apply the updates for the AuthenticationContext returned to the client authenticationContext = PlayFab._internalSettings.UpdateAuthenticationContext(authenticationContext, result); - } - if (callback != null && typeof (callback) === "function") - callback(result, error); - }; - PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithNintendoSwitchDeviceId", request, null, overloadCallback, customData, extraHeaders); - // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() - return new Promise(function(resolve){resolve(authenticationContext);}); - }, - - LoginWithOpenIdConnect: function (request, callback, customData, extraHeaders) { + } + if (callback != null && typeof (callback) === "function") + callback(result, error); + }; + PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithNintendoSwitchDeviceId", request, null, overloadCallback, customData, extraHeaders); + // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() + return new Promise(function(resolve){resolve(authenticationContext);}); + }, + + LoginWithOpenIdConnect: function (request, callback, customData, extraHeaders) { request.TitleId = PlayFab.settings.titleId ? PlayFab.settings.titleId : request.TitleId; if (!request.TitleId) throw PlayFab._internalSettings.errorTitleId; // PlayFab._internalSettings.authenticationContext can be modified by other asynchronous login attempts // Deep-copy the authenticationContext here to safely update it var authenticationContext = JSON.parse(JSON.stringify(PlayFab._internalSettings.authenticationContext)); - var overloadCallback = function (result, error) { + var overloadCallback = function (result, error) { if (result != null) { if(result.data.SessionTicket != null) { PlayFab._internalSettings.sessionTicket = result.data.SessionTicket; @@ -932,21 +932,21 @@ PlayFab.ClientApi = { } // Apply the updates for the AuthenticationContext returned to the client authenticationContext = PlayFab._internalSettings.UpdateAuthenticationContext(authenticationContext, result); - } - if (callback != null && typeof (callback) === "function") - callback(result, error); - }; - PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithOpenIdConnect", request, null, overloadCallback, customData, extraHeaders); - // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() - return new Promise(function(resolve){resolve(authenticationContext);}); - }, - - LoginWithPlayFab: function (request, callback, customData, extraHeaders) { + } + if (callback != null && typeof (callback) === "function") + callback(result, error); + }; + PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithOpenIdConnect", request, null, overloadCallback, customData, extraHeaders); + // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() + return new Promise(function(resolve){resolve(authenticationContext);}); + }, + + LoginWithPlayFab: function (request, callback, customData, extraHeaders) { request.TitleId = PlayFab.settings.titleId ? PlayFab.settings.titleId : request.TitleId; if (!request.TitleId) throw PlayFab._internalSettings.errorTitleId; // PlayFab._internalSettings.authenticationContext can be modified by other asynchronous login attempts // Deep-copy the authenticationContext here to safely update it var authenticationContext = JSON.parse(JSON.stringify(PlayFab._internalSettings.authenticationContext)); - var overloadCallback = function (result, error) { + var overloadCallback = function (result, error) { if (result != null) { if(result.data.SessionTicket != null) { PlayFab._internalSettings.sessionTicket = result.data.SessionTicket; @@ -956,21 +956,21 @@ PlayFab.ClientApi = { } // Apply the updates for the AuthenticationContext returned to the client authenticationContext = PlayFab._internalSettings.UpdateAuthenticationContext(authenticationContext, result); - } - if (callback != null && typeof (callback) === "function") - callback(result, error); - }; - PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithPlayFab", request, null, overloadCallback, customData, extraHeaders); - // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() - return new Promise(function(resolve){resolve(authenticationContext);}); - }, - - LoginWithPSN: function (request, callback, customData, extraHeaders) { + } + if (callback != null && typeof (callback) === "function") + callback(result, error); + }; + PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithPlayFab", request, null, overloadCallback, customData, extraHeaders); + // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() + return new Promise(function(resolve){resolve(authenticationContext);}); + }, + + LoginWithPSN: function (request, callback, customData, extraHeaders) { request.TitleId = PlayFab.settings.titleId ? PlayFab.settings.titleId : request.TitleId; if (!request.TitleId) throw PlayFab._internalSettings.errorTitleId; // PlayFab._internalSettings.authenticationContext can be modified by other asynchronous login attempts // Deep-copy the authenticationContext here to safely update it var authenticationContext = JSON.parse(JSON.stringify(PlayFab._internalSettings.authenticationContext)); - var overloadCallback = function (result, error) { + var overloadCallback = function (result, error) { if (result != null) { if(result.data.SessionTicket != null) { PlayFab._internalSettings.sessionTicket = result.data.SessionTicket; @@ -980,21 +980,21 @@ PlayFab.ClientApi = { } // Apply the updates for the AuthenticationContext returned to the client authenticationContext = PlayFab._internalSettings.UpdateAuthenticationContext(authenticationContext, result); - } - if (callback != null && typeof (callback) === "function") - callback(result, error); - }; - PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithPSN", request, null, overloadCallback, customData, extraHeaders); - // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() - return new Promise(function(resolve){resolve(authenticationContext);}); - }, - - LoginWithSteam: function (request, callback, customData, extraHeaders) { + } + if (callback != null && typeof (callback) === "function") + callback(result, error); + }; + PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithPSN", request, null, overloadCallback, customData, extraHeaders); + // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() + return new Promise(function(resolve){resolve(authenticationContext);}); + }, + + LoginWithSteam: function (request, callback, customData, extraHeaders) { request.TitleId = PlayFab.settings.titleId ? PlayFab.settings.titleId : request.TitleId; if (!request.TitleId) throw PlayFab._internalSettings.errorTitleId; // PlayFab._internalSettings.authenticationContext can be modified by other asynchronous login attempts // Deep-copy the authenticationContext here to safely update it var authenticationContext = JSON.parse(JSON.stringify(PlayFab._internalSettings.authenticationContext)); - var overloadCallback = function (result, error) { + var overloadCallback = function (result, error) { if (result != null) { if(result.data.SessionTicket != null) { PlayFab._internalSettings.sessionTicket = result.data.SessionTicket; @@ -1004,21 +1004,21 @@ PlayFab.ClientApi = { } // Apply the updates for the AuthenticationContext returned to the client authenticationContext = PlayFab._internalSettings.UpdateAuthenticationContext(authenticationContext, result); - } - if (callback != null && typeof (callback) === "function") - callback(result, error); - }; - PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithSteam", request, null, overloadCallback, customData, extraHeaders); - // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() - return new Promise(function(resolve){resolve(authenticationContext);}); - }, - - LoginWithTwitch: function (request, callback, customData, extraHeaders) { + } + if (callback != null && typeof (callback) === "function") + callback(result, error); + }; + PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithSteam", request, null, overloadCallback, customData, extraHeaders); + // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() + return new Promise(function(resolve){resolve(authenticationContext);}); + }, + + LoginWithTwitch: function (request, callback, customData, extraHeaders) { request.TitleId = PlayFab.settings.titleId ? PlayFab.settings.titleId : request.TitleId; if (!request.TitleId) throw PlayFab._internalSettings.errorTitleId; // PlayFab._internalSettings.authenticationContext can be modified by other asynchronous login attempts // Deep-copy the authenticationContext here to safely update it var authenticationContext = JSON.parse(JSON.stringify(PlayFab._internalSettings.authenticationContext)); - var overloadCallback = function (result, error) { + var overloadCallback = function (result, error) { if (result != null) { if(result.data.SessionTicket != null) { PlayFab._internalSettings.sessionTicket = result.data.SessionTicket; @@ -1028,21 +1028,21 @@ PlayFab.ClientApi = { } // Apply the updates for the AuthenticationContext returned to the client authenticationContext = PlayFab._internalSettings.UpdateAuthenticationContext(authenticationContext, result); - } - if (callback != null && typeof (callback) === "function") - callback(result, error); - }; - PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithTwitch", request, null, overloadCallback, customData, extraHeaders); - // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() - return new Promise(function(resolve){resolve(authenticationContext);}); - }, - - LoginWithXbox: function (request, callback, customData, extraHeaders) { + } + if (callback != null && typeof (callback) === "function") + callback(result, error); + }; + PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithTwitch", request, null, overloadCallback, customData, extraHeaders); + // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() + return new Promise(function(resolve){resolve(authenticationContext);}); + }, + + LoginWithXbox: function (request, callback, customData, extraHeaders) { request.TitleId = PlayFab.settings.titleId ? PlayFab.settings.titleId : request.TitleId; if (!request.TitleId) throw PlayFab._internalSettings.errorTitleId; // PlayFab._internalSettings.authenticationContext can be modified by other asynchronous login attempts // Deep-copy the authenticationContext here to safely update it var authenticationContext = JSON.parse(JSON.stringify(PlayFab._internalSettings.authenticationContext)); - var overloadCallback = function (result, error) { + var overloadCallback = function (result, error) { if (result != null) { if(result.data.SessionTicket != null) { PlayFab._internalSettings.sessionTicket = result.data.SessionTicket; @@ -1052,45 +1052,45 @@ PlayFab.ClientApi = { } // Apply the updates for the AuthenticationContext returned to the client authenticationContext = PlayFab._internalSettings.UpdateAuthenticationContext(authenticationContext, result); - } - if (callback != null && typeof (callback) === "function") - callback(result, error); - }; - PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithXbox", request, null, overloadCallback, customData, extraHeaders); - // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() - return new Promise(function(resolve){resolve(authenticationContext);}); - }, - - OpenTrade: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/OpenTrade", request, "X-Authorization", callback, customData, extraHeaders); - }, - - PayForPurchase: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/PayForPurchase", request, "X-Authorization", callback, customData, extraHeaders); - }, - - PurchaseItem: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/PurchaseItem", request, "X-Authorization", callback, customData, extraHeaders); - }, - - RedeemCoupon: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/RedeemCoupon", request, "X-Authorization", callback, customData, extraHeaders); - }, - - RefreshPSNAuthToken: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/RefreshPSNAuthToken", request, "X-Authorization", callback, customData, extraHeaders); - }, - - RegisterForIOSPushNotification: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/RegisterForIOSPushNotification", request, "X-Authorization", callback, customData, extraHeaders); - }, - - RegisterPlayFabUser: function (request, callback, customData, extraHeaders) { + } + if (callback != null && typeof (callback) === "function") + callback(result, error); + }; + PlayFab._internalSettings.ExecuteRequestWrapper("/Client/LoginWithXbox", request, null, overloadCallback, customData, extraHeaders); + // Return a Promise so that multiple asynchronous calls to this method can be handled simultaneously with Promise.all() + return new Promise(function(resolve){resolve(authenticationContext);}); + }, + + OpenTrade: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/OpenTrade", request, "X-Authorization", callback, customData, extraHeaders); + }, + + PayForPurchase: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/PayForPurchase", request, "X-Authorization", callback, customData, extraHeaders); + }, + + PurchaseItem: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/PurchaseItem", request, "X-Authorization", callback, customData, extraHeaders); + }, + + RedeemCoupon: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/RedeemCoupon", request, "X-Authorization", callback, customData, extraHeaders); + }, + + RefreshPSNAuthToken: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/RefreshPSNAuthToken", request, "X-Authorization", callback, customData, extraHeaders); + }, + + RegisterForIOSPushNotification: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/RegisterForIOSPushNotification", request, "X-Authorization", callback, customData, extraHeaders); + }, + + RegisterPlayFabUser: function (request, callback, customData, extraHeaders) { request.TitleId = PlayFab.settings.titleId ? PlayFab.settings.titleId : request.TitleId; if (!request.TitleId) throw PlayFab._internalSettings.errorTitleId; // PlayFab._internalSettings.authenticationContext can be modified by other asynchronous login attempts // Deep-copy the authenticationContext here to safely update it var authenticationContext = JSON.parse(JSON.stringify(PlayFab._internalSettings.authenticationContext)); - var overloadCallback = function (result, error) { + var overloadCallback = function (result, error) { if (result != null) { if(result.data.SessionTicket != null) { PlayFab._internalSettings.sessionTicket = result.data.SessionTicket; @@ -1100,221 +1100,221 @@ PlayFab.ClientApi = { } // Apply the updates for the AuthenticationContext returned to the client authenticationContext = PlayFab._internalSettings.UpdateAuthenticationContext(authenticationContext, result); - } - if (callback != null && typeof (callback) === "function") - callback(result, error); - }; - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/RegisterPlayFabUser", request, null, overloadCallback, customData, extraHeaders); - }, - - RemoveContactEmail: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/RemoveContactEmail", request, "X-Authorization", callback, customData, extraHeaders); - }, - - RemoveFriend: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/RemoveFriend", request, "X-Authorization", callback, customData, extraHeaders); - }, - - RemoveGenericID: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/RemoveGenericID", request, "X-Authorization", callback, customData, extraHeaders); - }, - - RemoveSharedGroupMembers: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/RemoveSharedGroupMembers", request, "X-Authorization", callback, customData, extraHeaders); - }, - - ReportAdActivity: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ReportAdActivity", request, "X-Authorization", callback, customData, extraHeaders); - }, - - ReportDeviceInfo: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ReportDeviceInfo", request, "X-Authorization", callback, customData, extraHeaders); - }, - - ReportPlayer: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ReportPlayer", request, "X-Authorization", callback, customData, extraHeaders); - }, - - RestoreIOSPurchases: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/RestoreIOSPurchases", request, "X-Authorization", callback, customData, extraHeaders); - }, - - RewardAdActivity: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/RewardAdActivity", request, "X-Authorization", callback, customData, extraHeaders); - }, - - SendAccountRecoveryEmail: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/SendAccountRecoveryEmail", request, null, callback, customData, extraHeaders); - }, - - SetFriendTags: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/SetFriendTags", request, "X-Authorization", callback, customData, extraHeaders); - }, - - SetPlayerSecret: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/SetPlayerSecret", request, "X-Authorization", callback, customData, extraHeaders); - }, - - StartPurchase: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/StartPurchase", request, "X-Authorization", callback, customData, extraHeaders); - }, - - SubtractUserVirtualCurrency: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/SubtractUserVirtualCurrency", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UnlinkAndroidDeviceID: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkAndroidDeviceID", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UnlinkApple: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkApple", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UnlinkCustomID: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkCustomID", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UnlinkFacebookAccount: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkFacebookAccount", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UnlinkFacebookInstantGamesId: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkFacebookInstantGamesId", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UnlinkGameCenterAccount: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkGameCenterAccount", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UnlinkGoogleAccount: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkGoogleAccount", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UnlinkGooglePlayGamesServicesAccount: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkGooglePlayGamesServicesAccount", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UnlinkIOSDeviceID: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkIOSDeviceID", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UnlinkKongregate: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkKongregate", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UnlinkNintendoServiceAccount: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkNintendoServiceAccount", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UnlinkNintendoSwitchDeviceId: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkNintendoSwitchDeviceId", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UnlinkOpenIdConnect: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkOpenIdConnect", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UnlinkPSNAccount: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkPSNAccount", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UnlinkSteamAccount: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkSteamAccount", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UnlinkTwitch: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkTwitch", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UnlinkXboxAccount: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkXboxAccount", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UnlockContainerInstance: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlockContainerInstance", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UnlockContainerItem: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlockContainerItem", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UpdateAvatarUrl: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UpdateAvatarUrl", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UpdateCharacterData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UpdateCharacterData", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UpdateCharacterStatistics: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UpdateCharacterStatistics", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UpdatePlayerStatistics: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UpdatePlayerStatistics", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UpdateSharedGroupData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UpdateSharedGroupData", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UpdateUserData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UpdateUserData", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UpdateUserPublisherData: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UpdateUserPublisherData", request, "X-Authorization", callback, customData, extraHeaders); - }, - - UpdateUserTitleDisplayName: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UpdateUserTitleDisplayName", request, "X-Authorization", callback, customData, extraHeaders); - }, - - ValidateAmazonIAPReceipt: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ValidateAmazonIAPReceipt", request, "X-Authorization", callback, customData, extraHeaders); - }, - - ValidateGooglePlayPurchase: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ValidateGooglePlayPurchase", request, "X-Authorization", callback, customData, extraHeaders); - }, - - ValidateIOSReceipt: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ValidateIOSReceipt", request, "X-Authorization", callback, customData, extraHeaders); - }, - - ValidateWindowsStoreReceipt: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ValidateWindowsStoreReceipt", request, "X-Authorization", callback, customData, extraHeaders); - }, - - WriteCharacterEvent: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/WriteCharacterEvent", request, "X-Authorization", callback, customData, extraHeaders); - }, - - WritePlayerEvent: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/WritePlayerEvent", request, "X-Authorization", callback, customData, extraHeaders); - }, - - WriteTitleEvent: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/WriteTitleEvent", request, "X-Authorization", callback, customData, extraHeaders); - }, - -}; - -var PlayFabClientSDK = PlayFab.ClientApi; - -PlayFab.RegisterWithPhaser = function() { - if ( typeof Phaser === "undefined" || typeof Phaser.Plugin === "undefined" ) - return; - - Phaser.Plugin.PlayFab = function (game, parent) { - Phaser.Plugin.call(this, game, parent); - }; - Phaser.Plugin.PlayFab.prototype = Object.create(Phaser.Plugin.prototype); - Phaser.Plugin.PlayFab.prototype.constructor = Phaser.Plugin.PlayFab; - Phaser.Plugin.PlayFab.prototype.PlayFab = PlayFab; - Phaser.Plugin.PlayFab.prototype.settings = PlayFab.settings; - Phaser.Plugin.PlayFab.prototype.ClientApi = PlayFab.ClientApi; -}; -PlayFab.RegisterWithPhaser(); - + } + if (callback != null && typeof (callback) === "function") + callback(result, error); + }; + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/RegisterPlayFabUser", request, null, overloadCallback, customData, extraHeaders); + }, + + RemoveContactEmail: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/RemoveContactEmail", request, "X-Authorization", callback, customData, extraHeaders); + }, + + RemoveFriend: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/RemoveFriend", request, "X-Authorization", callback, customData, extraHeaders); + }, + + RemoveGenericID: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/RemoveGenericID", request, "X-Authorization", callback, customData, extraHeaders); + }, + + RemoveSharedGroupMembers: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/RemoveSharedGroupMembers", request, "X-Authorization", callback, customData, extraHeaders); + }, + + ReportAdActivity: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ReportAdActivity", request, "X-Authorization", callback, customData, extraHeaders); + }, + + ReportDeviceInfo: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ReportDeviceInfo", request, "X-Authorization", callback, customData, extraHeaders); + }, + + ReportPlayer: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ReportPlayer", request, "X-Authorization", callback, customData, extraHeaders); + }, + + RestoreIOSPurchases: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/RestoreIOSPurchases", request, "X-Authorization", callback, customData, extraHeaders); + }, + + RewardAdActivity: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/RewardAdActivity", request, "X-Authorization", callback, customData, extraHeaders); + }, + + SendAccountRecoveryEmail: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/SendAccountRecoveryEmail", request, null, callback, customData, extraHeaders); + }, + + SetFriendTags: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/SetFriendTags", request, "X-Authorization", callback, customData, extraHeaders); + }, + + SetPlayerSecret: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/SetPlayerSecret", request, "X-Authorization", callback, customData, extraHeaders); + }, + + StartPurchase: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/StartPurchase", request, "X-Authorization", callback, customData, extraHeaders); + }, + + SubtractUserVirtualCurrency: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/SubtractUserVirtualCurrency", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UnlinkAndroidDeviceID: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkAndroidDeviceID", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UnlinkApple: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkApple", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UnlinkCustomID: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkCustomID", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UnlinkFacebookAccount: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkFacebookAccount", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UnlinkFacebookInstantGamesId: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkFacebookInstantGamesId", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UnlinkGameCenterAccount: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkGameCenterAccount", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UnlinkGoogleAccount: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkGoogleAccount", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UnlinkGooglePlayGamesServicesAccount: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkGooglePlayGamesServicesAccount", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UnlinkIOSDeviceID: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkIOSDeviceID", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UnlinkKongregate: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkKongregate", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UnlinkNintendoServiceAccount: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkNintendoServiceAccount", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UnlinkNintendoSwitchDeviceId: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkNintendoSwitchDeviceId", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UnlinkOpenIdConnect: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkOpenIdConnect", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UnlinkPSNAccount: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkPSNAccount", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UnlinkSteamAccount: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkSteamAccount", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UnlinkTwitch: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkTwitch", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UnlinkXboxAccount: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlinkXboxAccount", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UnlockContainerInstance: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlockContainerInstance", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UnlockContainerItem: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UnlockContainerItem", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UpdateAvatarUrl: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UpdateAvatarUrl", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UpdateCharacterData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UpdateCharacterData", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UpdateCharacterStatistics: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UpdateCharacterStatistics", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UpdatePlayerStatistics: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UpdatePlayerStatistics", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UpdateSharedGroupData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UpdateSharedGroupData", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UpdateUserData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UpdateUserData", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UpdateUserPublisherData: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UpdateUserPublisherData", request, "X-Authorization", callback, customData, extraHeaders); + }, + + UpdateUserTitleDisplayName: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/UpdateUserTitleDisplayName", request, "X-Authorization", callback, customData, extraHeaders); + }, + + ValidateAmazonIAPReceipt: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ValidateAmazonIAPReceipt", request, "X-Authorization", callback, customData, extraHeaders); + }, + + ValidateGooglePlayPurchase: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ValidateGooglePlayPurchase", request, "X-Authorization", callback, customData, extraHeaders); + }, + + ValidateIOSReceipt: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ValidateIOSReceipt", request, "X-Authorization", callback, customData, extraHeaders); + }, + + ValidateWindowsStoreReceipt: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/ValidateWindowsStoreReceipt", request, "X-Authorization", callback, customData, extraHeaders); + }, + + WriteCharacterEvent: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/WriteCharacterEvent", request, "X-Authorization", callback, customData, extraHeaders); + }, + + WritePlayerEvent: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/WritePlayerEvent", request, "X-Authorization", callback, customData, extraHeaders); + }, + + WriteTitleEvent: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Client/WriteTitleEvent", request, "X-Authorization", callback, customData, extraHeaders); + }, + +}; + +var PlayFabClientSDK = PlayFab.ClientApi; + +PlayFab.RegisterWithPhaser = function() { + if ( typeof Phaser === "undefined" || typeof Phaser.Plugin === "undefined" ) + return; + + Phaser.Plugin.PlayFab = function (game, parent) { + Phaser.Plugin.call(this, game, parent); + }; + Phaser.Plugin.PlayFab.prototype = Object.create(Phaser.Plugin.prototype); + Phaser.Plugin.PlayFab.prototype.constructor = Phaser.Plugin.PlayFab; + Phaser.Plugin.PlayFab.prototype.PlayFab = PlayFab; + Phaser.Plugin.PlayFab.prototype.settings = PlayFab.settings; + Phaser.Plugin.PlayFab.prototype.ClientApi = PlayFab.ClientApi; +}; +PlayFab.RegisterWithPhaser(); + diff --git a/website/public/PlayFabCloudScriptApi.js b/website/public/PlayFabCloudScriptApi.js index 71594f0..5ca326b 100644 --- a/website/public/PlayFabCloudScriptApi.js +++ b/website/public/PlayFabCloudScriptApi.js @@ -1,307 +1,307 @@ -/// - -var PlayFab = typeof PlayFab != "undefined" ? PlayFab : {}; - -if(!PlayFab.settings) { - PlayFab.settings = { - titleId: null, // You must set this value for PlayFabSdk to work properly (Found in the Game Manager for your title, at the PlayFab Website) - developerSecretKey: null, // For security reasons you must never expose this value to the client or players - You must set this value for Server-APIs to work properly (Found in the Game Manager for your title, at the PlayFab Website) - GlobalHeaderInjection: null, - productionServerUrl: ".playfabapi.com" - } -} - -if(!PlayFab._internalSettings) { - PlayFab._internalSettings = { - entityToken: null, - sdkVersion: "1.180.240913", - requestGetParams: { - sdk: "JavaScriptSDK-1.180.240913" - }, - sessionTicket: null, - verticalName: null, // The name of a customer vertical. This is only for customers running a private cluster. Generally you shouldn't touch this - errorTitleId: "Must be have PlayFab.settings.titleId set to call this method", - errorLoggedIn: "Must be logged in to call this method", - errorEntityToken: "You must successfully call GetEntityToken before calling this", - errorSecretKey: "Must have PlayFab.settings.developerSecretKey set to call this method", - - GetServerUrl: function () { - if (!(PlayFab.settings.productionServerUrl.substring(0, 4) === "http")) { - if (PlayFab._internalSettings.verticalName) { - return "https://" + PlayFab._internalSettings.verticalName + PlayFab.settings.productionServerUrl; - } else { - return "https://" + PlayFab.settings.titleId + PlayFab.settings.productionServerUrl; - } - } else { - return PlayFab.settings.productionServerUrl; - } - }, - - InjectHeaders: function (xhr, headersObj) { - if (!headersObj) - return; - - for (var headerKey in headersObj) - { - try { - xhr.setRequestHeader(gHeaderKey, headersObj[headerKey]); - } catch (e) { - console.log("Failed to append header: " + headerKey + " = " + headersObj[headerKey] + "Error: " + e); - } - } - }, - - ExecuteRequest: function (url, request, authkey, authValue, callback, customData, extraHeaders) { - var resultPromise = new Promise(function (resolve, reject) { - if (callback != null && typeof (callback) !== "function") - throw "Callback must be null or a function"; - - if (request == null) - request = {}; - - var startTime = new Date(); - var requestBody = JSON.stringify(request); - - var urlArr = [url]; - var getParams = PlayFab._internalSettings.requestGetParams; - if (getParams != null) { - var firstParam = true; - for (var key in getParams) { - if (firstParam) { - urlArr.push("?"); - firstParam = false; - } else { - urlArr.push("&"); - } - urlArr.push(key); - urlArr.push("="); - urlArr.push(getParams[key]); - } - } - - var completeUrl = urlArr.join(""); - - var xhr = new XMLHttpRequest(); - // window.console.log("URL: " + completeUrl); - xhr.open("POST", completeUrl, true); - - xhr.setRequestHeader("Content-Type", "application/json"); - xhr.setRequestHeader("X-PlayFabSDK", "JavaScriptSDK-" + PlayFab._internalSettings.sdkVersion); - if (authkey != null) - xhr.setRequestHeader(authkey, authValue); - PlayFab._internalSettings.InjectHeaders(xhr, PlayFab.settings.GlobalHeaderInjection); - PlayFab._internalSettings.InjectHeaders(xhr, extraHeaders); - - xhr.onloadend = function () { - if (callback == null) - return; - - var result = PlayFab._internalSettings.GetPlayFabResponse(request, xhr, startTime, customData); - if (result.code === 200) { - callback(result, null); - } else { - callback(null, result); - } - } - - xhr.onerror = function () { - if (callback == null) - return; - - var result = PlayFab._internalSettings.GetPlayFabResponse(request, xhr, startTime, customData); - callback(null, result); - } - - xhr.send(requestBody); - xhr.onreadystatechange = function () { - if (this.readyState === 4) { - var xhrResult = PlayFab._internalSettings.GetPlayFabResponse(request, this, startTime, customData); - if (this.status === 200) { - resolve(xhrResult); - } else { - reject(xhrResult); - } - } - }; - }); - // Return a Promise so that calls to various API methods can be handled asynchronously - return resultPromise; - }, - - GetPlayFabResponse: function(request, xhr, startTime, customData) { - var result = null; - try { - // window.console.log("parsing json result: " + xhr.responseText); - result = JSON.parse(xhr.responseText); - } catch (e) { - result = { - code: 503, // Service Unavailable - status: "Service Unavailable", - error: "Connection error", - errorCode: 2, // PlayFabErrorCode.ConnectionError - errorMessage: xhr.responseText - }; - } - - result.CallBackTimeMS = new Date() - startTime; - result.Request = request; - result.CustomData = customData; - return result; - }, - - authenticationContext: { - PlayFabId: null, - EntityId: null, - EntityType: null, - SessionTicket: null, - EntityToken: null - }, - - UpdateAuthenticationContext: function (authenticationContext, result) { - var authenticationContextUpdates = {}; - if(result.data.PlayFabId !== null) { - PlayFab._internalSettings.authenticationContext.PlayFabId = result.data.PlayFabId; - authenticationContextUpdates.PlayFabId = result.data.PlayFabId; - } - if(result.data.SessionTicket !== null) { - PlayFab._internalSettings.authenticationContext.SessionTicket = result.data.SessionTicket; - authenticationContextUpdates.SessionTicket = result.data.SessionTicket; - } - if (result.data.EntityToken !== null) { - PlayFab._internalSettings.authenticationContext.EntityId = result.data.EntityToken.Entity.Id; - authenticationContextUpdates.EntityId = result.data.EntityToken.Entity.Id; - PlayFab._internalSettings.authenticationContext.EntityType = result.data.EntityToken.Entity.Type; - authenticationContextUpdates.EntityType = result.data.EntityToken.Entity.Type; - PlayFab._internalSettings.authenticationContext.EntityToken = result.data.EntityToken.EntityToken; - authenticationContextUpdates.EntityToken = result.data.EntityToken.EntityToken; - } - // Update the authenticationContext with values from the result - authenticationContext = Object.assign(authenticationContext, authenticationContextUpdates); - return authenticationContext; - }, - - AuthInfoMap: { - "X-EntityToken": { - authAttr: "entityToken", - authError: "errorEntityToken" - }, - "X-Authorization": { - authAttr: "sessionTicket", - authError: "errorLoggedIn" - }, - "X-SecretKey": { - authAttr: "developerSecretKey", - authError: "errorSecretKey" - } - }, - - GetAuthInfo: function (request, authKey) { - // Use the most-recently saved authKey, unless one was provided in the request via the AuthenticationContext - var authError = PlayFab._internalSettings.AuthInfoMap[authKey].authError; - var authAttr = PlayFab._internalSettings.AuthInfoMap[authKey].authAttr; - var defaultAuthValue = null; - if (authAttr === "entityToken") - defaultAuthValue = PlayFab._internalSettings.entityToken; - else if (authAttr === "sessionTicket") - defaultAuthValue = PlayFab._internalSettings.sessionTicket; - else if (authAttr === "developerSecretKey") - defaultAuthValue = PlayFab.settings.developerSecretKey; - var authValue = request.AuthenticationContext ? request.AuthenticationContext[authAttr] : defaultAuthValue; - return {"authKey": authKey, "authValue": authValue, "authError": authError}; - }, - - ExecuteRequestWrapper: function (apiURL, request, authKey, callback, customData, extraHeaders) { - var authValue = null; - if (authKey !== null){ - var authInfo = PlayFab._internalSettings.GetAuthInfo(request, authKey=authKey); - var authKey = authInfo.authKey, authValue = authInfo.authValue, authError = authInfo.authError; - - if (!authValue) throw authError; - } - return PlayFab._internalSettings.ExecuteRequest(PlayFab._internalSettings.GetServerUrl() + apiURL, request, authKey, authValue, callback, customData, extraHeaders); - } - } -} - -PlayFab.buildIdentifier = "adobuild_javascriptsdk_114"; -PlayFab.sdkVersion = "1.180.240913"; -PlayFab.GenerateErrorReport = function (error) { - if (error == null) - return ""; - var fullErrors = error.errorMessage; - for (var paramName in error.errorDetails) - for (var msgIdx in error.errorDetails[paramName]) - fullErrors += "\n" + paramName + ": " + error.errorDetails[paramName][msgIdx]; - return fullErrors; -}; - -PlayFab.CloudScriptApi = { - ForgetAllCredentials: function () { - PlayFab._internalSettings.sessionTicket = null; - PlayFab._internalSettings.entityToken = null; - }, - - ExecuteEntityCloudScript: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/ExecuteEntityCloudScript", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - ExecuteFunction: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/ExecuteFunction", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - GetFunction: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/GetFunction", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - ListEventHubFunctions: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/ListEventHubFunctions", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - ListFunctions: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/ListFunctions", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - ListHttpFunctions: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/ListHttpFunctions", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - ListQueuedFunctions: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/ListQueuedFunctions", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - PostFunctionResultForEntityTriggeredAction: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/PostFunctionResultForEntityTriggeredAction", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - PostFunctionResultForFunctionExecution: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/PostFunctionResultForFunctionExecution", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - PostFunctionResultForPlayerTriggeredAction: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/PostFunctionResultForPlayerTriggeredAction", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - PostFunctionResultForScheduledTask: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/PostFunctionResultForScheduledTask", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - RegisterEventHubFunction: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/RegisterEventHubFunction", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - RegisterHttpFunction: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/RegisterHttpFunction", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - RegisterQueuedFunction: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/RegisterQueuedFunction", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - UnregisterFunction: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/UnregisterFunction", request, "X-EntityToken", callback, customData, extraHeaders); - }, - -}; - -var PlayFabCloudScriptSDK = PlayFab.CloudScriptApi; - +/// + +var PlayFab = typeof PlayFab != "undefined" ? PlayFab : {}; + +if(!PlayFab.settings) { + PlayFab.settings = { + titleId: null, // You must set this value for PlayFabSdk to work properly (Found in the Game Manager for your title, at the PlayFab Website) + developerSecretKey: null, // For security reasons you must never expose this value to the client or players - You must set this value for Server-APIs to work properly (Found in the Game Manager for your title, at the PlayFab Website) + GlobalHeaderInjection: null, + productionServerUrl: ".playfabapi.com" + } +} + +if(!PlayFab._internalSettings) { + PlayFab._internalSettings = { + entityToken: null, + sdkVersion: "1.180.240913", + requestGetParams: { + sdk: "JavaScriptSDK-1.180.240913" + }, + sessionTicket: null, + verticalName: null, // The name of a customer vertical. This is only for customers running a private cluster. Generally you shouldn't touch this + errorTitleId: "Must be have PlayFab.settings.titleId set to call this method", + errorLoggedIn: "Must be logged in to call this method", + errorEntityToken: "You must successfully call GetEntityToken before calling this", + errorSecretKey: "Must have PlayFab.settings.developerSecretKey set to call this method", + + GetServerUrl: function () { + if (!(PlayFab.settings.productionServerUrl.substring(0, 4) === "http")) { + if (PlayFab._internalSettings.verticalName) { + return "https://" + PlayFab._internalSettings.verticalName + PlayFab.settings.productionServerUrl; + } else { + return "https://" + PlayFab.settings.titleId + PlayFab.settings.productionServerUrl; + } + } else { + return PlayFab.settings.productionServerUrl; + } + }, + + InjectHeaders: function (xhr, headersObj) { + if (!headersObj) + return; + + for (var headerKey in headersObj) + { + try { + xhr.setRequestHeader(gHeaderKey, headersObj[headerKey]); + } catch (e) { + console.log("Failed to append header: " + headerKey + " = " + headersObj[headerKey] + "Error: " + e); + } + } + }, + + ExecuteRequest: function (url, request, authkey, authValue, callback, customData, extraHeaders) { + var resultPromise = new Promise(function (resolve, reject) { + if (callback != null && typeof (callback) !== "function") + throw "Callback must be null or a function"; + + if (request == null) + request = {}; + + var startTime = new Date(); + var requestBody = JSON.stringify(request); + + var urlArr = [url]; + var getParams = PlayFab._internalSettings.requestGetParams; + if (getParams != null) { + var firstParam = true; + for (var key in getParams) { + if (firstParam) { + urlArr.push("?"); + firstParam = false; + } else { + urlArr.push("&"); + } + urlArr.push(key); + urlArr.push("="); + urlArr.push(getParams[key]); + } + } + + var completeUrl = urlArr.join(""); + + var xhr = new XMLHttpRequest(); + // window.console.log("URL: " + completeUrl); + xhr.open("POST", completeUrl, true); + + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.setRequestHeader("X-PlayFabSDK", "JavaScriptSDK-" + PlayFab._internalSettings.sdkVersion); + if (authkey != null) + xhr.setRequestHeader(authkey, authValue); + PlayFab._internalSettings.InjectHeaders(xhr, PlayFab.settings.GlobalHeaderInjection); + PlayFab._internalSettings.InjectHeaders(xhr, extraHeaders); + + xhr.onloadend = function () { + if (callback == null) + return; + + var result = PlayFab._internalSettings.GetPlayFabResponse(request, xhr, startTime, customData); + if (result.code === 200) { + callback(result, null); + } else { + callback(null, result); + } + } + + xhr.onerror = function () { + if (callback == null) + return; + + var result = PlayFab._internalSettings.GetPlayFabResponse(request, xhr, startTime, customData); + callback(null, result); + } + + xhr.send(requestBody); + xhr.onreadystatechange = function () { + if (this.readyState === 4) { + var xhrResult = PlayFab._internalSettings.GetPlayFabResponse(request, this, startTime, customData); + if (this.status === 200) { + resolve(xhrResult); + } else { + reject(xhrResult); + } + } + }; + }); + // Return a Promise so that calls to various API methods can be handled asynchronously + return resultPromise; + }, + + GetPlayFabResponse: function(request, xhr, startTime, customData) { + var result = null; + try { + // window.console.log("parsing json result: " + xhr.responseText); + result = JSON.parse(xhr.responseText); + } catch (e) { + result = { + code: 503, // Service Unavailable + status: "Service Unavailable", + error: "Connection error", + errorCode: 2, // PlayFabErrorCode.ConnectionError + errorMessage: xhr.responseText + }; + } + + result.CallBackTimeMS = new Date() - startTime; + result.Request = request; + result.CustomData = customData; + return result; + }, + + authenticationContext: { + PlayFabId: null, + EntityId: null, + EntityType: null, + SessionTicket: null, + EntityToken: null + }, + + UpdateAuthenticationContext: function (authenticationContext, result) { + var authenticationContextUpdates = {}; + if(result.data.PlayFabId !== null) { + PlayFab._internalSettings.authenticationContext.PlayFabId = result.data.PlayFabId; + authenticationContextUpdates.PlayFabId = result.data.PlayFabId; + } + if(result.data.SessionTicket !== null) { + PlayFab._internalSettings.authenticationContext.SessionTicket = result.data.SessionTicket; + authenticationContextUpdates.SessionTicket = result.data.SessionTicket; + } + if (result.data.EntityToken !== null) { + PlayFab._internalSettings.authenticationContext.EntityId = result.data.EntityToken.Entity.Id; + authenticationContextUpdates.EntityId = result.data.EntityToken.Entity.Id; + PlayFab._internalSettings.authenticationContext.EntityType = result.data.EntityToken.Entity.Type; + authenticationContextUpdates.EntityType = result.data.EntityToken.Entity.Type; + PlayFab._internalSettings.authenticationContext.EntityToken = result.data.EntityToken.EntityToken; + authenticationContextUpdates.EntityToken = result.data.EntityToken.EntityToken; + } + // Update the authenticationContext with values from the result + authenticationContext = Object.assign(authenticationContext, authenticationContextUpdates); + return authenticationContext; + }, + + AuthInfoMap: { + "X-EntityToken": { + authAttr: "entityToken", + authError: "errorEntityToken" + }, + "X-Authorization": { + authAttr: "sessionTicket", + authError: "errorLoggedIn" + }, + "X-SecretKey": { + authAttr: "developerSecretKey", + authError: "errorSecretKey" + } + }, + + GetAuthInfo: function (request, authKey) { + // Use the most-recently saved authKey, unless one was provided in the request via the AuthenticationContext + var authError = PlayFab._internalSettings.AuthInfoMap[authKey].authError; + var authAttr = PlayFab._internalSettings.AuthInfoMap[authKey].authAttr; + var defaultAuthValue = null; + if (authAttr === "entityToken") + defaultAuthValue = PlayFab._internalSettings.entityToken; + else if (authAttr === "sessionTicket") + defaultAuthValue = PlayFab._internalSettings.sessionTicket; + else if (authAttr === "developerSecretKey") + defaultAuthValue = PlayFab.settings.developerSecretKey; + var authValue = request.AuthenticationContext ? request.AuthenticationContext[authAttr] : defaultAuthValue; + return {"authKey": authKey, "authValue": authValue, "authError": authError}; + }, + + ExecuteRequestWrapper: function (apiURL, request, authKey, callback, customData, extraHeaders) { + var authValue = null; + if (authKey !== null){ + var authInfo = PlayFab._internalSettings.GetAuthInfo(request, authKey=authKey); + var authKey = authInfo.authKey, authValue = authInfo.authValue, authError = authInfo.authError; + + if (!authValue) throw authError; + } + return PlayFab._internalSettings.ExecuteRequest(PlayFab._internalSettings.GetServerUrl() + apiURL, request, authKey, authValue, callback, customData, extraHeaders); + } + } +} + +PlayFab.buildIdentifier = "adobuild_javascriptsdk_114"; +PlayFab.sdkVersion = "1.180.240913"; +PlayFab.GenerateErrorReport = function (error) { + if (error == null) + return ""; + var fullErrors = error.errorMessage; + for (var paramName in error.errorDetails) + for (var msgIdx in error.errorDetails[paramName]) + fullErrors += "\n" + paramName + ": " + error.errorDetails[paramName][msgIdx]; + return fullErrors; +}; + +PlayFab.CloudScriptApi = { + ForgetAllCredentials: function () { + PlayFab._internalSettings.sessionTicket = null; + PlayFab._internalSettings.entityToken = null; + }, + + ExecuteEntityCloudScript: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/ExecuteEntityCloudScript", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + ExecuteFunction: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/ExecuteFunction", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + GetFunction: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/GetFunction", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + ListEventHubFunctions: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/ListEventHubFunctions", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + ListFunctions: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/ListFunctions", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + ListHttpFunctions: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/ListHttpFunctions", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + ListQueuedFunctions: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/ListQueuedFunctions", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + PostFunctionResultForEntityTriggeredAction: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/PostFunctionResultForEntityTriggeredAction", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + PostFunctionResultForFunctionExecution: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/PostFunctionResultForFunctionExecution", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + PostFunctionResultForPlayerTriggeredAction: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/PostFunctionResultForPlayerTriggeredAction", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + PostFunctionResultForScheduledTask: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/PostFunctionResultForScheduledTask", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + RegisterEventHubFunction: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/RegisterEventHubFunction", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + RegisterHttpFunction: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/RegisterHttpFunction", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + RegisterQueuedFunction: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/RegisterQueuedFunction", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + UnregisterFunction: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/CloudScript/UnregisterFunction", request, "X-EntityToken", callback, customData, extraHeaders); + }, + +}; + +var PlayFabCloudScriptSDK = PlayFab.CloudScriptApi; + diff --git a/website/public/PlayFabEconomyApi.js b/website/public/PlayFabEconomyApi.js index fcb31e1..e5ef064 100644 --- a/website/public/PlayFabEconomyApi.js +++ b/website/public/PlayFabEconomyApi.js @@ -1,431 +1,431 @@ -/// - -var PlayFab = typeof PlayFab != "undefined" ? PlayFab : {}; - -if(!PlayFab.settings) { - PlayFab.settings = { - titleId: null, // You must set this value for PlayFabSdk to work properly (Found in the Game Manager for your title, at the PlayFab Website) - developerSecretKey: null, // For security reasons you must never expose this value to the client or players - You must set this value for Server-APIs to work properly (Found in the Game Manager for your title, at the PlayFab Website) - GlobalHeaderInjection: null, - productionServerUrl: ".playfabapi.com" - } -} - -if(!PlayFab._internalSettings) { - PlayFab._internalSettings = { - entityToken: null, - sdkVersion: "1.180.240913", - requestGetParams: { - sdk: "JavaScriptSDK-1.180.240913" - }, - sessionTicket: null, - verticalName: null, // The name of a customer vertical. This is only for customers running a private cluster. Generally you shouldn't touch this - errorTitleId: "Must be have PlayFab.settings.titleId set to call this method", - errorLoggedIn: "Must be logged in to call this method", - errorEntityToken: "You must successfully call GetEntityToken before calling this", - errorSecretKey: "Must have PlayFab.settings.developerSecretKey set to call this method", - - GetServerUrl: function () { - if (!(PlayFab.settings.productionServerUrl.substring(0, 4) === "http")) { - if (PlayFab._internalSettings.verticalName) { - return "https://" + PlayFab._internalSettings.verticalName + PlayFab.settings.productionServerUrl; - } else { - return "https://" + PlayFab.settings.titleId + PlayFab.settings.productionServerUrl; - } - } else { - return PlayFab.settings.productionServerUrl; - } - }, - - InjectHeaders: function (xhr, headersObj) { - if (!headersObj) - return; - - for (var headerKey in headersObj) - { - try { - xhr.setRequestHeader(gHeaderKey, headersObj[headerKey]); - } catch (e) { - console.log("Failed to append header: " + headerKey + " = " + headersObj[headerKey] + "Error: " + e); - } - } - }, - - ExecuteRequest: function (url, request, authkey, authValue, callback, customData, extraHeaders) { - var resultPromise = new Promise(function (resolve, reject) { - if (callback != null && typeof (callback) !== "function") - throw "Callback must be null or a function"; - - if (request == null) - request = {}; - - var startTime = new Date(); - var requestBody = JSON.stringify(request); - - var urlArr = [url]; - var getParams = PlayFab._internalSettings.requestGetParams; - if (getParams != null) { - var firstParam = true; - for (var key in getParams) { - if (firstParam) { - urlArr.push("?"); - firstParam = false; - } else { - urlArr.push("&"); - } - urlArr.push(key); - urlArr.push("="); - urlArr.push(getParams[key]); - } - } - - var completeUrl = urlArr.join(""); - - var xhr = new XMLHttpRequest(); - // window.console.log("URL: " + completeUrl); - xhr.open("POST", completeUrl, true); - - xhr.setRequestHeader("Content-Type", "application/json"); - xhr.setRequestHeader("X-PlayFabSDK", "JavaScriptSDK-" + PlayFab._internalSettings.sdkVersion); - if (authkey != null) - xhr.setRequestHeader(authkey, authValue); - PlayFab._internalSettings.InjectHeaders(xhr, PlayFab.settings.GlobalHeaderInjection); - PlayFab._internalSettings.InjectHeaders(xhr, extraHeaders); - - xhr.onloadend = function () { - if (callback == null) - return; - - var result = PlayFab._internalSettings.GetPlayFabResponse(request, xhr, startTime, customData); - if (result.code === 200) { - callback(result, null); - } else { - callback(null, result); - } - } - - xhr.onerror = function () { - if (callback == null) - return; - - var result = PlayFab._internalSettings.GetPlayFabResponse(request, xhr, startTime, customData); - callback(null, result); - } - - xhr.send(requestBody); - xhr.onreadystatechange = function () { - if (this.readyState === 4) { - var xhrResult = PlayFab._internalSettings.GetPlayFabResponse(request, this, startTime, customData); - if (this.status === 200) { - resolve(xhrResult); - } else { - reject(xhrResult); - } - } - }; - }); - // Return a Promise so that calls to various API methods can be handled asynchronously - return resultPromise; - }, - - GetPlayFabResponse: function(request, xhr, startTime, customData) { - var result = null; - try { - // window.console.log("parsing json result: " + xhr.responseText); - result = JSON.parse(xhr.responseText); - } catch (e) { - result = { - code: 503, // Service Unavailable - status: "Service Unavailable", - error: "Connection error", - errorCode: 2, // PlayFabErrorCode.ConnectionError - errorMessage: xhr.responseText - }; - } - - result.CallBackTimeMS = new Date() - startTime; - result.Request = request; - result.CustomData = customData; - return result; - }, - - authenticationContext: { - PlayFabId: null, - EntityId: null, - EntityType: null, - SessionTicket: null, - EntityToken: null - }, - - UpdateAuthenticationContext: function (authenticationContext, result) { - var authenticationContextUpdates = {}; - if(result.data.PlayFabId !== null) { - PlayFab._internalSettings.authenticationContext.PlayFabId = result.data.PlayFabId; - authenticationContextUpdates.PlayFabId = result.data.PlayFabId; - } - if(result.data.SessionTicket !== null) { - PlayFab._internalSettings.authenticationContext.SessionTicket = result.data.SessionTicket; - authenticationContextUpdates.SessionTicket = result.data.SessionTicket; - } - if (result.data.EntityToken !== null) { - PlayFab._internalSettings.authenticationContext.EntityId = result.data.EntityToken.Entity.Id; - authenticationContextUpdates.EntityId = result.data.EntityToken.Entity.Id; - PlayFab._internalSettings.authenticationContext.EntityType = result.data.EntityToken.Entity.Type; - authenticationContextUpdates.EntityType = result.data.EntityToken.Entity.Type; - PlayFab._internalSettings.authenticationContext.EntityToken = result.data.EntityToken.EntityToken; - authenticationContextUpdates.EntityToken = result.data.EntityToken.EntityToken; - } - // Update the authenticationContext with values from the result - authenticationContext = Object.assign(authenticationContext, authenticationContextUpdates); - return authenticationContext; - }, - - AuthInfoMap: { - "X-EntityToken": { - authAttr: "entityToken", - authError: "errorEntityToken" - }, - "X-Authorization": { - authAttr: "sessionTicket", - authError: "errorLoggedIn" - }, - "X-SecretKey": { - authAttr: "developerSecretKey", - authError: "errorSecretKey" - } - }, - - GetAuthInfo: function (request, authKey) { - // Use the most-recently saved authKey, unless one was provided in the request via the AuthenticationContext - var authError = PlayFab._internalSettings.AuthInfoMap[authKey].authError; - var authAttr = PlayFab._internalSettings.AuthInfoMap[authKey].authAttr; - var defaultAuthValue = null; - if (authAttr === "entityToken") - defaultAuthValue = PlayFab._internalSettings.entityToken; - else if (authAttr === "sessionTicket") - defaultAuthValue = PlayFab._internalSettings.sessionTicket; - else if (authAttr === "developerSecretKey") - defaultAuthValue = PlayFab.settings.developerSecretKey; - var authValue = request.AuthenticationContext ? request.AuthenticationContext[authAttr] : defaultAuthValue; - return {"authKey": authKey, "authValue": authValue, "authError": authError}; - }, - - ExecuteRequestWrapper: function (apiURL, request, authKey, callback, customData, extraHeaders) { - var authValue = null; - if (authKey !== null){ - var authInfo = PlayFab._internalSettings.GetAuthInfo(request, authKey=authKey); - var authKey = authInfo.authKey, authValue = authInfo.authValue, authError = authInfo.authError; - - if (!authValue) throw authError; - } - return PlayFab._internalSettings.ExecuteRequest(PlayFab._internalSettings.GetServerUrl() + apiURL, request, authKey, authValue, callback, customData, extraHeaders); - } - } -} - -PlayFab.buildIdentifier = "adobuild_javascriptsdk_114"; -PlayFab.sdkVersion = "1.180.240913"; -PlayFab.GenerateErrorReport = function (error) { - if (error == null) - return ""; - var fullErrors = error.errorMessage; - for (var paramName in error.errorDetails) - for (var msgIdx in error.errorDetails[paramName]) - fullErrors += "\n" + paramName + ": " + error.errorDetails[paramName][msgIdx]; - return fullErrors; -}; - -PlayFab.EconomyApi = { - ForgetAllCredentials: function () { - PlayFab._internalSettings.sessionTicket = null; - PlayFab._internalSettings.entityToken = null; - }, - - AddInventoryItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/AddInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - CreateDraftItem: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/CreateDraftItem", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - CreateUploadUrls: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/CreateUploadUrls", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - DeleteEntityItemReviews: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/DeleteEntityItemReviews", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - DeleteInventoryCollection: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/DeleteInventoryCollection", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - DeleteInventoryItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/DeleteInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - DeleteItem: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/DeleteItem", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - ExecuteInventoryOperations: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/ExecuteInventoryOperations", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - ExecuteTransferOperations: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/ExecuteTransferOperations", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - GetCatalogConfig: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetCatalogConfig", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - GetDraftItem: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetDraftItem", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - GetDraftItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetDraftItems", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - GetEntityDraftItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetEntityDraftItems", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - GetEntityItemReview: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetEntityItemReview", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - GetInventoryCollectionIds: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/GetInventoryCollectionIds", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - GetInventoryItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/GetInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - GetInventoryOperationStatus: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/GetInventoryOperationStatus", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - GetItem: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetItem", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - GetItemContainers: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetItemContainers", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - GetItemModerationState: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetItemModerationState", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - GetItemPublishStatus: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetItemPublishStatus", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - GetItemReviews: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetItemReviews", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - GetItemReviewSummary: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetItemReviewSummary", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - GetItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetItems", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - GetMicrosoftStoreAccessTokens: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/GetMicrosoftStoreAccessTokens", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - GetTransactionHistory: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/GetTransactionHistory", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - PublishDraftItem: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/PublishDraftItem", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - PurchaseInventoryItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/PurchaseInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - RedeemAppleAppStoreInventoryItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/RedeemAppleAppStoreInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - RedeemGooglePlayInventoryItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/RedeemGooglePlayInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - RedeemMicrosoftStoreInventoryItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/RedeemMicrosoftStoreInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - RedeemNintendoEShopInventoryItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/RedeemNintendoEShopInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - RedeemPlayStationStoreInventoryItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/RedeemPlayStationStoreInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - RedeemSteamInventoryItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/RedeemSteamInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - ReportItem: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/ReportItem", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - ReportItemReview: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/ReportItemReview", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - ReviewItem: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/ReviewItem", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - SearchItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/SearchItems", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - SetItemModerationState: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/SetItemModerationState", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - SubmitItemReviewVote: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/SubmitItemReviewVote", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - SubtractInventoryItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/SubtractInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - TakedownItemReviews: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/TakedownItemReviews", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - TransferInventoryItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/TransferInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - UpdateCatalogConfig: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/UpdateCatalogConfig", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - UpdateDraftItem: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/UpdateDraftItem", request, "X-EntityToken", callback, customData, extraHeaders); - }, - - UpdateInventoryItems: function (request, callback, customData, extraHeaders) { - return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/UpdateInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); - }, - -}; - -var PlayFabEconomySDK = PlayFab.EconomyApi; - +/// + +var PlayFab = typeof PlayFab != "undefined" ? PlayFab : {}; + +if(!PlayFab.settings) { + PlayFab.settings = { + titleId: null, // You must set this value for PlayFabSdk to work properly (Found in the Game Manager for your title, at the PlayFab Website) + developerSecretKey: null, // For security reasons you must never expose this value to the client or players - You must set this value for Server-APIs to work properly (Found in the Game Manager for your title, at the PlayFab Website) + GlobalHeaderInjection: null, + productionServerUrl: ".playfabapi.com" + } +} + +if(!PlayFab._internalSettings) { + PlayFab._internalSettings = { + entityToken: null, + sdkVersion: "1.180.240913", + requestGetParams: { + sdk: "JavaScriptSDK-1.180.240913" + }, + sessionTicket: null, + verticalName: null, // The name of a customer vertical. This is only for customers running a private cluster. Generally you shouldn't touch this + errorTitleId: "Must be have PlayFab.settings.titleId set to call this method", + errorLoggedIn: "Must be logged in to call this method", + errorEntityToken: "You must successfully call GetEntityToken before calling this", + errorSecretKey: "Must have PlayFab.settings.developerSecretKey set to call this method", + + GetServerUrl: function () { + if (!(PlayFab.settings.productionServerUrl.substring(0, 4) === "http")) { + if (PlayFab._internalSettings.verticalName) { + return "https://" + PlayFab._internalSettings.verticalName + PlayFab.settings.productionServerUrl; + } else { + return "https://" + PlayFab.settings.titleId + PlayFab.settings.productionServerUrl; + } + } else { + return PlayFab.settings.productionServerUrl; + } + }, + + InjectHeaders: function (xhr, headersObj) { + if (!headersObj) + return; + + for (var headerKey in headersObj) + { + try { + xhr.setRequestHeader(gHeaderKey, headersObj[headerKey]); + } catch (e) { + console.log("Failed to append header: " + headerKey + " = " + headersObj[headerKey] + "Error: " + e); + } + } + }, + + ExecuteRequest: function (url, request, authkey, authValue, callback, customData, extraHeaders) { + var resultPromise = new Promise(function (resolve, reject) { + if (callback != null && typeof (callback) !== "function") + throw "Callback must be null or a function"; + + if (request == null) + request = {}; + + var startTime = new Date(); + var requestBody = JSON.stringify(request); + + var urlArr = [url]; + var getParams = PlayFab._internalSettings.requestGetParams; + if (getParams != null) { + var firstParam = true; + for (var key in getParams) { + if (firstParam) { + urlArr.push("?"); + firstParam = false; + } else { + urlArr.push("&"); + } + urlArr.push(key); + urlArr.push("="); + urlArr.push(getParams[key]); + } + } + + var completeUrl = urlArr.join(""); + + var xhr = new XMLHttpRequest(); + // window.console.log("URL: " + completeUrl); + xhr.open("POST", completeUrl, true); + + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.setRequestHeader("X-PlayFabSDK", "JavaScriptSDK-" + PlayFab._internalSettings.sdkVersion); + if (authkey != null) + xhr.setRequestHeader(authkey, authValue); + PlayFab._internalSettings.InjectHeaders(xhr, PlayFab.settings.GlobalHeaderInjection); + PlayFab._internalSettings.InjectHeaders(xhr, extraHeaders); + + xhr.onloadend = function () { + if (callback == null) + return; + + var result = PlayFab._internalSettings.GetPlayFabResponse(request, xhr, startTime, customData); + if (result.code === 200) { + callback(result, null); + } else { + callback(null, result); + } + } + + xhr.onerror = function () { + if (callback == null) + return; + + var result = PlayFab._internalSettings.GetPlayFabResponse(request, xhr, startTime, customData); + callback(null, result); + } + + xhr.send(requestBody); + xhr.onreadystatechange = function () { + if (this.readyState === 4) { + var xhrResult = PlayFab._internalSettings.GetPlayFabResponse(request, this, startTime, customData); + if (this.status === 200) { + resolve(xhrResult); + } else { + reject(xhrResult); + } + } + }; + }); + // Return a Promise so that calls to various API methods can be handled asynchronously + return resultPromise; + }, + + GetPlayFabResponse: function(request, xhr, startTime, customData) { + var result = null; + try { + // window.console.log("parsing json result: " + xhr.responseText); + result = JSON.parse(xhr.responseText); + } catch (e) { + result = { + code: 503, // Service Unavailable + status: "Service Unavailable", + error: "Connection error", + errorCode: 2, // PlayFabErrorCode.ConnectionError + errorMessage: xhr.responseText + }; + } + + result.CallBackTimeMS = new Date() - startTime; + result.Request = request; + result.CustomData = customData; + return result; + }, + + authenticationContext: { + PlayFabId: null, + EntityId: null, + EntityType: null, + SessionTicket: null, + EntityToken: null + }, + + UpdateAuthenticationContext: function (authenticationContext, result) { + var authenticationContextUpdates = {}; + if(result.data.PlayFabId !== null) { + PlayFab._internalSettings.authenticationContext.PlayFabId = result.data.PlayFabId; + authenticationContextUpdates.PlayFabId = result.data.PlayFabId; + } + if(result.data.SessionTicket !== null) { + PlayFab._internalSettings.authenticationContext.SessionTicket = result.data.SessionTicket; + authenticationContextUpdates.SessionTicket = result.data.SessionTicket; + } + if (result.data.EntityToken !== null) { + PlayFab._internalSettings.authenticationContext.EntityId = result.data.EntityToken.Entity.Id; + authenticationContextUpdates.EntityId = result.data.EntityToken.Entity.Id; + PlayFab._internalSettings.authenticationContext.EntityType = result.data.EntityToken.Entity.Type; + authenticationContextUpdates.EntityType = result.data.EntityToken.Entity.Type; + PlayFab._internalSettings.authenticationContext.EntityToken = result.data.EntityToken.EntityToken; + authenticationContextUpdates.EntityToken = result.data.EntityToken.EntityToken; + } + // Update the authenticationContext with values from the result + authenticationContext = Object.assign(authenticationContext, authenticationContextUpdates); + return authenticationContext; + }, + + AuthInfoMap: { + "X-EntityToken": { + authAttr: "entityToken", + authError: "errorEntityToken" + }, + "X-Authorization": { + authAttr: "sessionTicket", + authError: "errorLoggedIn" + }, + "X-SecretKey": { + authAttr: "developerSecretKey", + authError: "errorSecretKey" + } + }, + + GetAuthInfo: function (request, authKey) { + // Use the most-recently saved authKey, unless one was provided in the request via the AuthenticationContext + var authError = PlayFab._internalSettings.AuthInfoMap[authKey].authError; + var authAttr = PlayFab._internalSettings.AuthInfoMap[authKey].authAttr; + var defaultAuthValue = null; + if (authAttr === "entityToken") + defaultAuthValue = PlayFab._internalSettings.entityToken; + else if (authAttr === "sessionTicket") + defaultAuthValue = PlayFab._internalSettings.sessionTicket; + else if (authAttr === "developerSecretKey") + defaultAuthValue = PlayFab.settings.developerSecretKey; + var authValue = request.AuthenticationContext ? request.AuthenticationContext[authAttr] : defaultAuthValue; + return {"authKey": authKey, "authValue": authValue, "authError": authError}; + }, + + ExecuteRequestWrapper: function (apiURL, request, authKey, callback, customData, extraHeaders) { + var authValue = null; + if (authKey !== null){ + var authInfo = PlayFab._internalSettings.GetAuthInfo(request, authKey=authKey); + var authKey = authInfo.authKey, authValue = authInfo.authValue, authError = authInfo.authError; + + if (!authValue) throw authError; + } + return PlayFab._internalSettings.ExecuteRequest(PlayFab._internalSettings.GetServerUrl() + apiURL, request, authKey, authValue, callback, customData, extraHeaders); + } + } +} + +PlayFab.buildIdentifier = "adobuild_javascriptsdk_114"; +PlayFab.sdkVersion = "1.180.240913"; +PlayFab.GenerateErrorReport = function (error) { + if (error == null) + return ""; + var fullErrors = error.errorMessage; + for (var paramName in error.errorDetails) + for (var msgIdx in error.errorDetails[paramName]) + fullErrors += "\n" + paramName + ": " + error.errorDetails[paramName][msgIdx]; + return fullErrors; +}; + +PlayFab.EconomyApi = { + ForgetAllCredentials: function () { + PlayFab._internalSettings.sessionTicket = null; + PlayFab._internalSettings.entityToken = null; + }, + + AddInventoryItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/AddInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + CreateDraftItem: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/CreateDraftItem", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + CreateUploadUrls: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/CreateUploadUrls", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + DeleteEntityItemReviews: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/DeleteEntityItemReviews", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + DeleteInventoryCollection: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/DeleteInventoryCollection", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + DeleteInventoryItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/DeleteInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + DeleteItem: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/DeleteItem", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + ExecuteInventoryOperations: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/ExecuteInventoryOperations", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + ExecuteTransferOperations: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/ExecuteTransferOperations", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + GetCatalogConfig: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetCatalogConfig", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + GetDraftItem: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetDraftItem", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + GetDraftItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetDraftItems", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + GetEntityDraftItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetEntityDraftItems", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + GetEntityItemReview: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetEntityItemReview", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + GetInventoryCollectionIds: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/GetInventoryCollectionIds", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + GetInventoryItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/GetInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + GetInventoryOperationStatus: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/GetInventoryOperationStatus", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + GetItem: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetItem", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + GetItemContainers: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetItemContainers", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + GetItemModerationState: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetItemModerationState", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + GetItemPublishStatus: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetItemPublishStatus", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + GetItemReviews: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetItemReviews", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + GetItemReviewSummary: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetItemReviewSummary", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + GetItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/GetItems", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + GetMicrosoftStoreAccessTokens: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/GetMicrosoftStoreAccessTokens", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + GetTransactionHistory: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/GetTransactionHistory", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + PublishDraftItem: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/PublishDraftItem", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + PurchaseInventoryItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/PurchaseInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + RedeemAppleAppStoreInventoryItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/RedeemAppleAppStoreInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + RedeemGooglePlayInventoryItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/RedeemGooglePlayInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + RedeemMicrosoftStoreInventoryItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/RedeemMicrosoftStoreInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + RedeemNintendoEShopInventoryItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/RedeemNintendoEShopInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + RedeemPlayStationStoreInventoryItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/RedeemPlayStationStoreInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + RedeemSteamInventoryItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/RedeemSteamInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + ReportItem: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/ReportItem", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + ReportItemReview: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/ReportItemReview", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + ReviewItem: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/ReviewItem", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + SearchItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/SearchItems", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + SetItemModerationState: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/SetItemModerationState", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + SubmitItemReviewVote: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/SubmitItemReviewVote", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + SubtractInventoryItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/SubtractInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + TakedownItemReviews: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/TakedownItemReviews", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + TransferInventoryItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/TransferInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + UpdateCatalogConfig: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/UpdateCatalogConfig", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + UpdateDraftItem: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Catalog/UpdateDraftItem", request, "X-EntityToken", callback, customData, extraHeaders); + }, + + UpdateInventoryItems: function (request, callback, customData, extraHeaders) { + return PlayFab._internalSettings.ExecuteRequestWrapper("/Inventory/UpdateInventoryItems", request, "X-EntityToken", callback, customData, extraHeaders); + }, + +}; + +var PlayFabEconomySDK = PlayFab.EconomyApi; + diff --git a/website/public/assets/logo-square.png b/website/public/assets/logo-square.png new file mode 100644 index 0000000000000000000000000000000000000000..4a2f9762fd15a2309a91aaadc10d7d99f31280fa GIT binary patch literal 42164 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%0DW}f#Hij~px7MtlDEv9H$FCMYPY6v3 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 M07*qoM6N<$f&?L>!2kdN literal 0 HcmV?d00001 diff --git a/website/public/assets/logo-text-dark.png b/website/public/assets/logo-text-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..8c26c497a10b87cc6a9c8a6ad64cc89a9fcce09d GIT binary patch literal 55088 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 Date: Sat, 12 Oct 2024 12:52:46 -0700 Subject: [PATCH 2/5] Added about page --- website/.vscode/settings.json | 2 +- website/public/about.html | 241 +++ website/public/index.css | 2777 +++++++++++++++++++++++++++++++++ website/tailwind.config.js | 17 +- 4 files changed, 3021 insertions(+), 16 deletions(-) create mode 100644 website/public/about.html create mode 100644 website/public/index.css diff --git a/website/.vscode/settings.json b/website/.vscode/settings.json index d75e936..a14c00e 100644 --- a/website/.vscode/settings.json +++ b/website/.vscode/settings.json @@ -7,7 +7,7 @@ "**/.DS_Store": true, "**/Thumbs.db": true, "node_modules": true, - "dist": true + "dist": false }, "editor.formatOnSave": true, "editor.codeActionsOnSave": { diff --git a/website/public/about.html b/website/public/about.html new file mode 100644 index 0000000..bce3523 --- /dev/null +++ b/website/public/about.html @@ -0,0 +1,241 @@ + + + + + + + + + + + + + + + + + Winter Starfall - About + + + + + + + + + +
+
+ Winter Starfall + +
+
+ +
+
+
+

+ PlayFab demo game showcasing Economy v2, Azure Functions, and more +

+

+ Try the online services powering some of today's biggest games. Clone this game and experiment + with PlayFab, the game industry's most powerful backend platform. +

+
+
+ + +
+
+
+
Open source
+
+ Visit our GitHub repository and get source code for the website and its C# Azure Functions. +
+
+
+
Data included
+
+ Get everything needed to populate a PlayFab title. Adjust game balance in our developer + portal. +
+
+
+
Easy to host
+
+ Winter Starfall builds to static HTML, perfect for hosting on Azure Blob Storage or S3. +
+
+
+
Best practices
+
+ Developed by PlayFab engineers, Winter Starfall shows how to minimize cost. +
+
+
+
+
+ + + diff --git a/website/public/index.css b/website/public/index.css new file mode 100644 index 0000000..b567a1a --- /dev/null +++ b/website/public/index.css @@ -0,0 +1,2777 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */ + +*, +:before, +:after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: +; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: +; +} + +*, +:before, +:after { + box-sizing: border-box; + border-width: 0; + border-style: solid; + border-color: #e5e7eb; +} + +:before, +:after { + --tw-content: ""; +} + +html, +:host { + line-height: 1.5; + -webkit-text-size-adjust: 100%; + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + font-family: + ui-sans-serif, + system-ui, + sans-serif, + "Apple Color Emoji", + "Segoe UI Emoji", + Segoe UI Symbol, + "Noto Color Emoji"; + font-feature-settings: normal; + font-variation-settings: normal; + -webkit-tap-highlight-color: transparent; +} + +body { + margin: 0; + line-height: inherit; +} + +hr { + height: 0; + color: inherit; + border-top-width: 1px; +} + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +a { + color: inherit; + text-decoration: inherit; +} + +b, +strong { + font-weight: bolder; +} + +code, +kbd, +samp, +pre { + font-family: + ui-monospace, + SFMono-Regular, + Menlo, + Monaco, + Consolas, + Liberation Mono, + Courier New, + monospace; + font-feature-settings: normal; + font-variation-settings: normal; + font-size: 1em; +} + +small { + font-size: 80%; +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +table { + text-indent: 0; + border-color: inherit; + border-collapse: collapse; +} + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + font-feature-settings: inherit; + font-variation-settings: inherit; + font-size: 100%; + font-weight: inherit; + line-height: inherit; + letter-spacing: inherit; + color: inherit; + margin: 0; + padding: 0; +} + +button, +select { + text-transform: none; +} + +button, +input:where([type="button"]), +input:where([type="reset"]), +input:where([type="submit"]) { + -webkit-appearance: button; + background-color: transparent; + background-image: none; +} + +:-moz-focusring { + outline: auto; +} + +:-moz-ui-invalid { + box-shadow: none; +} + +progress { + vertical-align: baseline; +} + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +[type="search"] { + -webkit-appearance: textfield; + outline-offset: -2px; +} + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} + +summary { + display: list-item; +} + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +dialog { + padding: 0; +} + +textarea { + resize: vertical; +} + +input::-moz-placeholder, +textarea::-moz-placeholder { + opacity: 1; + color: #9ca3af; +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + color: #9ca3af; +} + +button, +[role="button"] { + cursor: pointer; +} + +:disabled { + cursor: default; +} + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + vertical-align: middle; +} + +img, +video { + max-width: 100%; + height: auto; +} + +[hidden] { + display: none; +} + +[type="text"], +input:where(:not([type])), +[type="email"], +[type="url"], +[type="password"], +[type="number"], +[type="date"], +[type="datetime-local"], +[type="month"], +[type="search"], +[type="tel"], +[type="time"], +[type="week"], +[multiple], +textarea, +select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #fff; + border-color: #6b7280; + border-width: 1px; + border-radius: 0; + padding: 0.5rem 0.75rem; + font-size: 1rem; + line-height: 1.5rem; + --tw-shadow: 0 0 #0000; +} + +[type="text"]:focus, +input:where(:not([type])):focus, +[type="email"]:focus, +[type="url"]:focus, +[type="password"]:focus, +[type="number"]:focus, +[type="date"]:focus, +[type="datetime-local"]:focus, +[type="month"]:focus, +[type="search"]:focus, +[type="tel"]:focus, +[type="time"]:focus, +[type="week"]:focus, +[multiple]:focus, +textarea:focus, +select:focus { + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-inset: var(--tw-empty,); + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: #2563eb; + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + border-color: #2563eb; +} + +input::-moz-placeholder, +textarea::-moz-placeholder { + color: #6b7280; + opacity: 1; +} + +input::placeholder, +textarea::placeholder { + color: #6b7280; + opacity: 1; +} + +::-webkit-datetime-edit-fields-wrapper { + padding: 0; +} + +::-webkit-date-and-time-value { + min-height: 1.5em; + text-align: inherit; +} + +::-webkit-datetime-edit { + display: inline-flex; +} + +::-webkit-datetime-edit, +::-webkit-datetime-edit-year-field, +::-webkit-datetime-edit-month-field, +::-webkit-datetime-edit-day-field, +::-webkit-datetime-edit-hour-field, +::-webkit-datetime-edit-minute-field, +::-webkit-datetime-edit-second-field, +::-webkit-datetime-edit-millisecond-field, +::-webkit-datetime-edit-meridiem-field { + padding-top: 0; + padding-bottom: 0; +} + +select { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e"); + background-position: right 0.5rem center; + background-repeat: no-repeat; + background-size: 1.5em 1.5em; + padding-right: 2.5rem; + -webkit-print-color-adjust: exact; + print-color-adjust: exact; +} + +[multiple], +[size]:where(select:not([size="1"])) { + background-image: initial; + background-position: initial; + background-repeat: unset; + background-size: initial; + padding-right: 0.75rem; + -webkit-print-color-adjust: unset; + print-color-adjust: unset; +} + +[type="checkbox"], +[type="radio"] { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + padding: 0; + -webkit-print-color-adjust: exact; + print-color-adjust: exact; + display: inline-block; + vertical-align: middle; + background-origin: border-box; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + flex-shrink: 0; + height: 1rem; + width: 1rem; + color: #2563eb; + background-color: #fff; + border-color: #6b7280; + border-width: 1px; + --tw-shadow: 0 0 #0000; +} + +[type="checkbox"] { + border-radius: 0; +} + +[type="radio"] { + border-radius: 100%; +} + +[type="checkbox"]:focus, +[type="radio"]:focus { + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-inset: var(--tw-empty,); + --tw-ring-offset-width: 2px; + --tw-ring-offset-color: #fff; + --tw-ring-color: #2563eb; + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); +} + +[type="checkbox"]:checked, +[type="radio"]:checked { + border-color: transparent; + background-color: currentColor; + background-size: 100% 100%; + background-position: center; + background-repeat: no-repeat; +} + +[type="checkbox"]:checked { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e"); +} + +@media (forced-colors: active) { + [type="checkbox"]:checked { + -webkit-appearance: auto; + -moz-appearance: auto; + appearance: auto; + } +} + +[type="radio"]:checked { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e"); +} + +@media (forced-colors: active) { + [type="radio"]:checked { + -webkit-appearance: auto; + -moz-appearance: auto; + appearance: auto; + } +} + +[type="checkbox"]:checked:hover, +[type="checkbox"]:checked:focus, +[type="radio"]:checked:hover, +[type="radio"]:checked:focus { + border-color: transparent; + background-color: currentColor; +} + +[type="checkbox"]:indeterminate { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e"); + border-color: transparent; + background-color: currentColor; + background-size: 100% 100%; + background-position: center; + background-repeat: no-repeat; +} + +@media (forced-colors: active) { + [type="checkbox"]:indeterminate { + -webkit-appearance: auto; + -moz-appearance: auto; + appearance: auto; + } +} + +[type="checkbox"]:indeterminate:hover, +[type="checkbox"]:indeterminate:focus { + border-color: transparent; + background-color: currentColor; +} + +[type="file"] { + background: unset; + border-color: inherit; + border-width: 0; + border-radius: 0; + padding: 0; + font-size: unset; + line-height: inherit; +} + +[type="file"]:focus { + outline: 1px solid ButtonText; + outline: 1px auto -webkit-focus-ring-color; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +.pointer-events-none { + pointer-events: none; +} + +.pointer-events-auto { + pointer-events: auto; +} + +.static { + position: static; +} + +.fixed { + position: fixed; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.sticky { + position: sticky; +} + +.inset-0 { + inset: 0; +} + +.-left-4 { + left: -1rem; +} + +.-top-0\.5 { + top: -0.125rem; +} + +.-top-1 { + top: -0.25rem; +} + +.bottom-0 { + bottom: 0; +} + +.bottom-1 { + bottom: 0.25rem; +} + +.left-0 { + left: 0; +} + +.left-1 { + left: 0.25rem; +} + +.left-1\/2 { + left: 50%; +} + +.right-0\.5 { + right: 0.125rem; +} + +.top-0 { + top: 0; +} + +.top-1 { + top: 0.25rem; +} + +.top-4 { + top: 1rem; +} + +.z-50 { + z-index: 50; +} + +.col-span-2 { + grid-column: span 2 / span 2; +} + +.m-1 { + margin: 0.25rem; +} + +.mx-auto { + margin-left: auto; + margin-right: auto; +} + +.my-2 { + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} + +.my-4 { + margin-top: 1rem; + margin-bottom: 1rem; +} + +.my-6 { + margin-top: 1.5rem; + margin-bottom: 1.5rem; +} + +.my-8 { + margin-top: 2rem; + margin-bottom: 2rem; +} + +.\!mt-0 { + margin-top: 0 !important; +} + +.-mb-1 { + margin-bottom: -0.25rem; +} + +.-mb-px { + margin-bottom: -1px; +} + +.-ml-2 { + margin-left: -0.5rem; +} + +.-ml-4 { + margin-left: -1rem; +} + +.-mt-2 { + margin-top: -0.5rem; +} + +.mb-16 { + margin-bottom: 4rem; +} + +.mb-2 { + margin-bottom: 0.5rem; +} + +.mb-4 { + margin-bottom: 1rem; +} + +.mb-8 { + margin-bottom: 2rem; +} + +.ml-3 { + margin-left: 0.75rem; +} + +.ml-36 { + margin-left: 9rem; +} + +.ml-4 { + margin-left: 1rem; +} + +.mr-1 { + margin-right: 0.25rem; +} + +.mr-2 { + margin-right: 0.5rem; +} + +.mr-4 { + margin-right: 1rem; +} + +.mt-1 { + margin-top: 0.25rem; +} + +.mt-10 { + margin-top: 2.5rem; +} + +.mt-12 { + margin-top: 3rem; +} + +.mt-16 { + margin-top: 4rem; +} + +.mt-2 { + margin-top: 0.5rem; +} + +.mt-4 { + margin-top: 1rem; +} + +.mt-6 { + margin-top: 1.5rem; +} + +.mt-8 { + margin-top: 2rem; +} + +.block { + display: block; +} + +.inline-block { + display: inline-block; +} + +.flex { + display: flex; +} + +.inline-flex { + display: inline-flex; +} + +.table { + display: table; +} + +.grid { + display: grid; +} + +.list-item { + display: list-item; +} + +.hidden { + display: none; +} + +.\!h-10 { + height: 2.5rem !important; +} + +.\!h-4 { + height: 1rem !important; +} + +.\!h-6 { + height: 1.5rem !important; +} + +.h-1\.5 { + height: 0.375rem; +} + +.h-10 { + height: 2.5rem; +} + +.h-12 { + height: 3rem; +} + +.h-16 { + height: 4rem; +} + +.h-20 { + height: 5rem; +} + +.h-24 { + height: 6rem; +} + +.h-28 { + height: 7rem; +} + +.h-32 { + height: 8rem; +} + +.h-36 { + height: 9rem; +} + +.h-4 { + height: 1rem; +} + +.h-48 { + height: 12rem; +} + +.h-5 { + height: 1.25rem; +} + +.h-6 { + height: 1.5rem; +} + +.h-8 { + height: 2rem; +} + +.h-80 { + height: 20rem; +} + +.h-auto { + height: auto; +} + +.h-combatActionBar { + height: 168px; +} + +.h-full { + height: 100%; +} + +.h-screen { + height: 100vh; +} + +.max-h-96 { + max-height: 24rem; +} + +.max-h-playfab-activity { + max-height: 40rem; +} + +.min-h-8 { + min-height: 2rem; +} + +.min-h-screen { + min-height: 100vh; +} + +.\!w-10 { + width: 2.5rem !important; +} + +.\!w-20 { + width: 5rem !important; +} + +.\!w-6 { + width: 1.5rem !important; +} + +.w-0 { + width: 0px; +} + +.w-1\.5 { + width: 0.375rem; +} + +.w-10 { + width: 2.5rem; +} + +.w-12 { + width: 3rem; +} + +.w-16 { + width: 4rem; +} + +.w-20 { + width: 5rem; +} + +.w-24 { + width: 6rem; +} + +.w-28 { + width: 7rem; +} + +.w-32 { + width: 8rem; +} + +.w-36 { + width: 9rem; +} + +.w-48 { + width: 12rem; +} + +.w-5 { + width: 1.25rem; +} + +.w-6 { + width: 1.5rem; +} + +.w-8 { + width: 2rem; +} + +.w-auto { + width: auto; +} + +.w-full { + width: 100%; +} + +.w-screen { + width: 100vw; +} + +.\!max-w-editor { + max-width: 95vw !important; +} + +.max-w-2xl { + max-width: 42rem; +} + +.max-w-36 { + max-width: 9rem; +} + +.max-w-7xl { + max-width: 80rem; +} + +.max-w-full { + max-width: 100%; +} + +.max-w-screen-lg { + max-width: 1024px; +} + +.max-w-screen-sm { + max-width: 640px; +} + +.max-w-site { + max-width: 80rem; +} + +.max-w-sm { + max-width: 24rem; +} + +.max-w-xl { + max-width: 36rem; +} + +.flex-1 { + flex: 1 1 0%; +} + +.flex-shrink-0, +.shrink-0 { + flex-shrink: 0; +} + +.grow { + flex-grow: 1; +} + +.basis-5 { + flex-basis: 1.25rem; +} + +.basis-full { + flex-basis: 100%; +} + +.transform { + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) + skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +@keyframes bounce { + 0%, + to { + transform: translateY(-25%); + animation-timing-function: cubic-bezier(0.8, 0, 1, 1); + } + + 50% { + transform: none; + animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + } +} + +.animate-bounce { + animation: bounce 1s infinite; +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +.animate-spin { + animation: spin 1s linear infinite; +} + +.cursor-pointer { + cursor: pointer; +} + +.list-disc { + list-style-type: disc; +} + +.\!grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)) !important; +} + +.grid-cols-1 { + grid-template-columns: repeat(1, minmax(0, 1fr)); +} + +.grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.grid-cols-editor-ui { + grid-template-columns: 200px 1fr; +} + +.grid-cols-playfab-visible { + grid-template-columns: 1fr 320px; +} + +.flex-col { + flex-direction: column; +} + +.flex-wrap { + flex-wrap: wrap; +} + +.flex-nowrap { + flex-wrap: nowrap; +} + +.items-start { + align-items: flex-start; +} + +.items-end { + align-items: flex-end; +} + +.items-center { + align-items: center; +} + +.items-baseline { + align-items: baseline; +} + +.justify-end { + justify-content: flex-end; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.gap-1 { + gap: 0.25rem; +} + +.gap-12 { + gap: 3rem; +} + +.gap-2 { + gap: 0.5rem; +} + +.gap-3 { + gap: 0.75rem; +} + +.gap-4 { + gap: 1rem; +} + +.gap-6 { + gap: 1.5rem; +} + +.gap-8 { + gap: 2rem; +} + +.gap-x-2 { + -moz-column-gap: 0.5rem; + column-gap: 0.5rem; +} + +.gap-x-4 { + -moz-column-gap: 1rem; + column-gap: 1rem; +} + +.gap-x-6 { + -moz-column-gap: 1.5rem; + column-gap: 1.5rem; +} + +.gap-x-8 { + -moz-column-gap: 2rem; + column-gap: 2rem; +} + +.gap-y-10 { + row-gap: 2.5rem; +} + +.gap-y-12 { + row-gap: 3rem; +} + +.gap-y-2 { + row-gap: 0.5rem; +} + +.space-x-8 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(2rem * var(--tw-space-x-reverse)); + margin-left: calc(2rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-y-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); +} + +.space-y-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1rem * var(--tw-space-y-reverse)); +} + +.space-y-6 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1.5rem * var(--tw-space-y-reverse)); +} + +.space-y-8 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(2rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(2rem * var(--tw-space-y-reverse)); +} + +.divide-y > :not([hidden]) ~ :not([hidden]) { + --tw-divide-y-reverse: 0; + border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); + border-bottom-width: calc(1px * var(--tw-divide-y-reverse)); +} + +.divide-gray-200 > :not([hidden]) ~ :not([hidden]) { + --tw-divide-opacity: 1; + border-color: rgb(229 231 235 / var(--tw-divide-opacity)); +} + +.self-end { + align-self: flex-end; +} + +.self-center { + align-self: center; +} + +.overflow-auto { + overflow: auto; +} + +.overflow-hidden { + overflow: hidden; +} + +.overflow-scroll { + overflow: scroll; +} + +.overflow-y-auto { + overflow-y: auto; +} + +.whitespace-nowrap { + white-space: nowrap; +} + +.whitespace-pre-wrap { + white-space: pre-wrap; +} + +.break-words { + overflow-wrap: break-word; +} + +.rounded { + border-radius: 0.25rem; +} + +.rounded-full { + border-radius: 9999px; +} + +.rounded-lg { + border-radius: 0.5rem; +} + +.rounded-md { + border-radius: 0.375rem; +} + +.rounded-none { + border-radius: 0; +} + +.rounded-xl { + border-radius: 0.75rem; +} + +.rounded-bl-xl { + border-bottom-left-radius: 0.75rem; +} + +.rounded-br-xl { + border-bottom-right-radius: 0.75rem; +} + +.rounded-tl-xl { + border-top-left-radius: 0.75rem; +} + +.rounded-tr-xl { + border-top-right-radius: 0.75rem; +} + +.border { + border-width: 1px; +} + +.border-0 { + border-width: 0px; +} + +.border-2 { + border-width: 2px; +} + +.\!border-b-0 { + border-bottom-width: 0px !important; +} + +.border-b { + border-bottom-width: 1px; +} + +.border-b-2 { + border-bottom-width: 2px; +} + +.border-b-4 { + border-bottom-width: 4px; +} + +.border-l { + border-left-width: 1px; +} + +.border-l-2 { + border-left-width: 2px; +} + +.border-l-4 { + border-left-width: 4px; +} + +.border-t { + border-top-width: 1px; +} + +.border-solid { + border-style: solid; +} + +.\!border-link { + --tw-border-opacity: 1 !important; + border-color: rgb(20 125 196 / var(--tw-border-opacity)) !important; +} + +.border-border { + --tw-border-opacity: 1; + border-color: rgb(212 212 212 / var(--tw-border-opacity)); +} + +.border-gray-200 { + --tw-border-opacity: 1; + border-color: rgb(229 231 235 / var(--tw-border-opacity)); +} + +.border-gray-300 { + --tw-border-opacity: 1; + border-color: rgb(209 213 219 / var(--tw-border-opacity)); +} + +.border-gray-600 { + --tw-border-opacity: 1; + border-color: rgb(75 85 99 / var(--tw-border-opacity)); +} + +.border-green-300 { + --tw-border-opacity: 1; + border-color: rgb(134 239 172 / var(--tw-border-opacity)); +} + +.border-link { + --tw-border-opacity: 1; + border-color: rgb(20 125 196 / var(--tw-border-opacity)); +} + +.border-neutral-500 { + --tw-border-opacity: 1; + border-color: rgb(115 115 115 / var(--tw-border-opacity)); +} + +.border-orange-500 { + --tw-border-opacity: 1; + border-color: rgb(249 115 22 / var(--tw-border-opacity)); +} + +.border-red-100 { + --tw-border-opacity: 1; + border-color: rgb(254 226 226 / var(--tw-border-opacity)); +} + +.border-red-300 { + --tw-border-opacity: 1; + border-color: rgb(252 165 165 / var(--tw-border-opacity)); +} + +.border-transparent { + border-color: transparent; +} + +.border-t-border { + --tw-border-opacity: 1; + border-top-color: rgb(212 212 212 / var(--tw-border-opacity)); +} + +.\!bg-gray-200 { + --tw-bg-opacity: 1 !important; + background-color: rgb(229 231 235 / var(--tw-bg-opacity)) !important; +} + +.\!bg-transparent { + background-color: transparent !important; +} + +.\!bg-white { + --tw-bg-opacity: 1 !important; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)) !important; +} + +.bg-black { + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity)); +} + +.bg-emerald-500 { + --tw-bg-opacity: 1; + background-color: rgb(16 185 129 / var(--tw-bg-opacity)); +} + +.bg-emerald-500\/20 { + background-color: #10b98133; +} + +.bg-emerald-600 { + --tw-bg-opacity: 1; + background-color: rgb(5 150 105 / var(--tw-bg-opacity)); +} + +.bg-fuchsia-500 { + --tw-bg-opacity: 1; + background-color: rgb(217 70 239 / var(--tw-bg-opacity)); +} + +.bg-gray-100 { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity)); +} + +.bg-gray-200 { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity)); +} + +.bg-gray-300 { + --tw-bg-opacity: 1; + background-color: rgb(209 213 219 / var(--tw-bg-opacity)); +} + +.bg-gray-50 { + --tw-bg-opacity: 1; + background-color: rgb(249 250 251 / var(--tw-bg-opacity)); +} + +.bg-gray-500 { + --tw-bg-opacity: 1; + background-color: rgb(107 114 128 / var(--tw-bg-opacity)); +} + +.bg-gray-500\/20 { + background-color: #6b728033; +} + +.bg-gray-700 { + --tw-bg-opacity: 1; + background-color: rgb(55 65 81 / var(--tw-bg-opacity)); +} + +.bg-green-100 { + --tw-bg-opacity: 1; + background-color: rgb(220 252 231 / var(--tw-bg-opacity)); +} + +.bg-green-700 { + --tw-bg-opacity: 1; + background-color: rgb(21 128 61 / var(--tw-bg-opacity)); +} + +.bg-link { + --tw-bg-opacity: 1; + background-color: rgb(20 125 196 / var(--tw-bg-opacity)); +} + +.bg-neutral-600 { + --tw-bg-opacity: 1; + background-color: rgb(82 82 82 / var(--tw-bg-opacity)); +} + +.bg-red-100 { + --tw-bg-opacity: 1; + background-color: rgb(254 226 226 / var(--tw-bg-opacity)); +} + +.bg-red-50 { + --tw-bg-opacity: 1; + background-color: rgb(254 242 242 / var(--tw-bg-opacity)); +} + +.bg-red-500 { + --tw-bg-opacity: 1; + background-color: rgb(239 68 68 / var(--tw-bg-opacity)); +} + +.bg-red-500\/20 { + background-color: #ef444433; +} + +.bg-sky-500 { + --tw-bg-opacity: 1; + background-color: rgb(14 165 233 / var(--tw-bg-opacity)); +} + +.bg-sky-600 { + --tw-bg-opacity: 1; + background-color: rgb(2 132 199 / var(--tw-bg-opacity)); +} + +.bg-transparent { + background-color: transparent; +} + +.bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + +.bg-yellow-50 { + --tw-bg-opacity: 1; + background-color: rgb(254 252 232 / var(--tw-bg-opacity)); +} + +.\!bg-none { + background-image: none !important; +} + +.bg-gradient-to-b { + background-image: linear-gradient(to bottom, var(--tw-gradient-stops)); +} + +.bg-gradient-to-l { + background-image: linear-gradient(to left, var(--tw-gradient-stops)); +} + +.from-link-light { + --tw-gradient-from: #3894d2 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(56 148 210 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-white { + --tw-gradient-from: #fff var(--tw-gradient-from-position); + --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.to-gray-200 { + --tw-gradient-to: #e5e7eb var(--tw-gradient-to-position); +} + +.to-link { + --tw-gradient-to: #147dc4 var(--tw-gradient-to-position); +} + +.bg-cover { + background-size: cover; +} + +.bg-fixed { + background-attachment: fixed; +} + +.bg-center { + background-position: center; +} + +.bg-no-repeat { + background-repeat: no-repeat; +} + +.fill-blue-600 { + fill: #2563eb; +} + +.object-cover { + -o-object-fit: cover; + object-fit: cover; +} + +.p-0\.5 { + padding: 0.125rem; +} + +.p-1 { + padding: 0.25rem; +} + +.p-2 { + padding: 0.5rem; +} + +.p-4 { + padding: 1rem; +} + +.\!px-12 { + padding-left: 3rem !important; + padding-right: 3rem !important; +} + +.px-1 { + padding-left: 0.25rem; + padding-right: 0.25rem; +} + +.px-3 { + padding-left: 0.75rem; + padding-right: 0.75rem; +} + +.px-3\.5 { + padding-left: 0.875rem; + padding-right: 0.875rem; +} + +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + +.px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; +} + +.py-0\.5 { + padding-top: 0.125rem; + padding-bottom: 0.125rem; +} + +.py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} + +.py-1\.5 { + padding-top: 0.375rem; + padding-bottom: 0.375rem; +} + +.py-12 { + padding-top: 3rem; + padding-bottom: 3rem; +} + +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.py-3 { + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} + +.py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} + +.py-6 { + padding-top: 1.5rem; + padding-bottom: 1.5rem; +} + +.\!pb-0 { + padding-bottom: 0 !important; +} + +.\!pt-0 { + padding-top: 0 !important; +} + +.pb-0 { + padding-bottom: 0; +} + +.pb-1 { + padding-bottom: 0.25rem; +} + +.pb-12 { + padding-bottom: 3rem; +} + +.pb-4 { + padding-bottom: 1rem; +} + +.pb-8 { + padding-bottom: 2rem; +} + +.pl-16 { + padding-left: 4rem; +} + +.pl-2 { + padding-left: 0.5rem; +} + +.pl-5 { + padding-left: 1.25rem; +} + +.pt-0 { + padding-top: 0; +} + +.pt-0\.5 { + padding-top: 0.125rem; +} + +.pt-1 { + padding-top: 0.25rem; +} + +.pt-16 { + padding-top: 4rem; +} + +.text-left { + text-align: left; +} + +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} + +.align-middle { + vertical-align: middle; +} + +.font-mono { + font-family: + ui-monospace, + SFMono-Regular, + Menlo, + Monaco, + Consolas, + Liberation Mono, + Courier New, + monospace; +} + +.font-sans { + font-family: + ui-sans-serif, + system-ui, + sans-serif, + "Apple Color Emoji", + "Segoe UI Emoji", + Segoe UI Symbol, + "Noto Color Emoji"; +} + +.\!text-lg { + font-size: 1.125rem !important; + line-height: 1.75rem !important; +} + +.\!text-sm { + font-size: 0.875rem !important; + line-height: 1.25rem !important; +} + +.text-2xl { + font-size: 1.5rem; + line-height: 2rem; +} + +.text-3xl { + font-size: 1.875rem; + line-height: 2.25rem; +} + +.text-5xl { + font-size: 3rem; + line-height: 1; +} + +.text-base { + font-size: 1rem; + line-height: 1.5rem; +} + +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.text-xl { + font-size: 1.25rem; + line-height: 1.75rem; +} + +.text-xs { + font-size: 0.75rem; + line-height: 1rem; +} + +.\!font-bold { + font-weight: 700 !important; +} + +.\!font-semibold { + font-weight: 600 !important; +} + +.font-bold { + font-weight: 700; +} + +.font-light { + font-weight: 300; +} + +.font-medium { + font-weight: 500; +} + +.font-normal { + font-weight: 400; +} + +.font-semibold { + font-weight: 600; +} + +.italic { + font-style: italic; +} + +.\!leading-6 { + line-height: 1.5rem !important; +} + +.leading-4 { + line-height: 1rem; +} + +.leading-6 { + line-height: 1.5rem; +} + +.leading-7 { + line-height: 1.75rem; +} + +.leading-8 { + line-height: 2rem; +} + +.tracking-tight { + letter-spacing: -0.025em; +} + +.\!text-gray-400 { + --tw-text-opacity: 1 !important; + color: rgb(156 163 175 / var(--tw-text-opacity)) !important; +} + +.\!text-gray-700 { + --tw-text-opacity: 1 !important; + color: rgb(55 65 81 / var(--tw-text-opacity)) !important; +} + +.\!text-gray-900 { + --tw-text-opacity: 1 !important; + color: rgb(17 24 39 / var(--tw-text-opacity)) !important; +} + +.text-amber-700 { + --tw-text-opacity: 1; + color: rgb(180 83 9 / var(--tw-text-opacity)); +} + +.text-black { + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity)); +} + +.text-gray-200 { + --tw-text-opacity: 1; + color: rgb(229 231 235 / var(--tw-text-opacity)); +} + +.text-gray-500 { + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity)); +} + +.text-gray-600 { + --tw-text-opacity: 1; + color: rgb(75 85 99 / var(--tw-text-opacity)); +} + +.text-gray-700 { + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity)); +} + +.text-gray-900 { + --tw-text-opacity: 1; + color: rgb(17 24 39 / var(--tw-text-opacity)); +} + +.text-green-500 { + --tw-text-opacity: 1; + color: rgb(34 197 94 / var(--tw-text-opacity)); +} + +.text-green-700 { + --tw-text-opacity: 1; + color: rgb(21 128 61 / var(--tw-text-opacity)); +} + +.text-green-800 { + --tw-text-opacity: 1; + color: rgb(22 101 52 / var(--tw-text-opacity)); +} + +.text-link { + --tw-text-opacity: 1; + color: rgb(20 125 196 / var(--tw-text-opacity)); +} + +.text-red-400 { + --tw-text-opacity: 1; + color: rgb(248 113 113 / var(--tw-text-opacity)); +} + +.text-red-500 { + --tw-text-opacity: 1; + color: rgb(239 68 68 / var(--tw-text-opacity)); +} + +.text-red-700 { + --tw-text-opacity: 1; + color: rgb(185 28 28 / var(--tw-text-opacity)); +} + +.text-red-800 { + --tw-text-opacity: 1; + color: rgb(153 27 27 / var(--tw-text-opacity)); +} + +.text-stone-600 { + --tw-text-opacity: 1; + color: rgb(87 83 78 / var(--tw-text-opacity)); +} + +.text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.text-yellow-400 { + --tw-text-opacity: 1; + color: rgb(250 204 21 / var(--tw-text-opacity)); +} + +.text-yellow-800 { + --tw-text-opacity: 1; + color: rgb(133 77 14 / var(--tw-text-opacity)); +} + +.text-opacity-60 { + --tw-text-opacity: 0.6; +} + +.no-underline { + text-decoration-line: none; +} + +.opacity-0 { + opacity: 0; +} + +.opacity-50 { + opacity: 0.5; +} + +.\!shadow-xl { + --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1) !important; + --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color) !important; + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow) !important; +} + +.shadow { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-lg { + --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-none { + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-sm { + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-gray-300 { + --tw-shadow-color: #d1d5db; + --tw-shadow: var(--tw-shadow-colored); +} + +.ring-1 { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.ring-inset { + --tw-ring-inset: inset; +} + +.ring-black { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity)); +} + +.ring-gray-200 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(229 231 235 / var(--tw-ring-opacity)); +} + +.ring-gray-300 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity)); +} + +.ring-opacity-5 { + --tw-ring-opacity: 0.05; +} + +.blur { + --tw-blur: blur(8px); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) + var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.filter { + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) + var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.transition-all { + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 0.15s; +} + +.transition-colors { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 0.15s; +} + +html, +body { + height: 100vh; + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); + font-family: + ui-sans-serif, + system-ui, + sans-serif, + "Apple Color Emoji", + "Segoe UI Emoji", + Segoe UI Symbol, + "Noto Color Emoji"; +} + +@media (min-width: 1280px) { + html, + body { + --tw-bg-opacity: 1; + background-color: rgb(255 253 236 / var(--tw-bg-opacity)); + } +} + +html, +body { + color: #320f26; +} + +div.markdown p, +div.privacy p { + margin-top: 1rem; + margin-bottom: 1rem; +} + +.placeholder\:text-gray-400::-moz-placeholder { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity)); +} + +.placeholder\:text-gray-400::placeholder { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity)); +} + +.first\:mt-0:first-child { + margin-top: 0; +} + +.first\:border-t-0:first-child { + border-top-width: 0px; +} + +.last\:mr-0:last-child { + margin-right: 0; +} + +.hover\:border-gray-300:hover { + --tw-border-opacity: 1; + border-color: rgb(209 213 219 / var(--tw-border-opacity)); +} + +.hover\:border-gray-400:hover { + --tw-border-opacity: 1; + border-color: rgb(156 163 175 / var(--tw-border-opacity)); +} + +.hover\:bg-gray-50:hover { + --tw-bg-opacity: 1; + background-color: rgb(249 250 251 / var(--tw-bg-opacity)); +} + +.hover\:bg-link:hover { + --tw-bg-opacity: 1; + background-color: rgb(20 125 196 / var(--tw-bg-opacity)); +} + +.hover\:text-gray-700:hover { + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity)); +} + +.hover\:text-gray-800:hover { + --tw-text-opacity: 1; + color: rgb(31 41 55 / var(--tw-text-opacity)); +} + +.hover\:underline:hover { + text-decoration-line: underline; +} + +.hover\:no-underline:hover { + text-decoration-line: none; +} + +.focus\:border-link:focus { + --tw-border-opacity: 1; + border-color: rgb(20 125 196 / var(--tw-border-opacity)); +} + +.focus\:outline-none:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.focus\:ring-2:focus { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus\:ring-inset:focus { + --tw-ring-inset: inset; +} + +.focus\:ring-blue-600:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(37 99 235 / var(--tw-ring-opacity)); +} + +.focus\:ring-indigo-500:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity)); +} + +.focus\:ring-link:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(20 125 196 / var(--tw-ring-opacity)); +} + +.focus\:ring-offset-2:focus { + --tw-ring-offset-width: 2px; +} + +.focus-visible\:outline:focus-visible { + outline-style: solid; +} + +.focus-visible\:outline-2:focus-visible { + outline-width: 2px; +} + +.focus-visible\:outline-offset-2:focus-visible { + outline-offset: 2px; +} + +.focus-visible\:outline-link:focus-visible { + outline-color: #147dc4; +} + +@media (min-width: 390px) { + .xxs\:min-w-popup-1 { + min-width: 358px; + } +} + +@media (min-width: 460px) { + .xs\:min-w-popup-2 { + min-width: 430px; + } +} + +@media (min-width: 640px) { + .sm\:mt-20 { + margin-top: 5rem; + } + + .sm\:mt-8 { + margin-top: 2rem; + } + + .sm\:block { + display: block; + } + + .sm\:flex { + display: flex; + } + + .sm\:hidden { + display: none; + } + + .sm\:h-24 { + height: 6rem; + } + + .sm\:h-52 { + height: 13rem; + } + + .sm\:w-24 { + width: 6rem; + } + + .sm\:w-52 { + width: 13rem; + } + + .sm\:w-full { + width: 100%; + } + + .sm\:basis-auto { + flex-basis: auto; + } + + .sm\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .sm\:items-end { + align-items: flex-end; + } + + .sm\:gap-6 { + gap: 1.5rem; + } + + .sm\:p-6 { + padding: 1.5rem; + } + + .sm\:px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; + } + + .sm\:py-20 { + padding-top: 5rem; + padding-bottom: 5rem; + } + + .sm\:pt-24 { + padding-top: 6rem; + } + + .sm\:text-left { + text-align: left; + } + + .sm\:text-2xl { + font-size: 1.5rem; + line-height: 2rem; + } + + .sm\:text-3xl { + font-size: 1.875rem; + line-height: 2.25rem; + } + + .sm\:text-4xl { + font-size: 2.25rem; + line-height: 2.5rem; + } + + .sm\:text-sm { + font-size: 0.875rem; + line-height: 1.25rem; + } + + .sm\:leading-6 { + line-height: 1.5rem; + } + + .sm\:tracking-tight { + letter-spacing: -0.025em; + } +} + +@media (min-width: 768px) { + .md\:mb-0 { + margin-bottom: 0; + } + + .md\:mr-4 { + margin-right: 1rem; + } + + .md\:mt-0 { + margin-top: 0; + } + + .md\:block { + display: block; + } + + .md\:grid { + display: grid; + } + + .md\:hidden { + display: none; + } + + .md\:h-32 { + height: 8rem; + } + + .md\:h-48 { + height: 12rem; + } + + .md\:w-32 { + width: 8rem; + } + + .md\:w-48 { + width: 12rem; + } + + .md\:shrink-0 { + flex-shrink: 0; + } + + .md\:grow-0 { + flex-grow: 0; + } + + .md\:basis-auto { + flex-basis: auto; + } + + .md\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .md\:flex-nowrap { + flex-wrap: nowrap; + } + + .md\:gap-8 { + gap: 2rem; + } + + .md\:rounded-bl-xl { + border-bottom-left-radius: 0.75rem; + } + + .md\:border-b-0 { + border-bottom-width: 0px; + } +} + +@media (min-width: 1024px) { + .lg\:-ml-8 { + margin-left: -2rem; + } + + .lg\:ml-8 { + margin-left: 2rem; + } + + .lg\:mr-0 { + margin-right: 0; + } + + .lg\:mt-24 { + margin-top: 6rem; + } + + .lg\:flex { + display: flex; + } + + .lg\:contents { + display: contents; + } + + .lg\:h-auto { + height: auto; + } + + .lg\:w-1\/2 { + width: 50%; + } + + .lg\:w-full { + width: 100%; + } + + .lg\:max-w-4xl { + max-width: 56rem; + } + + .lg\:max-w-lg { + max-width: 32rem; + } + + .lg\:max-w-none { + max-width: none; + } + + .lg\:flex-none { + flex: none; + } + + .lg\:shrink { + flex-shrink: 1; + } + + .lg\:grow { + flex-grow: 1; + } + + .lg\:grow-0 { + flex-grow: 0; + } + + .lg\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .lg\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .lg\:grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + + .lg\:grid-cols-5 { + grid-template-columns: repeat(5, minmax(0, 1fr)); + } + + .lg\:grid-cols-6 { + grid-template-columns: repeat(6, minmax(0, 1fr)); + } + + .lg\:justify-between { + justify-content: space-between; + } + + .lg\:gap-y-16 { + row-gap: 4rem; + } + + .lg\:p-8 { + padding: 2rem; + } + + .lg\:px-8 { + padding-left: 2rem; + padding-right: 2rem; + } + + .lg\:pt-32 { + padding-top: 8rem; + } + + .lg\:text-center { + text-align: center; + } + + .lg\:text-7xl { + font-size: 4.5rem; + line-height: 1; + } +} + +@media (min-width: 1280px) { + .xl\:absolute { + position: absolute; + } + + .xl\:inset-y-0 { + top: 0; + bottom: 0; + } + + .xl\:right-1\/2 { + right: 50%; + } + + .xl\:col-span-2 { + grid-column: span 2 / span 2; + } + + .xl\:mx-auto { + margin-left: auto; + margin-right: auto; + } + + .xl\:-mt-24 { + margin-top: -6rem; + } + + .xl\:ml-0 { + margin-left: 0; + } + + .xl\:mt-0 { + margin-top: 0; + } + + .xl\:grid { + display: grid; + } + + .xl\:max-h-page-bg { + max-height: 100vh; + } + + .xl\:min-h-0 { + min-height: 0px; + } + + .xl\:w-1\/2 { + width: 50%; + } + + .xl\:max-w-screen-2xl { + max-width: 1536px; + } + + .xl\:max-w-screen-xl { + max-width: 1280px; + } + + .xl\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .xl\:justify-end { + justify-content: flex-end; + } + + .xl\:gap-8 { + gap: 2rem; + } + + .xl\:overflow-y-hidden { + overflow-y: hidden; + } + + .xl\:rounded-3xl { + border-radius: 1.5rem; + } + + .xl\:rounded-bl-3xl { + border-bottom-left-radius: 1.5rem; + } + + .xl\:rounded-tl-none { + border-top-left-radius: 0; + } + + .xl\:rounded-tr-none { + border-top-right-radius: 0; + } + + .xl\:pb-16 { + padding-bottom: 4rem; + } + + .xl\:pt-8 { + padding-top: 2rem; + } + + .xl\:shadow-2xl { + --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25); + --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + } + + .xl\:shadow-gray-500 { + --tw-shadow-color: #6b7280; + --tw-shadow: var(--tw-shadow-colored); + } +} diff --git a/website/tailwind.config.js b/website/tailwind.config.js index 8de5625..aed6d73 100644 --- a/website/tailwind.config.js +++ b/website/tailwind.config.js @@ -4,10 +4,9 @@ */ /** @type {import('tailwindcss').Config} */ -const plugin = require("tailwindcss/plugin"); export default { - content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"], + content: ["./index.html", "./public/about.html", "./src/**/*.{js,ts,jsx,tsx}"], theme: { extend: { textShadow: { @@ -49,17 +48,5 @@ export default { }, }, }, - plugins: [ - require("@tailwindcss/forms"), - plugin(function ({ matchUtilities, theme }) { - matchUtilities( - { - "text-shadow": value => ({ - textShadow: value, - }), - }, - { values: theme("textShadow") } - ); - }), - ], + plugins: [require("@tailwindcss/forms")], }; From 012693c3b017b74ad3cd06593cda19381850c812 Mon Sep 17 00:00:00 2001 From: Jordan Roher Date: Sat, 12 Oct 2024 12:55:51 -0700 Subject: [PATCH 3/5] Links --- website/index.html | 4 ++-- website/public/about.html | 19 ++++++++++--------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/website/index.html b/website/index.html index bf87e39..99d5e5e 100644 --- a/website/index.html +++ b/website/index.html @@ -384,14 +384,14 @@

Legal

  • Privacy Policy
  • Terms of Service
  • diff --git a/website/public/about.html b/website/public/about.html index bce3523..344e1f7 100644 --- a/website/public/about.html +++ b/website/public/about.html @@ -26,13 +26,14 @@
    - Winter Starfall - + Winter Starfall +
    @@ -219,14 +220,14 @@

    Legal

  • Privacy Policy
  • Terms of Service
  • From 42dfd29d25017270ee564b55779f4bfa607289f8 Mon Sep 17 00:00:00 2001 From: Jordan Roher Date: Sat, 12 Oct 2024 13:08:50 -0700 Subject: [PATCH 4/5] Added privacy and terms pages --- website/public/privacy.html | 1037 ++++++++++++++++++++++++++++++++++ website/public/terms.html | 1067 +++++++++++++++++++++++++++++++++++ 2 files changed, 2104 insertions(+) create mode 100644 website/public/privacy.html create mode 100644 website/public/terms.html diff --git a/website/public/privacy.html b/website/public/privacy.html new file mode 100644 index 0000000..8975c5f --- /dev/null +++ b/website/public/privacy.html @@ -0,0 +1,1037 @@ + + + + + + + + + + + + + + + + + Winter Starfall - Privacy Policy + + + + + + + + + +
    +
    + Winter Starfall + +
    +
    +
    + +

    Privacy Policy

    +

    Attachment — The Standard Contractual Clauses (Processors)

    +

    + Acceptance of the PlayFab Terms of Service by you (as data exporter) includes acceptance of this + Attachment, which is countersigned by PlayFab, Inc. Capitalized terms that are not defined herein will + have the same meaning as specified in the PlayFab Terms of Service. In the event of a conflict between + the PlayFab Terms of Service and this Attachment, the parties agree that this Attachment shall control + interpretation of any inconsistency. However, the documents shall, to the extent possible, be construed + to be consistent. +

    +

    + In countries where regulatory approval is required for use of the Standard Contractual Clauses, the + Standard Contractual Clauses cannot be relied upon under European Commission 2010/87/EU (of February + 2010) to legitimize export of data from the country, unless data exporter has the required regulatory + approval. +

    +

    + References to various Articles from the Directive 95/46/EC in the Standard Contractual Clauses below + will be treated as references to the relevant and appropriate Articles in the GDPR. +

    +

    + For the purposes of Article 26(2) of Directive 95/46/EC for the transfer of personal data to processors + established in third countries which do not ensure an adequate level of data protection, data exporter + and PlayFab, Inc. (as data importer, whose signature appears below), each a “party,” together “the + parties,” have agreed on the following Contractual Clauses (the “Clauses” or “Standard Contractual + Clauses”) in order to adduce adequate safeguards with respect to the protection of privacy and + fundamental rights and freedoms of individuals for the transfer by the data exporter to the data + importer of the personal data specified in Appendix 1. +

    +

    STANDARD CONTRACTUAL CLAUSES

    +

    SECTION I

    +

    Clause 1

    +
    Purpose and scope
    +

    + a. The purpose of these standard contractual clauses is to ensure compliance with the requirements of + Regulation (EU) 2016/679 of the European Parliament and of the Council of 27 April 2016 on the + protection of natural persons with regard to the processing of personal data and on the free movement of + such data (General Data Protection Regulation) ^1^ for the transfer of personal data to a + third country. +

    +

    b. The Parties:

    +
    i. the natural or legal person(s), public authority/ies, agency/ies or other body/ies (hereinafter \"entity/ies\") transferring the personal data, as listed in Annex I.A. (hereinafter each \"data exporter\"), and ii. the entity/ies in a third country receiving the personal data from the data exporter, directly or indirectly via another entity also Party to these Clauses, as listed in Annex I.A. (hereinafter each \"data importer\") have agreed to these standard contractual clauses (hereinafter: \"Clauses\").
    +

    c. These Clauses apply with respect to the transfer of personal data as specified in Annex I.B.

    +

    + d. The Appendix to these Clauses containing the Annexes referred to therein forms an integral part of + these Clauses. +

    +

    Clause 2

    +
    Effect and invariability of the Clauses
    +

    + a. These Clauses set out appropriate safeguards, including enforceable data subject rights and effective + legal remedies, pursuant to Article 46(1) and Article 46 (2)(c) of Regulation (EU) 2016/679 and, with + respect to data transfers from controllers to processors and/or processors to processors, standard + contractual clauses pursuant to Article 28(7) of Regulation (EU) 2016/679, provided they are not + modified, except to select the appropriate Module(s) or to add or update information in the Appendix. + This does not prevent the Parties from including the standard contractual clauses laid down in these + Clauses in a wider contract and/or to add other clauses or additional safeguards, provided that they do + not contradict, directly or indirectly, these Clauses or prejudice the fundamental rights or freedoms of + data subjects. +

    +

    + b. These Clauses are without prejudice to obligations to which the data exporter is subject by virtue of + Regulation (EU) 2016/679. +

    +

    Clause 3

    +
    Third-party beneficiaries
    +

    + a. Data subjects may invoke and enforce these Clauses, as third-party beneficiaries, against the data + exporter and/or data importer, with the following exceptions: +

    +
    i. Clause 1, Clause 2, Clause 3, Clause 6, Clause 7; ii. Clause 8 --- Clause 8.1(b), 8.9(a), (c), (d) and (e); iii. Clause 9 --- Clause 9(a), (c), (d) and (e); iv. Clause 12 --- Clause 12(a), (d) and (f); v. Clause 13; vi. Clause 15.1(c), (d) and (e); vii. Clause 16(e); viii. Clause 18 --- Clause 18(a) and (b).
    +

    b. Paragraph (a) is without prejudice to rights of data subjects under Regulation (EU) 2016/679.

    +

    Clause 4

    +
    Interpretation
    +

    + a. Where these Clauses use terms that are defined in Regulation (EU) 2016/679, those terms shall have + the same meaning as in that Regulation. +

    +

    + b. These Clauses shall be read and interpreted in the light of the provisions of Regulation (EU) + 2016/679. +

    +

    + c. These Clauses shall not be interpreted in a way that conflicts with rights and obligations provided + for in Regulation (EU) 2016/679. +

    +

    Clause 5

    +
    Hierarchy
    +

    + In the event of a contradiction between these Clauses and the provisions of related agreements between + the Parties, existing at the time these Clauses are agreed or entered into thereafter, these Clauses + shall prevail. +

    +

    Clause 6

    +
    Description of the transfer(s)
    +

    + The details of the transfer(s), and in particular the categories of personal data that are transferred + and the purpose(s) for which they are transferred, are specified in Annex I.B. +

    +

    Clause 7

    +
    Intentionally Omitted
    +

    SECTION II — OBLIGATIONS OF THE PARTIES

    +

    Clause 8

    +
    Data protection safeguards
    +

    + The data exporter warrants that it has used reasonable efforts to determine that the data importer is + able, through the implementation of appropriate technical and organisational measures, to satisfy its + obligations under these Clauses. +

    +

    8.1Instructions

    +

    + a. The data importer shall process the personal data only on documented instructions from the data + exporter. The data exporter may give such instructions throughout the duration of the contract. +

    +

    + b. The data importer shall immediately inform the data exporter if it is unable to follow those + instructions. +

    +

    8.2Purpose limitation

    +

    + The data importer shall process the personal data only for the specific purpose(s) of the transfer, as + set out in Annex I.B, unless on further instructions from the data exporter. +

    +

    8.3Transparency

    +

    + On request, the data exporter shall make a copy of these Clauses, including the Appendix as completed by + the Parties, available to the data subject free of charge. To the extent necessary to protect business + secrets or other confidential information, including the measures described in Annex II and personal + data, the data exporter may redact part of the text of the Appendix to these Clauses prior to sharing a + copy, but shall provide a meaningful summary where the data subject would otherwise not be able to + understand the its content or exercise his/her rights. On request, the Parties shall provide the data + subject with the reasons for the redactions, to the extent possible without revealing the redacted + information. This Clause is without prejudice to the obligations of the data exporter under Articles 13 + and 14 of Regulation (EU) 2016/679. +

    +

    8.4Accuracy

    +

    + If the data importer becomes aware that the personal data it has received is inaccurate, or has become + outdated, it shall inform the data exporter without undue delay. In this case, the data importer shall + cooperate with the data exporter to erase or rectify the data. +

    +

    8.5Duration of processing and erasure or return of data

    +

    + Processing by the data importer shall only take place for the duration specified in Annex I.B. After the + end of the provision of the processing services, the data importer shall, at the choice of the data + exporter, delete all personal data processed on behalf of the data exporter and certify to the data + exporter that it has done so, or return to the data exporter all personal data processed on its behalf + and delete existing copies. Until the data is deleted or returned, the data importer shall continue to + ensure compliance with these Clauses. In case of local laws applicable to the data importer that + prohibit return or deletion of the personal data, the data importer warrants that it will continue to + ensure compliance with these Clauses and will only process it to the extent and for as long as required + under that local law. This is without prejudice to Clause 14, in particular the requirement for the data + importer under Clause 14(e) to notify the data exporter throughout the duration of the contract if it + has reason to believe that it is or has become subject to laws or practices not in line with the + requirements under Clause 14(a). +

    +

    8.6Security of processing

    +

    + a. The data importer and, during transmission, also the data exporter shall implement appropriate + technical and organisational measures to ensure the security of the data, including protection against a + breach of security leading to accidental or unlawful destruction, loss, alteration, unauthorised + disclosure or access to that data (hereinafter "personal data breach"). In assessing the appropriate + level of security, the Parties shall take due account of the state of the art, the costs of + implementation, the nature, scope, context and purpose(s) of processing and the risks involved in the + processing for the data subjects. The Parties shall in particular consider having recourse to encryption + or pseudonymisation, including during transmission, where the purpose of processing can be fulfilled in + that manner. In case of pseudonymisation, the additional information for attributing the personal data + to a specific data subject shall, where possible, remain under the exclusive control of the data + exporter. In complying with its obligations under this paragraph, the data importer shall at least + implement the technical and organisational measures specified in Annex II. The data importer shall carry + out regular checks to ensure that these measures continue to provide an appropriate level of security. +

    +

    + b. The data importer shall grant access to the personal data to members of its personnel only to the + extent strictly necessary for the implementation, management and monitoring of the contract. It shall + ensure that persons authorised to process the personal data have committed themselves to confidentiality + or are under an appropriate statutory obligation of confidentiality. +

    +

    + c. In the event of a personal data breach concerning personal data processed by the data importer under + these Clauses, the data importer shall take appropriate measures to address the breach, including + measures to mitigate its adverse effects. The data importer shall also notify the data exporter without + undue delay after having become aware of the breach. Such notification shall contain the details of a + contact point where more information can be obtained, a description of the nature of the breach + (including, where possible, categories and approximate number of data subjects and personal data records + concerned), its likely consequences and the measures taken or proposed to address the breach including, + where appropriate, measures to mitigate its possible adverse effects. Where, and in so far as, it is not + possible to provide all information at the same time, the initial notification shall contain the + information then available and further information shall, as it becomes available, subsequently be + provided without undue delay. +

    +

    + d. The data importer shall cooperate with and assist the data exporter to enable the data exporter to + comply with its obligations under Regulation (EU) 2016/679, in particular to notify the competent + supervisory authority and the affected data subjects, taking into account the nature of processing and + the information available to the data importer. +

    +

    8.7Sensitive data

    +

    + Where the transfer involves personal data revealing racial or ethnic origin, political opinions, + religious or philosophical beliefs, or trade union membership, genetic data, or biometric data for the + purpose of uniquely identifying a natural person, data concerning health or a person&aposl;s sex + life or sexual orientation, or data relating to criminal convictions and offences (hereinafter + “sensitive data”), the data importer shall apply the specific restrictions and/or additional safeguards + described in Annex I.B. +

    +

    8.8Onward transfers

    +

    + The data importer shall only disclose the personal data to a third party on documented instructions from + the data exporter. In addition, the data may only be disclosed to a third party located outside the + European Union ^2^ (in the same country as the data importer or in another third country, + hereinafter “onward transfer”) if the third party is or agrees to be bound by these Clauses, under the + appropriate Module, or if: +

    +

    + i. the onward transfer is to a country benefitting from an adequacy decision pursuant to Article 45 of + Regulation (EU) 2016/679 that covers the onward transfer; +

    +

    + ii. the third party otherwise ensures appropriate safeguards pursuant to Articles 46 or 47 Regulation of + (EU) 2016/679 with respect to the processing in question; +

    +

    + iii. the onward transfer is necessary for the establishment, exercise or defence of legal claims in the + context of specific administrative, regulatory or judicial proceedings; or +

    +

    + iv. the onward transfer is necessary in order to protect the vital interests of the data subject or of + another natural person. +

    +

    + Any onward transfer is subject to compliance by the data importer with all the other safeguards under + these Clauses, in particular purpose limitation. +

    +

    8.9Documentation and compliance

    +

    + a. The data importer shall promptly and adequately deal with enquiries from the data exporter that + relate to the processing under these Clauses. +

    +

    + b. The Parties shall be able to demonstrate compliance with these Clauses. In particular, the data + importer shall keep appropriate documentation on the processing activities carried out on behalf of the + data exporter. +

    +

    + c. The data importer shall make available to the data exporter all information necessary to demonstrate + compliance with the obligations set out in these Clauses and at the data exporter's request, allow for + and contribute to audits of the processing activities covered by these Clauses, at reasonable intervals + or if there are indications of non-compliance. In deciding on a review or audit, the data exporter may + take into account relevant certifications held by the data importer. +

    +

    + d. The data exporter may choose to conduct the audit by itself or mandate an independent auditor. Audits + may include inspections at the premises or physical facilities of the data importer and shall, where + appropriate, be carried out with reasonable notice. +

    +

    + e. The Parties shall make the information referred to in paragraphs (b) and (c), including the results + of any audits, available to the competent supervisory authority on request. +

    +

    Clause 9

    +
    Use of sub-processors
    +

    + a. The data importer has the data exporter's general authorisation for the engagement of + sub-processor(s) from an agreed list. The data importer shall specifically inform the data exporter in + writing of any intended changes to that list through the addition or replacement of sub-processors at + least 30 days in advance, thereby giving the data exporter sufficient time to be able to object to such + changes prior to the engagement of the sub-processor(s). The data importer shall provide the data + exporter with the information necessary to enable the data exporter to exercise its right to object. +

    +

    + b. Where the data importer engages a sub-processor to carry out specific processing activities (on + behalf of the data exporter), it shall do so by way of a written contract that provides for, in + substance, the same data protection obligations as those binding the data importer under these Clauses, + including in terms of third-party beneficiary rights for data subjects. ^3^ The Parties agree + that, by complying with this Clause, the data importer fulfils its obligations under Clause 8.8. The + data importer shall ensure that the sub-processor complies with the obligations to which the data + importer is subject pursuant to these Clauses. +

    +

    + c. The data importer shall provide, at the data exporter's request, a copy of such a sub-processor + agreement and any subsequent amendments to the data exporter. To the extent necessary to protect + business secrets or other confidential information, including personal data, the data importer may + redact the text of the agreement prior to sharing a copy. +

    +

    + d. The data importer shall remain fully responsible to the data exporter for the performance of the + sub-processor's obligations under its contract with the data importer. The data importer shall notify + the data exporter of any failure by the sub-processor to fulfil its obligations under that contract. +

    +

    + e. The data importer shall agree a third-party beneficiary clause with the sub-processor whereby — in + the event the data importer has factually disappeared, ceased to exist in law or has become insolvent — + the data exporter shall have the right to terminate the sub-processor contract and to instruct the + sub-processor to erase or return the personal data. +

    +

    Clause 10

    +
    Data subject rights
    +

    + a. The data importer shall promptly notify the data exporter of any request it has received from a data + subject. It shall not respond to that request itself unless it has been authorised to do so by the data + exporter. +

    +

    + b. The data importer shall assist the data exporter in fulfilling its obligations to respond to data + subjects' requests for the exercise of their rights under Regulation (EU) 2016/679. In this regard, the + Parties shall set out in Annex II the appropriate technical and organisational measures, taking into + account the nature of the processing, by which the assistance shall be provided, as well as the scope + and the extent of the assistance required. +

    +

    + c. In fulfilling its obligations under paragraphs (a) and (b), the data importer shall comply with the + instructions from the data exporter. +

    +

    Clause 11

    +
    Redress
    +

    + a. The data importer shall inform data subjects in a transparent and easily accessible format, through + individual notice or on its website, of a contact point authorised to handle complaints. It shall deal + promptly with any complaints it receives from a data subject. +

    +

    + b. In case of a dispute between a data subject and one of the Parties as regards compliance with these + Clauses, that Party shall use its best efforts to resolve the issue amicably in a timely fashion. The + Parties shall keep each other informed about such disputes and, where appropriate, cooperate in + resolving them. +

    +

    + c. Where the data subject invokes a third-party beneficiary right pursuant to Clause 3, the data + importer shall accept the decision of the data subject to: +

    +
    i. lodge a complaint with the supervisory authority in the Member State of his/her habitual residence or place of work, or the competent supervisory authority pursuant to Clause 13; ii. refer the dispute to the competent courts within the meaning of Clause 18.
    +

    + d. The Parties accept that the data subject may be represented by a not-for-profit body, organisation or + association under the conditions set out in Article 80(1) of Regulation (EU) 2016/679. +

    +

    + e. The data importer shall abide by a decision that is binding under the applicable EU or Member State + law. +

    +

    + f. The data importer agrees that the choice made by the data subject will not prejudice his/her + substantive and procedural rights to seek remedies in accordance with applicable laws. +

    +

    Clause 12

    +
    Liability
    +

    + a. Each Party shall be liable to the other Party/ies for any damages it causes the other Party/ies by + any breach of these Clauses. +

    +

    + b. The data importer shall be liable to the data subject, and the data subject shall be entitled to + receive compensation, for any material or non-material damages the data importer or its sub-processor + causes the data subject by breaching the third-party beneficiary rights under these Clauses. +

    +

    + c. Notwithstanding paragraph (b), the data exporter shall be liable to the data subject, and the data + subject shall be entitled to receive compensation, for any material or non-material damages the data + exporter or the data importer (or its sub-processor) causes the data subject by breaching the + third-party beneficiary rights under these Clauses. This is without prejudice to the liability of the + data exporter and, where the data exporter is a processor acting on behalf of a controller, to the + liability of the controller under Regulation (EU) 2016/679 or Regulation (EU) 2018/1725, as applicable. +

    +

    + d. The Parties agree that if the data exporter is held liable under paragraph (c) for damages caused by + the data importer (or its sub-processor), it shall be entitled to claim back from the data importer that + part of the compensation corresponding to the data importer's responsibility for the damage. +

    +

    + e. Where more than one Party is responsible for any damage caused to the data subject as a result of a + breach of these Clauses, all responsible Parties shall be jointly and severally liable and the data + subject is entitled to bring an action in court against any of these Parties. +

    +

    + f. The Parties agree that if one Party is held liable under paragraph (e), it shall be entitled to claim + back from the other Party/ies that part of the compensation corresponding to its / their responsibility + for the damage. +

    +

    g. The data importer may not invoke the conduct of a sub-processor to avoid its own liability.

    +

    Clause 13

    +
    Supervision
    +

    + a. Where the data exporter is established in an EU Member State, the supervisory authority with + responsibility for ensuring compliance by the data exporter with Regulation (EU) 2016/679 as regards the + data transfer, as indicated in Annex I.C, shall act as competent supervisory authority. Where the data + exporter is not established in an EU Member State, but falls within the territorial scope of application + of Regulation (EU) 2016/679 in accordance with its Article 3(2) and has appointed a representative + pursuant to Article 27(1) of Regulation (EU) 2016/679, the supervisory authority of the Member State in + which the representative within the meaning of Article 27(1) of Regulation (EU) 2016/679 is established, + as indicated in Annex I.C, shall act as competent supervisory authority. Where the data exporter is not + established in an EU Member State, but falls within the territorial scope of application of Regulation + (EU) 2016/679 in accordance with its Article 3(2) without however having to appoint a representative + pursuant to Article 27(2) of Regulation (EU) 2016/679, the supervisory authority of one of the Member + States in which the data subjects whose personal data is transferred under these Clauses in relation to + the offering of goods or services to them, or whose behaviour is monitored, are located, as indicated in + Annex I.C, shall act as competent supervisory authority. +

    +

    + b. The data importer agrees to submit itself to the jurisdiction of and cooperate with the competent + supervisory authority in any procedures aimed at ensuring compliance with these Clauses. In particular, + the data importer agrees to respond to enquiries, submit to audits and comply with the measures adopted + by the supervisory authority, including remedial and compensatory measures. It shall provide the + supervisory authority with written confirmation that the necessary actions have been taken. +

    +

    SECTION III — LOCAL LAWS AND OBLIGATIONS IN CASE OF ACCESS BY PUBLIC AUTHORITIES

    +

    Clause 14

    +
    Local laws and practices affecting compliance with the Clauses
    +

    + a. The Parties warrant that they have no reason to believe that the laws and practices in the third + country of destination applicable to the processing of the personal data by the data importer, including + any requirements to disclose personal data or measures authorising access by public authorities, prevent + the data importer from fulfilling its obligations under these Clauses. This is based on the + understanding that laws and practices that respect the essence of the fundamental rights and freedoms + and do not exceed what is necessary and proportionate in a democratic society to safeguard one of the + objectives listed in Article 23(1) of Regulation (EU) 2016/679, are not in contradiction with these + Clauses. +

    +

    + b. The Parties declare that in providing the warranty in paragraph (a), they have taken due account in + particular of the following elements: +

    +
    i. the specific circumstances of the transfer, including the length of the processing chain, the number of actors involved and the transmission channels used; intended onward transfers; the type of recipient; the purpose of processing; the categories and format of the transferred personal data; the economic sector in which the transfer occurs; the storage location of the data transferred; ii. the laws and practices of the third country of destination\" including those requiring the disclosure of data to public authorities or authorising access by such authorities \" relevant in light of the specific circumstances of the transfer, and the applicable limitations and safeguards ^4^; iii. any relevant contractual, technical or organisational safeguards put in place to supplement the safeguards under these Clauses, including measures applied during transmission and to the processing of the personal data in the country of destination.
    +

    + c. The data importer warrants that, in carrying out the assessment under paragraph (b), it has made its + best efforts to provide the data exporter with relevant information and agrees that it will continue to + cooperate with the data exporter in ensuring compliance with these Clauses. +

    +

    + d. The Parties agree to document the assessment under paragraph (b) and make it available to the + competent supervisory authority on request. +

    +

    + e. The data importer agrees to notify the data exporter promptly if, after having agreed to these + Clauses and for the duration of the contract, it has reason to believe that it is or has become subject + to laws or practices not in line with the requirements under paragraph (a), including following a change + in the laws of the third country or a measure (such as a disclosure request) indicating an application + of such laws in practice that is not in line with the requirements in paragraph (a). +

    +

    + f. Following a notification pursuant to paragraph (e), or if the data exporter otherwise has reason to + believe that the data importer can no longer fulfil its obligations under these Clauses, the data + exporter shall promptly identify appropriate measures (e.g. technical or organisational measures to + ensure security and confidentiality) to be adopted by the data exporter and/or data importer to address + the situation. The data exporter shall suspend the data transfer if it considers that no appropriate + safeguards for such transfer can be ensured, or if instructed by the competent supervisory authority to + do so. In this case, the data exporter shall be entitled to terminate the contract, insofar as it + concerns the processing of personal data under these Clauses. If the contract involves more than two + Parties, the data exporter may exercise this right to termination only with respect to the relevant + Party, unless the Parties have agreed otherwise. Where the contract is terminated pursuant to this + Clause, Clause 16(d) and (e) shall apply. +

    +

    Clause 15

    +
    Obligations of the data importer in case of access by public authorities
    +
    +

    15.1Notification

    +
    +

    + a. The data importer agrees to notify the data exporter and, where possible, the data subject promptly + (if necessary with the help of the data exporter) if it: +

    +
    i. receives a legally binding request from a public authority, including judicial authorities, under the laws of the country of destination for the disclosure of personal data transferred pursuant to these Clauses; such notification shall include information about the personal data requested, the requesting authority, the legal basis for the request and the response provided; or ii. becomes aware of any direct access by public authorities to personal data transferred pursuant to these Clauses in accordance with the laws of the country of destination; such notification shall include all information available to the importer.
    +

    + b. If the data importer is prohibited from notifying the data exporter and/or the data subject under the + laws of the country of destination, the data importer agrees to use its best efforts to obtain a waiver + of the prohibition, with a view to communicating as much information as possible, as soon as possible. + The data importer agrees to document its best efforts in order to be able to demonstrate them on request + of the data exporter. +

    +

    + c. Where permissible under the laws of the country of destination, the data importer agrees to provide + the data exporter, at regular intervals for the duration of the contract, with as much relevant + information as possible on the requests received (in particular, number of requests, type of data + requested, requesting authority/ies, whether requests have been challenged and the outcome of such + challenges, etc.). +

    +

    + d. The data importer agrees to preserve the information pursuant to paragraphs (a) to (c) for the + duration of the contract and make it available to the competent supervisory authority on request. +

    +

    + e. Paragraphs (a) to (c) are without prejudice to the obligation of the data importer pursuant to Clause + 14(e) and Clause 16 to inform the data exporter promptly where it is unable to comply with these + Clauses. +

    +
    +

    15.2Review of legality and data minimisation

    +
    +

    + a. The data importer agrees to review the legality of the request for disclosure, in particular whether + it remains within the powers granted to the requesting public authority, and to challenge the request + if, after careful assessment, it concludes that there are reasonable grounds to consider that the + request is unlawful under the laws of the country of destination, applicable obligations under + international law and principles of international comity. The data importer shall, under the same + conditions, pursue possibilities of appeal. When challenging a request, the data importer shall seek + interim measures with a view to suspending the effects of the request until the competent judicial + authority has decided on its merits. It shall not disclose the personal data requested until required to + do so under the applicable procedural rules. These requirements are without prejudice to the obligations + of the data importer under Clause 14(e). +

    +

    + b. The data importer agrees to document its legal assessment and any challenge to the request for + disclosure and, to the extent permissible under the laws of the country of destination, make the + documentation available to the data exporter. It shall also make it available to the competent + supervisory authority on request. +

    +

    + c. The data importer agrees to provide the minimum amount of information permissible when responding to + a request for disclosure, based on a reasonable interpretation of the request. +

    +

    SECTION IV — FINAL PROVISIONS

    +

    Clause 16

    +
    Non-compliance with the Clauses and termination
    +

    + a. The data importer shall promptly inform the data exporter if it is unable to comply with these + Clauses, for whatever reason. +

    +

    + b. In the event that the data importer is in breach of these Clauses or unable to comply with these + Clauses, the data exporter shall suspend the transfer of personal data to the data importer until + compliance is again ensured or the contract is terminated. This is without prejudice to Clause 14(f). +

    +

    + c. The data exporter shall be entitled to terminate the contract, insofar as it concerns the processing + of personal data under these Clauses, where: +

    +
    i. the data exporter has suspended the transfer of personal data to the data importer pursuant to paragraph (b) and compliance with these Clauses is not restored within a reasonable time and in any event within one month of suspension; ii. the data importer is in substantial or persistent breach of these Clauses; or iii. the data importer fails to comply with a binding decision of a competent court or supervisory authority regarding its obligations under these Clauses.
    +
    +

    + In these cases, it shall inform the competent supervisory authority of such non-compliance. Where + the contract involves more than two Parties, the data exporter may exercise this right to + termination only with respect to the relevant Party, unless the Parties have agreed otherwise. +

    +
    +

    + d. Personal data that has been transferred prior to the termination of the contract pursuant to + paragraph (c) shall at the choice of the data exporter immediately be returned to the data exporter or + deleted in its entirety. The same shall apply to any copies of the data. The data importer shall certify + the deletion of the data to the data exporter. Until the data is deleted or returned, the data importer + shall continue to ensure compliance with these Clauses. In case of local laws applicable to the data + importer that prohibit the return or deletion of the transferred personal data, the data importer + warrants that it will continue to ensure compliance with these Clauses and will only process the data to + the extent and for as long as required under that local law. +

    +

    + e. Either Party may revoke its agreement to be bound by these Clauses where (i) the European Commission + adopts a decision pursuant to Article 45(3) of Regulation (EU) 2016/679 that covers the transfer of + personal data to which these Clauses apply; or (ii) Regulation (EU) 2016/679 becomes part of the legal + framework of the country to which the personal data is transferred. This is without prejudice to other + obligations applying to the processing in question under Regulation (EU) 2016/679. +

    +

    Clause 17

    +
    Governing law
    +
    +

    + These Clauses shall be governed by the law of the EU Member State in which the data exporter is + established. Where such law does not allow for third-party beneficiary rights, they shall be + governed by the law of another EU Member State that does allow for third-party beneficiary rights. + The Parties agree that this shall be the law of Ireland. +

    +
    +

    Clause 18

    +
    Choice of forum and jurisdiction
    +

    a. Any dispute arising from these Clauses shall be resolved by the courts of an EU Member State.

    +

    b. The Parties agree that those shall be the courts of Ireland.

    +

    + c. A data subject may also bring legal proceedings against the data exporter and/or data importer before + the courts of the Member State in which he/she has his/her habitual residence. +

    +

    d. The Parties agree to submit themselves to the jurisdiction of such courts.

    +

    APPENDIX

    +

    ANNEX I

    +
    +

    A.LIST OF PARTIES

    +

    Data exporter(s):

    +
    +

    + a. Name: The party who has executed the PlayFab Terms of Service with PlayFab, Inc. to which these + Standard Contractual Clauses are attached.
    + Address: As reflected in the Terms
    + Contact person's name, position and contact details: As reflected in the Terms
    + Activities relevant to the data transferred under these Clauses: As reflected in the Terms
    + Signature and date: The parties agree that execution of the PlayFab Terms of Service by the data + importer and the data exporter shall constitute execution of these Clauses by both parties as of the + execution date of the PlayFab Terms of Service
    + Role (controller/processor): Controller +

    +
    +

    Data importer:

    +
    +

    + a. Name: PlayFab, Inc.
    + Address: 1 Microsoft Way, Redmond, WA 98052 USA
    + Contact person's name, position and contact details: Chief Privacy Officer, 1 Microsoft Way, Redmond, WA + 98052 USA
    + Activities relevant to the data transferred under these Clauses: As reflected in the Terms
    + Signature and date: The parties agree that execution of the PlayFab Terms of Service by the data + importer and the data exporter shall constitute execution of these Clauses by both parties as of the + execution date of the PlayFab Terms of Service
    + Role (controller/processor): Processor +

    +
    +

    B.DESCRIPTION OF TRANSFER

    +

    Categories of data subjects whose personal data is transferred

    +

    + Data subjects include the data exporter's representatives and end-users including employees, + contractors, collaborators, and customers of the data exporter. Data subjects may also include + individuals attempting to communicate or transfer personal information to users of the services + provided by data importer. PlayFab acknowledges that, depending on data exporter's use of the + PlayFab Services, data exporter may elect to include personal data from any of the following types + of data subjects in the personal data: +

    +
    +

    a. Employees, contractors and temporary workers (current, former, prospective) of data exporter;

    +

    b. Dependents of the above;

    +

    + c. Data exporter's collaborators/contact persons (natural persons) or employees, contractors or + temporary workers of legal entity collaborators/contact persons (current, prospective, former); +

    +

    + d. Users (e.g., customers, clients, visitors, etc.) and other data subjects that are users of data + exporter's services; +

    +

    + e. Partners, stakeholders or individuals who actively collaborate, communicate or otherwise interact + with employees of the data exporter and/or use communication tools such as apps and websites provided by + the data exporter; +

    +

    + f. Stakeholders or individuals who passively interact with data exporter (e.g., because they are the + subject of an investigation, research or mentioned in documents or correspondence from or to the data + exporter); +

    +

    g. Minors; or

    +

    h. Professionals.

    +
    +

    Categories of personal data transferred

    +

    + The personal data transferred that is included in e-mail, documents and other data in an electronic + form in the context of the PlayFab Services. PlayFab acknowledges that, depending on data exporter's + use of the PlayFab Services, data exporter may elect to include personal data from any of the + following categories in the personal data: +

    +
    +

    a. Basic personal data including email address;

    +

    + b. Authentication data [for example user name, password (hashed and not accessible by PlayFab) and + sign-in history]; +

    +

    + c. Contact information [(for example addresses email, phone numbers, and social media identifiers (if a + user authenticates with social media)]; +

    +

    + d. Unique identification numbers and signatures (for example IP addresses, and unique identifiers in + tracking cookies or similar technology); +

    +

    e. Pseudonymous identifiers;

    +

    + f. Commercial Information (for example history of purchases, special offers, subscription information, + and purchase history); +

    +

    + g. Location data [for example, IP Address (with the ability for the developer to turn off the last + octet)]; +

    +

    h. Audio data may be routed through PlayFab Services;

    +

    + i. Device identification (for example if a developer is using the PlayFab SKD, device data is + collected); +

    +

    + j. Profiling (for example a developer can turn on a moderation tool to scan for inappropriate user + names, event data, IP addresses, apps installed, or profiles based on marketing preferences); +

    +

    + k. Education data (for example education history, current education, grades and results, highest degree + achieved, learning disability); or +

    +

    l. Any other personal data identified in Article 4 of the GDPR.

    +
    +

    + Sensitive data transferred (if applicable) and applied restrictions or safeguards that fully + take into consideration the nature of the data and the risks involved, such as for instance + strict purpose limitation, access restrictions (including access only for staff having followed + specialised training), keeping a record of access to the data, restrictions for onward transfers + or additional security measures. +

    +

    + No sensitive data will be transferred to PlayFab in the performance of PlayFab Services for the data + exporter under the PlayFab Terms of Service. +

    +

    + The frequency of the transfer (e.g. whether the data is transferred on a one-off or continuous + basis). +

    +

    The data will be transferred on a continuous basis.

    +

    Nature of the processing

    +

    The objective of the data processing is the performance of PlayFab Services.

    +

    Purpose(s) of the data transfer and further processing

    +

    + The scope and purpose of processing personal data is described in the Section 4.2 of the PlayFab + Terms of Service. The data importer operates a global network of data centers and management/support + facilities, and, subject to data exporter's documented instructions, processing may take place in + any jurisdiction where data importer or its sub-processors operate such facilities in accordance + with the Section 4.6 of the PlayFab Terms of Service. +

    +

    + The period for which the personal data will be retained, or, if that is not possible, the + criteria used to determine that period +

    +

    + The duration of data processing shall be for the term designated under the PlayFab Terms of Service + between data exporter and the entity to which these Standard Contractual Clauses are annexed. +

    +

    + For transfers to (sub-) processors, also specify subject matter, nature and duration of the + processing +

    +

    + In accordance with Section 4.6 of the PlayFab Terms of Service, the data importer may hire other + companies to provide limited services on data importer's behalf, such as providing customer support. + Any such subcontractors will be permitted to obtain Game Data and personal data only to deliver the + services the data importer has retained them to provide, and they are prohibited from using Game + Data and personal data for any other purpose. +

    +

    C.COMPETENT SUPERVISORY AUTHORITY

    +

    Identify the competent supervisory authority/ies in accordance with Clause 13

    +

    The competent supervisory authority is determined by Clause 13 in accordance with the GDPR.

    +
    +

    ANNEX II

    +
    + TECHNICAL AND ORGANISATIONAL MEASURES INCLUDING TECHNICAL AND ORGANISATIONAL MEASURES TO ENSURE THE + SECURITY OF THE DATA +
    +
    +

    + Description of the technical and organisational measures implemented by the data importer(s) + (including any relevant certifications) to ensure an appropriate level of security, taking into + account the nature, scope, context and purpose of the processing, and the risks for the rights + and freedoms of natural persons. +

    +

    + The data importer has implemented and will maintain appropriate technical and organizational + measures, internal controls, and information security routines intended to protect Game Data and + personal data, as defined in Section 4.5 of the Terms of Service, against accidental loss, + destruction, or alteration; unauthorized disclosure or access; or unlawful destruction as follows: + The technical and organizational measures, internal controls, and information security routines set + forth in Section 4.5 of the Terms of Service are hereby incorporated into this Annex 2 by this + reference and are binding on the data importer as if they were set forth in this Annex 2 in their + entirety. +

    +

    + For transfers to (sub-) processors, also describe the specific technical and organisational + measures to be taken by the (sub-) processor to be able to provide assistance to the controller + and, for transfers from a processor to a sub-processor, to the data exporter +

    +

    + The technical and organisational measures that the data importer will impose on sub-processors is + set forth in this Annex II. +

    +
    +

    ANNEX III — LIST OF SUB-PROCESSORS

    +

    The controller has authorised the use of the sub-processors listed herein:

    + + + + + + + + + + + + + + + + + +
    Company NameProcessing LocationShort DescriptionEEA Personal Data
    Transfer Mechanism
    Amazon Web Services
    (AWS)
    United StatesData Center Services
    - General Purpose
    Standard Contractual
    Clauses
    +
    +

    + ^1^ Where the data exporter is a processor subject to Regulation (EU) 2016/679 acting on behalf + of a Union institution or body as controller, reliance on these Clauses when engaging another + processor (sub-processing) not subject to Regulation (EU) 2016/679 also ensures compliance with + Article 29(4) of Regulation (EU) 2018/1725 of the European Parliament and of the Council of 23 + October 2018 on the protection of natural persons with regard to the processing of personal data by + the Union institutions, bodies, offices and agencies and on the free movement of such data, and + repealing Regulation (EC) No 45/2001 and Decision No 1247/2002/EC (OJ L 295 of 21.11.2018, p. 39), + to the extent these Clauses and the data protection obligations as set out in the contract or other + legal act between the controller and the processor pursuant to Article 29(3) of Regulation (EU) + 2018/1725 are aligned. This will in particular be the case where the controller and processor rely + on the standard contractual clauses included in Decision 2021/915. +

    +

    + ^2^ The Agreement on the European Economic Area (EEA Agreement) provides for the extension of + the European Union's internal market to the three EEA States Iceland, Liechtenstein and Norway. The + Union data protection legislation, including Regulation (EU) 2016/679, is covered by the EEA + Agreement and has been incorporated into Annex XI thereto. Therefore, any disclosure by the data + importer to a third party located in the EEA does not qualify as an onward transfer for the purpose + of these Clauses. +

    +

    + ^3^ This requirement may be satisfied by the sub-processor acceding to these Clauses under the + appropriate Module, in accordance with Clause 7. +

    +

    + ^4^ As regards the impact of such laws and practices on compliance with these Clauses, + different elements may be considered as part of an overall assessment. Such elements may include + relevant and documented practical experience with prior instances of requests for disclosure from + public authorities, or the absence of such requests, covering a sufficiently representative + time-frame. This refers in particular to internal records or other documentation, drawn up on a + continuous basis in accordance with due diligence and certified at senior management level, provided + that this information can be lawfully shared with third parties. Where this practical experience is + relied upon to conclude that the data importer will not be prevented from complying with these + Clauses, it needs to be supported by other relevant, objective elements, and it is for the Parties + to consider carefully whether these elements together carry sufficient weight, in terms of their + reliability and representativeness, to support this conclusion. In particular, the Parties have to + take into account whether their practical experience is corroborated and not contradicted by + publicly available or otherwise accessible, reliable information on the existence or absence of + requests within the same sector and/or the application of the law in practice, such as case law and + reports by independent oversight bodies. +

    +
    +
    + + + diff --git a/website/public/terms.html b/website/public/terms.html new file mode 100644 index 0000000..9f5cb66 --- /dev/null +++ b/website/public/terms.html @@ -0,0 +1,1067 @@ + + + + + + + + + + + + + + + + + Winter Starfall - Terms of Service + + + + + + + + + +
    +
    + Winter Starfall + +
    +
    +
    + +

    Terms of Service

    +
    +

    1. Your Agreement with PlayFab

    +

    + 1.1. Your use of the Azure PlayFab Services is governed by these Terms of Service (the "Terms"). + "PlayFab" or "we" means PlayFab, Inc. The Azure PlayFab Services (hereinafter "PlayFab Services") + means the services PlayFab or its Affiliates makes available throughhttps://playfab.com, any sub-pages and any other website designated by PlayFab (collectively, the "Website"), the + PlayFab cloud infrastructure, the PlayFab API, the PlayFab Tools, and any other software or services + offered by PlayFab in connection to any of those. "Affiliate" means any legal entity that a party + owns, that owns a party, or that is under common ownership with a party. "Ownership" means, for + purposes of this definition, control of more than a 50% interest in an entity. +

    +

    + 1.2. In order to use the PlayFab Services, you must first agree to the Terms. You understand and + agree that your use of the PlayFab Services will serve as your acceptance of the Terms from that + point onwards. +

    +

    + 1.3. You affirm that you are 13 years old or over, as the PlayFab Services may not be used by + children under 13. You further affirm that the Terms have been duly and validly agreed upon and + delivered by you and constitute your legal and binding obligation, enforceable against you in + accordance with its terms, and that you have all necessary power and authority to agree to and + perform in accordance with the Terms. +

    +

    + 1.4. You agree your purchases of PlayFab Services are not contingent on the delivery of any future + functionality or features or dependent on any oral or written public comments made by PlayFab + regarding future functionality or features. +

    +

    + 2. Your Account and Use of the PlayFab Services +

    +

    + 2.1. You must provide accurate and complete registration information any time you register to use + the PlayFab Services. You are responsible for the security of your passwords and for any use of your + account. If you become aware of any unauthorized use of your password or of your account, you agree + to notify PlayFab immediately. Your account will allow you to access and use the PlayFab Services in + connection with any game (and any related source code) written, published, or otherwise distributed + by you (your "Game" or "Games"). +

    +

    + 2.2. Your agreement to and performance under the Terms will not conflict with or violate any + provision of law, rule or regulation to which you are subject, or any agreement or other obligation + directly or indirectly applicable to you. Your use of the PlayFab Services must comply with all + applicable laws, regulations and ordinances, including any laws regarding the export of data or + software (the U.S. Export Administration Regulations, the International Traffic in Arms Regulations, + and end-user, end-use and destination restrictions issued by U.S. and other governments), and will + avoid deceptive, misleading or unethical trade practices, which includes making deceptive or + misleading representations, warranties or guarantees to the end users that play your Game ("End + Users") with respect to the specifications, features or capabilities of your Games. +

    +

    + 2.3. You agree not to (a) access (or attempt to access) the administrative interface of the PlayFab + Services by any means other than through the web interface or API that is provided by PlayFab in + connection with the PlayFab Services, unless you have been specifically allowed to do so in a + separate agreement with PlayFab, or (b) engage in any activity that interferes with or disrupts the + PlayFab Services (or the servers and networks which are connected to the PlayFab Service). +

    +

    + 2.4. Your account has usage limits, as further explained athttps://playfab.com/pricing/ (or such URL as PlayFab may provide). PlayFab reserves the right to enforce these usage + limits, which may result in PlayFab denying service to you or your End Users. Repeated exceeding of + the usage limits may lead to termination of your account. +

    +

    + 2.5. You may use the PlayFab Services only to develop and run Games that use the PlayFab Services. + In particular, you may not access the PlayFab Services for the purpose of benchmarking the PlayFab + Services, to resell or redistribute the PlayFab Services or to create a product or service + competitive with the PlayFab Services. +

    +

    + 2.6. You agree to include a PlayFab logo in a prominent location in your Game, such as on the splash + screen of your Game, and also to include our copyright and credit notice as is, without + modification, on any "help" or "credit" screens. More details are provided inhttps://playfab.com/style-guide/ + (or such other URL as PlayFab may provide), which by this reference is incorporated into the Terms. +

    +

    + 2.7 You must use the PlayFab services in order to maintain a PlayFab account. An inactive account + has no active subscriptions, no active titles, and no account signed in for more than 6 months. + PlayFab may suspend or terminate your account and delete all Game Data if your account is determined + to be inactive. PlayFab will provide you 30 days' notification prior to terminating your account. +

    +

    + 2.7.1 PlayFab may disable and delete, without notice, any Multiplayer Server game builds and + associated resources for titles which do not have any active Multiplayer Servers nor have uploaded + or configured Multiplayer Servers for the title in over 6 months. Note, in this case, your PlayFab + account and other title data will still be available unless it is determined inactive and terminated + as per 2.7 above. You can reenable Multiplayer Servers at any time. +

    +

    3. Acceptable Use Policy and Privacy

    +

    + 3.1. You agree to comply with the PlayFab Acceptable Use Policy available athttps://playfab.com/acceptable-use/ + (the "Acceptable Use Policy") which is incorporated herein by this reference and which may be + updated from time to time. +

    +

    + 3.2. The PlayFab Services shall be subject to the Microsoft privacy statement available athttps://privacy.microsoft.com/en-us/privacystatement. You agree to the use of your data in accordance with Microsoft's privacy statement. +

    +

    + 3.3. PlayFab will collect data from your End Users and your Games through your use of the PlayFab + Services. All data (including all text, sound, video, or image files) that you provide to PlayFab + through use of the PlayFab Service and all data PlayFab collects from your End Users through your + use of the PlayFab Services is considered “Game Data.” PlayFab may use your Game Data for the + purpose of providing the PlayFab Services according to your documented instructions. Furthermore, + excluding any personal data contained therein (i.e., user names, passwords, other information + relating to an identified or identifiable natural person, and any other data or information that + constitutes personal data or personal information under any applicable Data Protection Law), PlayFab + may use your Game Data for the purpose of improving and adding PlayFab features. +

    +

    + 3.4. You agree that you will comply with all laws, rules, regulations, decrees, statutes, or other + enactments, orders, mandates or resolutions relating to data security, data protection and/or + privacy, and any implementing, derivative or related legislation, rule, regulation, and regulatory + guidance ("Data Protection Laws"), including providing legally adequate privacy notices to End + Users. +

    +

    + 3.5. Game Data may be transferred to, and stored and processed in, the United States or any other + country in which PlayFab, its Affiliates or its subcontractors operate. You appoint PlayFab to + perform any such transfer of Game Data to any such country and to store and process personal data to + provide the PlayFab Services. +

    +

    + 3.6. California Consumer Privacy Act (the "CCPA"). PlayFab will process Game Data including personal + data within the scope of the CCPA on your behalf and, not retain, use, or disclose that data for any + purpose other than for the purposes set out in these Terms and as permitted under the CCPA, + including under any "sale" exemption. In no event will PlayFab sell any such Game Data. These CCPA + terms do not limit or reduce any data protection commitments PlayFab makes to you in these Terms or + any other agreement between you and PlayFab. +

    +

    4. GDPR Terms

    +

    + The terms of this Section 4 (the "GDPR Terms") apply to the extent your Game Data includes + information related to an identified or identifiable natural person that is subject to the European + Union General Data Protection Regulation (the "GDPR") or other applicable Data Protection Laws. + Lower case terms used but not defined in these GDPR Terms such as "personal data," "personal data + breach," "processing," "controller," "processor," "subprocessor" and "data subject" will have the + same meaning as set forth in Article 4 of the GDPR or other applicable Data Protection Laws. These + GDPR Terms do not apply where PlayFab is a controller of the personal data of its customers. +

    +

    + 4.1.Compliance with the GDPR and other applicable Data Protection Laws for Processing of Personal + Data. You and PlayFab agree to comply with all applicable provisions of the GDPR and other + applicable Data Protection Laws. You agree you are the controller of personal data and PlayFab is + the processor of such personal data, except when you act as a processor of personal data, in which + case PlayFab is a subprocessor. PlayFab will process personal data only on your documented + instructions. You agree that these Terms of Service, any other written Service Agreement with + PlayFab, and your use and configuration of features in the PlayFab Services are your complete and + final documented instructions to PlayFab for the processing of personal data. In any instance where + the GDPR or other applicable Data Protection Laws applies and you are a processor, you warrant to + PlayFab that your instructions, including appointment of PlayFab as a processor or subprocessor, + have been authorized by the relevant controller. +

    +

    4.2.Processing Details. You and PlayFab acknowledge and agree that:

    +

    + a) the nature and purpose of the processing is to provide the PlayFab Service pursuant to these + documented instructions;
    + b) the subject matter of the processing is limited to personal data within the scope of the GDPR or + other applicable Data Protection Laws;
    + c) the duration of the processing shall be for the duration of your right to use the PlayFab Service + and until all personal data is deleted, or returned in accordance with your instructions;
    + d) the types of personal data processed by the PlayFab Service include those expressly identified in + Article 4 of the GDPR or as set out in other applicable Data Protection Laws;
    + e) the categories of data subjects are employees, contractors, collaborators, and End Users;
    + f) PlayFab will process and transfer the personal data only on these documented instructions, unless + required to do so by the European Union or member state law or other applicable regulatory authority + to which PlayFab is subject; in such a case, PlayFab shall inform you of that legal requirement + before processing (unless that law prohibits such information on important grounds of public + interest); and
    + g) PlayFab will ensure that its personnel engaged in the processing of personal data (i) will comply + with subsection (f) herein and (ii) have committed to maintain the confidentiality of any personal + data even after their engagement ends. +

    +

    + 4.3.Data Subject Rights; Assistance with Requests. PlayFab will make the + personal data of data subjects available to you and provide you the ability to fulfill data subject + requests under the GDPR or other applicable Data Protection Laws, both in a manner consistent with + the functionality of the PlayFab Service and PlayFab's role as a processor. PlayFab shall comply + with your reasonable requests to assist with your response to such a data subject request. If + PlayFab receives a request from your data subject to exercise one or more of its rights under the + GDPR or other applicable Data Protection Laws in connection with a game for which PlayFab is a data + processor or subprocessor, PlayFab will redirect the data subject to make its request directly to + you. You will be responsible for responding to any such request, including, where necessary, by + using the functionality of the PlayFab Service. +

    +

    + 4.4.Records of Processing Activities and Reasonable Assistance. PlayFab shall + maintain all records required by GDPR or other applicable Data Protection Laws and, to the extent + applicable to the processing of personal data on your behalf, make them available to you upon + request. PlayFab will provide you reasonable assistance in compliance with the obligations of the + GDPR or other applicable Data Protection Laws, taking into account the nature of the processing and + the information available to PlayFab. +

    +

    + 4.5.Data Security. You and PlayFab will implement appropriate technical and + organizational measures to ensure a level of security appropriate to the risk, including inter alia, + as appropriate: +

    +

    + a) the pseudonymization and encryption of personal data;
    + b) the ability to ensure the ongoing confidentiality, integrity, availability and resilience of + processing systems and services;
    + c) the ability to restore the availability and access to personal data in a timely manner in the + event of a physical or technical incident; and
    + d) a process for regularly testing, assessing and evaluating the effectiveness of technical and + organizational measures for ensuring the security of the processing. +

    +

    + PlayFab's security measures will be set forth in a PlayFab Security Policy. PlayFab will make that + policy available to you, along with descriptions of the security controls in place for the PlayFab + Services and other information you reasonably request regarding PlayFab security practices and + policies. You are responsible for making an independent determination as to whether the technical + and organizational measures for the PlayFab Services meets your requirements. You acknowledge and + agree that (taking into account the state of the art, the costs of implementation, and the nature, + scope, context and purposes of the processing personal data as well as the risks to individuals) the + security practices and policies implemented and maintained by PlayFab provide a level of security + appropriate to the risk with respect to your personal data. You are responsible for implementing and + maintaining privacy protections and security measures for components that you provide or control. +

    +

    + 4.6.Notice and Controls on use of Subprocessors. PlayFab may hire third + parties to provide certain limited or ancillary services on its behalf. You consent to the + engagement of these third parties and PlayFab Affiliates as subprocessors of personal data if such + consent is required under law. PlayFab will inform you of new subprocessors it engages. You may + object to new subprocessors by providing written notice to PlayFab that includes an explanation of + the grounds for objection. +

    +

    + PlayFab is responsible for its subprocessor's compliance with PlayFab's obligations in these GDPR + Terms. When engaging any subprocessor, PlayFab will ensure via a written contract that the + subprocessor may access and use personal data only to deliver the services PlayFab has retained them + to provide and is prohibited from using personal data for any other purpose. PlayFab will ensure + that subprocessors are bound by written agreements that require them to provide at least the level + of data protection required of PlayFab by these terms. A current list of subprocessors can be found + athttps://playfab.com/privacy-terms/ +

    +

    + 4.7.Personal Data Breach. PlayFab shall notify you without undue delay after + becoming aware of a personal data breach. Such notification will include that information a + processor must provide to a controller under the GDPR or other applicable Data Protection Laws to + the extent such information is reasonably available to PlayFab. +

    +

    + PlayFab shall make reasonable efforts to assist you in fulfilling your obligation to notify the + relevant supervisory authority and data subjects of a personal data breach under A the GDPR or other + applicable Data Protection Laws. +

    +

    + 4.8.Audit. PlayFab will conduct audits of its compliance with these GDPR terms + as required by the GDPR or other applicable Data Protection Laws. Each audit will be performed by + qualified, independent, third party and/or internal security auditors at PlayFab's selection and + expense. Each audit will result in the generation of an audit report ("PlayFab Audit Report"), which + PlayFab will make available to you upon request. The PlayFab Audit Report will be PlayFab's + Proprietary Information and will clearly disclose any material findings by the auditor. PlayFab will + promptly remediate issues raised in any PlayFab Audit Report to the satisfaction of the auditor. +

    +

    + 4.9.Transfer of personal data. You agree you have a legal transfer mechanism + for the transfer of personal data to a third country or an international organization in accordance + with Data Protection Laws. All transfers of personal data to a third country or an international + organization will be subject to appropriate safeguards as described in the GDPR or other applicable + Data Protection Laws and such transfers and safeguards will be documented according to such laws. +

    +

    + If You or PlayFab transfers personal data from the European Economic Area, Switzerland, and the + United Kingdom to a third country or an international organization not recognized by the European + Commission, the Federal Data Protection and Information Commissioner, or UK Information + Commissioner's Office, respectively as providing an adequate level of protection for personal data, + the parties will be deemed to have executed Module 2 of the Standard Contractual Clauses athttps://playfab.com/privacy-terms/ (the “2021 Standard Contractual Clauses”), revised as necessary per the below. +

    +

    + For purposes of localizing the 2021 Standard Contractual Clauses for transfers out of Switzerland + and the United Kingdom: +

    +
      +
    • +

      Switzerland

      +
        +
      • +

        The parties adopt the GDPR standard for all data transfers.

        +
      • +
      • +

        + Clause 13 and Annex I(C): The competent authorities under Clause 13, and in Annex + I(C), are the Federal Data Protection and Information Commissioner and, + concurrently, the EEA member state authority identified above. +

        +
      • +
      • +

        Clause 17: The parties agree that the governing jurisdiction is Ireland.

        +
      • +
      • +

        + Clause 18: The parties agree that the forum is Ireland. The parties agree to + interpret the Standard Contractual Clauses so that Data Subjects in Switzerland are + able to sue for their rights in Switzerland in accordance with Clause 18(c). +

        +
      • +
      • +

        + The parties agree to interpret the Standard Contractual Clauses so that “Data + Subjects” +

        +
          +
        • + includes information about Swiss legal entities until the revised Federal Act on + Data Protection becomes operative. +
        • +
        +
      • +
      +
    • +
    • +

      United Kingdom

      +
        +
      • +

        + The parties agree that the Standard Contractual Clauses are deemed amended to the + extent necessary that they operate for transfers from the United Kingdom to a Third + Country and provide appropriate safeguards for transfers according to Article 46 of + the United Kingdom General Data Protection Regulation ("UK GDPR"). Such + amendments include changing references to the GDPR to the UK GDPR and changing + references to EU Member States to the United Kingdom. +

        +
      • +
      • +

        + Clause 17: The parties agree that the governing jurisdiction is the United Kingdom. +

        +
      • +
      • +

        + Clause 18: The parties agree that the forum is the courts of England and Wales. The + parties agree that Data Subjects may bring legal proceedings against either party in + the courts of any country in the United Kingdom. +

        +
      • +
      • +

        + In addition, transfers from the United Kingdom shall be governed by the IDTA + implemented by Microsoft. For purposes of the Agreement, the “IDTA” means + the international data transfer addendum to the European Commission's standard + contractual clauses for international data transfers issued by the UK Information + Commissioner's Office under S119A(1) of the UK Data Protection Act 2018. +

        +
      • +
      +
    • +
    +

    + 4.10.Contact PlayFab. If you believe that PlayFab is not adhering to its + privacy or security commitments, you may contact customer support or use PlayFab and Microsoft's + Privacy web form, located athttp://go.microsoft.com/?linkid=9846224. +

    +

    + PlayFab's mailing address is:
    + Chief Privacy Officer
    + Microsoft Corporation
    + One Microsoft Way
    + Redmond, Washington 98052 USA +

    +

    + Microsoft Ireland Operations Limited is PlayFab's data protection representative for the European + Economic Area and Switzerland. The privacy representative of Microsoft Ireland Operations Limited + can be reached at the following address: +

    +

    + Microsoft Ireland Operations, Ltd.
    + Attn: Data Protection Officer
    + One Microsoft Place
    + South County Business Park
    + Leopardstown
    + Dublin 18
    + D18 P521 +

    +

    + 4.11.Supplementation and Term. PlayFab may modify or supplement these GDPR + Terms, (a) if required to do so by a supervisory authority or other government or regulatory entity, + (b) if necessary to comply with applicable law, or (c) to adhere to an approved code of conduct or + certification mechanism approved or certified pursuant to Articles 40, 42 and 43 of the GDPR. + Without prejudice to these GDPR Terms, PlayFab may from time to time provide additional information + and detail about how it will execute these GDPR Terms in its service-specific technical, privacy, or + policy documentation. These GDPR Terms become effective upon Your use of the PlayFab Service. +

    +

    5. Fees for Use of the PlayFab Services

    +

    + 5.1. Subject to the Terms, you may sign up for the PlayFab Development Mode services, which PlayFab + will provide to you without charge up to certain limits. PlayFab may offer you the ability to use + additional resources and services without charge for a trial period. Usage of resources and services + beyond the trial period, usage of the PlayFab Development Mode Services over the designated limits, + or the use of other resources or services offered on the Website will require your purchase of + additional resources or services via individually priced services or an appropriate paid + Subscription plan. The PlayFab Development Mode Services limits, and the pricing for additional + resources and services, can be found on the Website athttps://playfab.com/pricing/ (or such other URL as PlayFab may provide). +

    +

    + 5.2. Payments for all purchased resources and services are due and must be made according to the + pricing and related terms in the services description published in the Website. Unless otherwise + noted in the service description, all fees will be billed in advance on a monthly basis (or at the + interval indicated in PlayFab's fees and payment policies, if different) and are due at the time of + invoice. You must provide PlayFab with a credit card, and PlayFab will automatically charge your + credit card based on the paid Subscription plan and any individually priced services you have + selected on the due date unless you have raised a good faith objection prior to the due date. At + PlayFab's sole discretion, PlayFab may also agree with you to accept your payments via wire + transfer, automated clearinghouse or PayPal. At PlayFab's sole discretion, PlayFab may also agree to + accept your payments via alternative means. Late payments will bear interest at the rate of 1.5% per + month (or the highest rate permitted by law, if less). To the fullest extent permitted by law, you + waive all claims relating to charges unless claimed within 60 days after the charge (this does not + affect your credit card issuer rights). Charges are solely based on PlayFab's measurements of your + use of the PlayFab Services, unless otherwise agreed to in writing. To the fullest extent permitted + by law, refunds (if any) are at the discretion of PlayFab and only in the form of credit for the + PlayFab Services. Nothing in these Terms obligates PlayFab to extend credit to any party. You + acknowledge and agree that any credit card and other billing and payment information that you + provide to PlayFab may be shared by PlayFab with companies who work on PlayFab's behalf, such as + payment processors and/or credit agencies, solely for the purposes of checking credit, effecting + payment to PlayFab and servicing your account. +

    +

    + 5.3. PlayFab may change its fees and payment policies for the PlayFab Services at any time, but in + the event of a fee increase, PlayFab will honor the previous pricing policy for you for at least + thirty (30) days after notifying you of the fee increase. Changes to the fees or payment policies + will be posted on the Website (or such other URL as PlayFab may provide from time to time). Any + outstanding balance becomes immediately due and payable upon termination of the Terms for any + reason. +

    +

    + 5.4. You may not develop multiple Games to simulate or act as a single Game, develop Games under + multiple unlinked accounts, or otherwise access the PlayFab Services in a manner intended to avoid + incurring fees. +

    +

    + 5.5. PlayFab Development Mode is provided for the purpose of development of games and applications, + and is intended for lightweight, low-volume usage of the PlayFab service. Permissible uses of + Development Mode include trail and evaluation of the PlayFab service, and the development and + limited launch of games and applications using the PlayFab service. High volume usage of the PlayFab + service, such as for load testing, is not allowed in Development Mode. If your Games misuse the + PlayFab Development Mode Services, requiring intervention from PlayFab, PlayFab will work with you + to quarantine the Game(s) to a high-risk server instance, address the misuse and/or to migrate your + Games to an appropriate paid Tier plan for enhanced support. Notwithstanding the above, PlayFab + reserves the right to terminate your use of the PlayFab Development Mode Service at any time for any + reason.. +

    +

    + 5.6. Prices are exclusive of any taxes unless otherwise specified on the invoice as tax inclusive. + You must pay any applicable value added, goods and services, sales, gross receipts, or other + transaction taxes, fees, charges or surcharges, or any regulatory cost recovery surcharges or + similar amounts that are owed under this agreement and which we are permitted to collect from you + under applicable law. You will be responsible for any applicable stamp taxes and for all other taxes + that you are legally obligated to pay. We will be responsible for all taxes based on our net income, + gross receipts taxes imposed in lieu of taxes on income or profits, or taxes on our property + ownership. If any taxes are required to be withheld on payments you make to us, you may deduct such + taxes from the amount owed to us and pay them to the appropriate taxing authority; provided, + however, that you promptly secure and deliver an official receipt for those withholdings and other + documents we reasonably request to claim a foreign tax credit or refund. You must ensure that any + taxes withheld are minimized to the extent possible under applicable law. +

    +

    + 6. User Generated Content on the PlayFab Services and Take Down Obligations +

    +

    + 6.1. You understand that all End User generated information (such as End User information, data + files, written text, music, audio files or other sounds, photographs, videos or other images) + included in Game Data to which you may have access as part of, or through your use of, the PlayFab + Services are your responsibility. +

    +

    + 6.2. You agree that you are solely responsible for (and that PlayFab has no responsibility to you or + to any third party for) the Game or any Game Data that you create, transmit or display while using + the PlayFab Services and for the consequences of your actions (including any loss or damage which + PlayFab may suffer) by doing so. You control access by End Users, and you are responsible for their + use of the PlayFab Services in accordance with these Terms of Service. For example, you will ensure + End Users comply with the Acceptable Use Policy. +

    +

    + 6.3. You agree to set up a process to respond to notices of alleged infringement that comply with + the United States' Digital Millennium Copyright Act ("DMCA notices"). It is PlayFab's policy to + respond to DMCA notices or other applicable copyright laws and to terminate the accounts of repeat + infringers. We reserve the right to take down Game Data in your Game or, if necessary, the Game + itself upon receipt of a valid DMCA notice. For more information, please go tohttps://playfab.com/acceptable-use/. +

    +

    + 6.4. You agree that PlayFab has no responsibility or liability for the deletion or failure to store + any Game Data and other communications maintained or transmitted through use of the PlayFab + Services. +

    +

    + 7. Proprietary Rights and Confidentiality Obligations +

    +

    + 7.1. You acknowledge and agree that PlayFab (or PlayFab's licensors) owns all legal right, title and + interest in and to the PlayFab Services, including any intellectual property rights which subsist in + the PlayFab Services (whether those rights happen to be registered or not, and wherever in the world + those rights may exist). +

    +

    + 7.2. Except as provided in Section 9, PlayFab acknowledges and agrees that it obtains no right, + title or interest from you (or your licensors or End Users) under these Terms in or to any Game Data + or Games that you create, submit, post, transmit or display on, or through, the PlayFab Services, + including any intellectual property rights which subsist in that Game Data and the Game (whether + those rights happen to be registered or not, and wherever in the world those rights may exist). + Unless you have agreed otherwise in writing with PlayFab, you agree that you are responsible for + protecting and enforcing those rights and that PlayFab has no obligation to do so on your behalf. +

    +

    + 7.3. For purposes of the Terms, "Proprietary Information" means all information disclosed through + any means of communication or by personal observation by or on behalf of the disclosing party to or + for the benefit of the other party that relates to the disclosing party's products, projects, + productions (including information regarding creators, authors, programmers, and other persons + involved in such productions), research and development, intellectual property, trade secrets, + technical know-how, policies or practices (and all creative, business and technical information + relating thereto), and any other matter that the other party is advised or has reason to know is the + confidential, trade secret or proprietary information of the disclosing party. You and PlayFab + acknowledge that during and through your use of the PlayFab Services, each of the parties and their + respective agents, employees, and representatives may obtain or have access to such Proprietary + Information of the other, including, but not limited to, information relating to stored data, + customer information, technical data, statistics, source code, programs, documentation and research. + You and PlayFab agree that, other than as otherwise expressly permitted under Section 7 hereof, such + Proprietary Information shall be maintained on a strictly confidential basis, will be used solely + for PlayFab's provision of the PlayFab Services and your utilization of such PlayFab Services, and + will be disclosed only to those of the parties' respective agents, employees and representatives who + require such information for purposes of their performance hereunder, or as required by applicable + law or regulation. Proprietary Information does not include data, materials or information that: (a) + was already known to the receiving party free of any restriction at the time it is obtained from the + disclosing party; (b) is subsequently learned from an independent third party free of any + restrictions and without breach of the Terms or any other agreements; (c) is or becomes publicly + available through no wrongful act of the receiving party; or (d) is independently developed by the + receiving party without reference to any Proprietary Information of the disclosing party. +

    +

    8. License from PlayFab and Restrictions

    +

    + 8.1. To facilitate your use of the PlayFab Services, PlayFab may make available to you certain + documentation, application programming interfaces (APIs), and sample source code (the "Licensed + Materials"). Subject to your compliance with the Terms (including, without limitation, the payment + obligations described in Section 5), PlayFab grants you a revocable, personal, worldwide, + royalty-free, non-assignable, non-transferable and non-exclusive license to use the Licensed + Materials made available to you by PlayFab as part of the PlayFab Services. This license is for the + sole purpose of enabling you to use and enjoy the benefit of the PlayFab Services as provided by + PlayFab, in the manner permitted by the Terms. Any other use of the Licensed Materials is + prohibited. +

    +

    + 8.2. You may not (and you may not permit anyone else to): (a) copy, modify, create a derivative work + of, reverse engineer, decompile or otherwise attempt to extract the source code of the PlayFab + Services, the Licensed Materials or any part thereof, unless this is expressly permitted or required + by law, or unless you have been specifically told that you may do so by PlayFab, in writing (e.g., + through an open source software license); (b) attempt to disable or circumvent any security + mechanisms used by the PlayFab Services or any Games running on the PlayFab Services; or (c) use the + PlayFab Services in any way that may subject the PlayFab Services to any obligations under any open + source software license, including, without limitation, any license which imposes any obligation or + restriction with respect to PlayFab's patent or other intellectual property rights in the PlayFab + Services. +

    +

    + 8.3. Open source software licenses for components of the PlayFab Services released under an open + source license constitute separate written agreements. To the limited extent that the open source + software licenses expressly supersede these Terms, the open source licenses govern your agreement + with PlayFab for the use of the components of the PlayFab Services released under an open source + license. +

    +

    + 8.4. PlayFab grants you a revocable, personal, worldwide, royalty-free, non-assignable, + non-transferable and non-exclusive license to use the PlayFab trade name (PlayFab) and the PlayFab + logo for the sole purpose of advertising or publicizing your use of the PlayFab Services as required + by Section 2.6 of the Terms, and provided that you use the trademarks in and follow the PlayFab + branding guidelines, available athttps://playfab.com/style-guide/ (or such other URL as PlayFab may provide). PlayFab has the right to review your use of the + PlayFab trademarks and require changes to use at any time. +

    +

    9. License from You

    +

    + 9.1. PlayFab claims no ownership or control over any Game Data or Game that you originate. You + retain copyright and any other rights you already hold in the Game Data and/or Game that you + originate, and you are responsible for protecting those rights, as appropriate. By submitting, + posting or displaying your Game Data on or through the PlayFab Services, you hereby grant to PlayFab + and its Affiliates a worldwide, royalty-free, and non-exclusive right and license to reproduce, + adapt, modify, translate, publish, publicly perform, publicly display and distribute such Game Data + for the sole purpose of enabling PlayFab to provide you with the PlayFab Services. Furthermore, by + creating or making available a Game to be used in connection with the PlayFab Services, you hereby + grant to PlayFab and its Affiliates a worldwide, royalty-free, and non-exclusive license to + reproduce, adapt, modify, translate, publish, publicly perform, publicly display and distribute such + Game for the sole purpose of enabling PlayFab to provide you with the PlayFab Services. PlayFab may + sublicense these rights to its vendors and subcontracts solely as necessary for PlayFab to perform + under this Agreement. +

    +

    + 9.2. By adding other individual persons to collaborate on a Game, you are responsible for ensuring + such collaborator complies with the terms of this agreement. +

    +

    + 9.3. You may choose to or PlayFab may invite you to submit comments or ideas about the PlayFab + Services, including, without limitation, about how to improve the PlayFab Services or our products + ("Ideas"). By submitting any Idea, you agree that your disclosure is gratuitous, unsolicited and + without restriction and will not place PlayFab under any fiduciary or other obligation, and that + PlayFab and its successors and assigns are free to use the Idea without any additional compensation + to you and to disclose the Idea on a non-confidential basis or otherwise to anyone. +

    +

    + 9.4. You agree that PlayFab, in its sole discretion, may use your trade names, trademarks, service + marks, logos, domain names, Game names and other distinctive brand features in presentations, + marketing materials, customer lists, financial reports and Website listings (including links to your + website) for the purpose of advertising or publicizing your use of the PlayFab Services. +

    +

    10. Add-ons

    +

    + 10.1. PlayFab may make available through the PlayFab Services additional features, functionality, + and services offered by its third-party partners ("Add-ons"). Your use of Add-ons is subject to + these Terms, to the applicable fees, and to your agreement to the third party partners' license + terms for those Add-ons, if any. You acknowledge for each Add-on you subscribe to or purchase + through the PlayFab Services, these Terms constitute a binding agreement between you and the third + party licensor of that Add-on ("the Add-on Provider") only. The Add-on Provider of each Add-on is + solely responsible for that Add-on, the content therein, and any claims that you or any other party + may have relating to that Add-on or your use of that Add-on. You acknowledge that you are purchasing + the license to each Add-on from the Add-on Provider of that Add-on; PlayFab is not acting as agent + for the Add-on Provider in providing each such Add-on to you; PlayFab is not a party to the license + between you and the Add-on Provider with respect to that Add-on; and PlayFab is not responsible for + that Add-on, the content therein, or any claims that you or any other party may have relating to + that Add-on or your use of that Add-on. +

    +

    + 10.2. By subscribing to or purchasing an Add-on, you grant PlayFab permission to share your Game, + Game Data, and user information with the Add-on Provider as necessary in order to provide you the + Add-on. +

    +

    + 10.3. The license granted to you to use any Add-on is personal to you, and is not sublicensable to + any other party, including without limitation your End Users. You may not provide or resell Add-ons + to others. +

    +

    + 11. Modification, suspension, and Termination of the PlayFab Services +

    +

    + 11.1. PlayFab is constantly innovating in order to provide the best possible experience for its + users. You acknowledge and agree that the form and nature of the PlayFab Services may change from + time to time without prior notice to you, subject to the terms in Section 5.3. PlayFab intends to + minimize changes to functionality or APIs that will negatively impact your Games. When making such + changes, PlayFab will create a new version of the API and use its commercially reasonable efforts to + continue to support the old version of the API for at least ninety (90) days. However, in the event + of security issues, issues affecting system health or other exigent circumstances such as changes in + the laws or regulations applicable to PlayFab or the PlayFab Services, PlayFab may terminate support + for the old version of the API without advance notice. Changes to the form and nature of the PlayFab + Services will be effective with respect to all versions of the PlayFab Services. Examples of changes + to the form and nature of the PlayFab Services include, without limitation, changes to fee and + payment policies, security patches, added functionality, and other enhancements. +

    +

    + 11.2. PlayFab may suspend or terminate your use of the PlayFab Services if: (a) it is reasonably + needed to prevent unauthorized access to your Game Data; (b) you fail to respond to a claim of + alleged infringement under Section 14 ("Indemnification") within a reasonable time; (c) you do not + pay amounts due under this agreement; or (d) you do not abide by the Acceptable Use Policy or you + violate other terms of this agreement. +

    +

    + 11.3. You may terminate these Terms at any time by canceling your account on the PlayFab Services, + unless you have a separate agreement or payment terms with PlayFab that do not permit you to + terminate until the end of the stated term in such agreement or payment terms. In such case, your + obligations under these Terms will continue until the end of the stated term in the agreement or + payment terms. You will not receive any refunds if you cancel your account. +

    +

    + 11.4. You are solely responsible for exporting your Game Data and Games from the PlayFab Services + prior to termination of your account for any reason, provided that if we terminate your account, we + will provide you a reasonable opportunity to retrieve your Game Data and Games. +

    +

    + 11.5. PlayFab will provide you twelve (12) months advance notice if PlayFab ceases to do business + and discontinues providing any PlayFab Services, unless (a) such termination of the PlayFab Service + is done sooner in response to a change in government regulation, obligation or other requirement or + (b) PlayFab or its Affiliates makes available a service that is substantially similar to the + discontinued PlayFab Services. +

    +

    + 11.6. Upon any termination of the PlayFab Services or your account, these Terms will also terminate, + but Sections 2.3, 3.3, 7.1, 8.2, 11, 12, 13, 14, 15.3 and 17 shall continue to be effective after + these Terms are terminated. +

    +

    12. EXCLUSION OF WARRANTIES

    +

    + 12.1. NOTHING IN THESE TERMS, INCLUDING SECTIONS 10 AND 13, SHALL EXCLUDE OR LIMIT PLAYFAB's + WARRANTY OR LIABILITY FOR LOSSES WHICH MAY NOT BE LAWFULLY EXCLUDED OR LIMITED BY APPLICABLE LAW. +

    +

    + 12.2. YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE PLAYFAB SERVICES IS AT YOUR SOLE RISK + AND THAT THE PLAYFAB SERVICES, AND ANY SUPPORT SERVICES PROVIDED, ARE PROVIDED "AS IS," "AS + AVAILABLE" AND "AS MODIFIED FROM TIME TO TIME." +

    +

    + 12.3. PLAYFAB AND ITS LICENSORS MAKE NO EXPRESS WARRANTIES AND DISCLAIM ALL IMPLIED WARRANTIES + REGARDING THE PLAYFAB SERVICES AND ANY SUPPORT SERVICES PROVIDED, INCLUDING, WITHOUT LIMITATION, + IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + WITHOUT LIMITING THE GENERALITY OF THE FOREGOING, PLAYFAB AND ITS LICENSORS DO NOT REPRESENT OR + WARRANT TO YOU THAT: (a) YOUR USE OF THE PLAYFAB SERVICES OR SUPPORT SERVICES PROVIDED WILL MEET + YOUR REQUIREMENTS; (b) YOUR USE OF THE PLAYFAB SERVICES WILL BE UNINTERRUPTED, TIMELY, SECURE OR + FREE FROM ERROR; AND (c) USAGE DATA PROVIDED THROUGH THE PLAYFAB SERVICES WILL BE ACCURATE. +

    +

    13. LIMITATION OF LIABILITY

    +

    + 13.1. Limitation. The aggregate liability of each party for all claims under this agreement is + limited to direct damages up to the amount paid under this agreement for the PlayFab Services during + the three (3) months before the cause of action arose. For previews, betas or PlayFab Services + provided free of charge, PlayFab's liability is limited to direct damages up to $5,000.00 USD. +

    +

    + 13.2. EXCLUSION. Neither party will be liable for loss of revenue or indirect, special, incidental, + consequential, punitive, or exemplary damages, or damages for lost profits, revenues, business + interruption, or loss of business information, even if the party knew they were possible or + reasonably foreseeable. +

    +

    + 13.3. Exceptions to limitations. The limits of liability in this Section apply to the fullest extent + permitted by applicable law, but do not apply to: (a) the parties' obligations under Section 14, or + (b) violation of the other's intellectual property rights. +

    +

    14. Indemnification

    +

    + 14.1. We will defend you against any claims made by an unaffiliated third party that the PlayFab + services infringe that third party's patent, copyright or trademark or makes unlawful use of its + trade secret. +

    +

    + 14.2. You will defend us against any claims made by an unaffiliated third party that: (a) any Game, + Game Data, or services you provide, directly or indirectly, in using the PlayFab Services violates + the rights of third parties, including privacy rights, or infringes the third party's patent, + copyright, or trademark or makes unlawful use of its trade secret; or (b) arises from violation of + the Acceptable Use Policy. +

    +

    + 14.3. Limitations. Our obligations in Section 14.1. won't apply to a claim or award based on: (a) + any Game, Game Data, or services or materials you provide or make available as part of using the + PlayFab Services; (b) your combination of the PlayFab Service with, or damages based upon the value + of a Game, product, service, data, or business process; (c) your use of a PlayFab trademark without + our express written consent, or your use of the PlayFab Services after we notify you to stop due to + a third-party claim; (d) your redistribution of the PlayFab Services to, or use for the benefit of, + any unaffiliated third party; or (e) anything provided by us provided free of charge. +

    +

    + 14.4. Remedies. If we reasonably believe that a claim under Section 14.1. may bar your use of the + PlayFab Services, we will seek to: (a) obtain the right for you to keep using it; or (b) modify or + replace it with a functional equivalent and notify you to stop use of the prior version of the + PlayFab Services. If these options are not commercially reasonable, we may terminate your rights to + use the PlayFab Services. +

    +

    + 14.5. Obligations. Each party must notify the other promptly of a claim under this Section. The + party seeking protection must (a) give the other sole control over the defense and settlement of the + claim; and (b) give reasonable help in defending the claim. The party providing the protection will + (i) reimburse the other for reasonable out-of-pocket expenses that it incurs in giving that help and + (ii) pay the amount of any resulting adverse final judgment or settlement. The parties' respective + rights to defense and payment of judgments (or settlement the other consents to) under this Section + 14 are in lieu of any common law or statutory indemnification rights or analogous rights, and each + party waives such common law or statutory rights. +

    +

    15. Other Content

    +

    + 15.1. The PlayFab Services may include hyperlinks to other web sites or content or resources or + email content. PlayFab has no control over any web sites or resources which are provided by + companies or persons other than PlayFab. +

    +

    + 15.2. You acknowledge and agree that PlayFab is not responsible for the availability of any such + external sites or resources, and does not endorse any advertising, products or other materials on or + available from such web sites or resources. +

    +

    + 15.3. You acknowledge and agree that PlayFab is not liable for any loss or damage which may be + incurred by you or your End Users as a result of the content or availability of those external sites + or resources, or as a result of any reliance placed by you on the completeness, accuracy or + existence of any advertising, products or other materials on, or available from, such web sites or + resources. +

    +

    16. Changes to the Terms

    +

    + 16.1. PlayFab may make changes to the Terms from time to time. If we change the Terms in any + substantive way, we will give you at least seven (7) days' notice before the changes take effect, + during which period of time you may reject the changes by terminating your account. +

    +

    + 16.2. You understand and agree that if you use the PlayFab Services after the date on which the + Terms have changed, your use will serve as your acceptance of the updated Terms. +

    +

    17. General Legal Terms

    +

    + 17.1. PlayFab will not disclose your Game Data from the PlayFab Services to law enforcement unless + required by law. If law enforcement contacts PlayFab or its Affiliates with a demand for your Game + Data in the PlayFab Services, PlayFab or its Affiliates will attempt to redirect the law enforcement + agency to request that data directly from you. If compelled to disclose Game Data to law + enforcement, PlayFab will promptly notify you and provide a copy of the demand unless legally + prohibited from doing so. Upon receipt of any other third-party request for Game Data, PlayFab will + promptly notify you unless prohibited by law. PlayFab will reject the request unless required by law + to comply. If the request is valid, PlayFab will attempt to redirect the third party to request the + data directly from you. +

    +

    + 17.2. Except to the extent you and PlayFab have entered into a separate written agreement that is + expressly intended to supersede these Terms either in whole or in part, the Terms constitute the + whole legal agreement between you and PlayFab and govern your use of the PlayFab Services, and + completely replace any prior agreements between you and PlayFab in relation to the PlayFab Services. +

    +

    + 17.3. There are no third-party beneficiaries to these Terms. The parties are independent + contractors, and nothing in these Terms creates an agency, partnership or joint venture. +

    +

    + 17.4. If PlayFab provides you with a translation of the English language version of these Terms, the + English language version of these Terms will control if there is any conflict. +

    +

    + 17.5. By creating an account, you agree to receive messages from PlayFab at the email address + associated with your PlayFab account. You agree that PlayFab may provide you with notices, including + those regarding changes to the Terms, by email, regular mail, or postings on the PlayFab Services or + the Website. You consent to our using the email address to send you any notices required by law in + lieu of communication by postal mail. To unsubscribe from service reports and alerts, you can remove + your email address from the respective notifications in each title's Email Preferences page of the + Game Manager (https://developer.playfab.com). To + unsubscribe from notifications concerning posts to the PlayFab support forums, you can change your + settings in the My Preferences section of the forums (https://community.playfab.com). +

    +

    + 17.6. You agree that if PlayFab does not exercise or enforce any legal right or remedy which is + contained in the Terms (or which PlayFab has the benefit of under any applicable law), this will not + be taken to be a formal waiver of PlayFab's rights and that those rights or remedies will still be + available to PlayFab. If any provision of the Terms is held to be invalid or unenforceable for any + reason, the remaining provisions will continue in full force without being impaired or invalidated + in any way. +

    +

    + 17.7. Government customers should consult with PlayFab prior to acceptance. If you are a government + customer, before accepting this agreement, you should consult with your PlayFab representative to + assure full compliance with local laws and governmental procurement processes. +

    +

    + 17.8. Except for payment obligations, neither party shall be liable for failing or delaying + performance of its obligations resulting from any condition beyond its reasonable control, including + but not limited to, governmental action, acts of terrorism, earthquake, fire, flood or other acts of + God, labor conditions, power failures, and Internet disturbances. +

    +

    + 17.9. The rights and remedies under the Terms are cumulative and are not exclusive of any rights or + remedies available at law or in equity or by any other agreement between the you and PlayFab. +

    +

    + 17.10. The Terms, and your relationship with PlayFab under the Terms, shall be governed by the laws + of the State of Washington without regard to its conflict of laws provisions. You and PlayFab agree + to submit to the exclusive jurisdiction of the courts located within King County, Washington, to + resolve any legal matter arising from the Terms. +

    +

    + 17.11. You may not assign any of your rights or obligations under these Terms, whether by operation + of law or otherwise, without the prior written consent of PlayFab. PlayFab may assign this agreement + and rights hereunder, in whole or in part, to its Affiliates. +

    +
    +
    + + + From c848ec62236b4afd941d55df60e0d01322f80536 Mon Sep 17 00:00:00 2001 From: Jordan Roher Date: Mon, 14 Oct 2024 10:24:35 -0700 Subject: [PATCH 5/5] Tweaks --- website/.vscode/settings.json | 2 +- website/tailwind.config.js | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/website/.vscode/settings.json b/website/.vscode/settings.json index a14c00e..d75e936 100644 --- a/website/.vscode/settings.json +++ b/website/.vscode/settings.json @@ -7,7 +7,7 @@ "**/.DS_Store": true, "**/Thumbs.db": true, "node_modules": true, - "dist": false + "dist": true }, "editor.formatOnSave": true, "editor.codeActionsOnSave": { diff --git a/website/tailwind.config.js b/website/tailwind.config.js index aed6d73..3323d34 100644 --- a/website/tailwind.config.js +++ b/website/tailwind.config.js @@ -6,7 +6,14 @@ /** @type {import('tailwindcss').Config} */ export default { - content: ["./index.html", "./public/about.html", "./src/**/*.{js,ts,jsx,tsx}"], + content: [ + "./index.html", + "./public/about.html", + "./public/privacy.html", + "./public/terms.html", + "./public/404.html", + "./src/**/*.{js,ts,jsx,tsx}", + ], theme: { extend: { textShadow: {