/// <summary> /// Separated from OnPlayFabLogin, to explicitly lose the refs to loginResult and registerResult, because /// only one will be defined, but both usually have all the information we REALLY need here. /// But the result signatures are different and clunky, so do the separation above, and processing here /// </summary> private static void _OnPlayFabLogin(ClientModels.UserSettings settingsForUser, string playFabId, string entityId, string entityType, PlayFabApiSettings settings, IPlayFabInstanceApi instanceApi) { _needsAttribution = _gatherDeviceInfo = _gatherScreenTime = false; if (settingsForUser != null) { _needsAttribution = settingsForUser.NeedsAttribution; _gatherDeviceInfo = settingsForUser.GatherDeviceInfo; _gatherScreenTime = settingsForUser.GatherFocusInfo; } // Device attribution (adid or idfa) if (settings.AdvertisingIdType != null && settings.AdvertisingIdValue != null) { DoAttributeInstall(settings, instanceApi); } else { GetAdvertIdFromUnity(settings, instanceApi); } // Device information gathering SendDeviceInfoToPlayFab(settings, instanceApi); #if !DISABLE_PLAYFABENTITY_API if (!string.IsNullOrEmpty(entityId) && !string.IsNullOrEmpty(entityType) && _gatherScreenTime) { PlayFabHttp.InitializeScreenTimeTracker(entityId, entityType, playFabId); } else { settings.DisableFocusTimeCollection = true; } #endif }
/// <summary> /// When a PlayFab login occurs, check the result information, and /// relay it to _OnPlayFabLogin where the information is used /// </summary> /// <param name="result"></param> public static void OnPlayFabLogin(PlayFabResultCommon result) { var loginResult = result as ClientModels.LoginResult; var registerResult = result as ClientModels.RegisterPlayFabUserResult; if (loginResult == null && registerResult == null) { return; } // Gather things common to the result types ClientModels.UserSettings settingsForUser = null; string playFabId = null; ClientModels.EntityTokenResponse entityInfo = null; if (loginResult != null) { settingsForUser = loginResult.SettingsForUser; playFabId = loginResult.PlayFabId; entityInfo = loginResult.EntityToken; } else if (registerResult != null) { settingsForUser = registerResult.SettingsForUser; playFabId = registerResult.PlayFabId; entityInfo = registerResult.EntityToken; } _OnPlayFabLogin(settingsForUser, playFabId, entityInfo); }
/// <summary> /// Separated from OnPlayFabLogin, to explicitly lose the refs to loginResult and registerResult, because /// only one will be defined, but both usually have all the information we REALLY need here. /// But the result signatures are different and clunky, so do the separation above, and processing here /// </summary> private static void _OnPlayFabLogin(ClientModels.UserSettings settingsForUser, string playFabId, ClientModels.EntityTokenResponse entityInfo) { _needsAttribution = _gatherDeviceInfo = _gatherScreenTime = false; if (settingsForUser != null) { _needsAttribution = settingsForUser.NeedsAttribution; _gatherDeviceInfo = settingsForUser.GatherDeviceInfo; _gatherScreenTime = settingsForUser.GatherFocusInfo; } // Device attribution (adid or idfa) if (PlayFabSettings.AdvertisingIdType != null && PlayFabSettings.AdvertisingIdValue != null) { DoAttributeInstall(); } else { GetAdvertIdFromUnity(); } // Device information gathering SendDeviceInfoToPlayFab(); #if ENABLE_PLAYFABENTITY_API string playFabUserId = playFabId; EntityModels.EntityKey entityKey = new EntityModels.EntityKey(); if (entityInfo != null && _gatherScreenTime) { entityKey.Id = entityInfo.Entity.Id; entityKey.Type = (EntityModels.EntityTypes)(int) entityInfo.Entity.Type; // possible loss of data entityKey.TypeString = entityInfo.Entity.TypeString; PlayFabHttp.InitializeScreenTimeTracker(entityKey, playFabUserId); } else { PlayFabSettings.DisableFocusTimeCollection = true; } #endif }
/// <summary> /// When a PlayFab login occurs, check the result information, and /// relay it to _OnPlayFabLogin where the information is used /// </summary> /// <param name="result"></param> public static void OnPlayFabLogin(PlayFabResultCommon result, PlayFabApiSettings settings, IPlayFabInstanceApi instanceApi) { var loginResult = result as ClientModels.LoginResult; var registerResult = result as ClientModels.RegisterPlayFabUserResult; if (loginResult == null && registerResult == null) { return; } // Gather things common to the result types ClientModels.UserSettings settingsForUser = null; string playFabId = null; string entityId = null; string entityType = null; if (loginResult != null) { settingsForUser = loginResult.SettingsForUser; playFabId = loginResult.PlayFabId; if (loginResult.EntityToken != null) { entityId = loginResult.EntityToken.Entity.Id; entityType = loginResult.EntityToken.Entity.Type; } } else if (registerResult != null) { settingsForUser = registerResult.SettingsForUser; playFabId = registerResult.PlayFabId; if (registerResult.EntityToken != null) { entityId = registerResult.EntityToken.Entity.Id; entityType = registerResult.EntityToken.Entity.Type; } } _OnPlayFabLogin(settingsForUser, playFabId, entityId, entityType, settings, instanceApi); }
public void MakeApiCall(CallRequestContainer reqContainer) { //Set headers var headers = new Dictionary <string, string> { { "Content-Type", "application/json" } }; if (reqContainer.AuthKey == AuthType.DevSecretKey) { #if ENABLE_PLAYFABSERVER_API || ENABLE_PLAYFABADMIN_API headers.Add("X-SecretKey", PlayFabSettings.DeveloperSecretKey); #endif } else if (reqContainer.AuthKey == AuthType.LoginSession) { headers.Add("X-Authorization", AuthKey); } headers.Add("X-ReportErrorAsSuccess", "true"); headers.Add("X-PlayFabSDK", PlayFabSettings.VersionString); #if !UNITY_WSA && !UNITY_WP8 && !UNITY_WEBGL if (PlayFabSettings.CompressApiData) { headers.Add("Content-Encoding", "GZIP"); headers.Add("Accept-Encoding", "GZIP"); using (var stream = new MemoryStream()) { using (var zipstream = new GZipStream(stream, CompressionMode.Compress, CompressionLevel.BestCompression)) { zipstream.Write(reqContainer.Payload, 0, reqContainer.Payload.Length); } reqContainer.Payload = stream.ToArray(); } } #endif //Debug.LogFormat("Posting {0} to Url: {1}", req.Trim(), url); var www = new WWW(reqContainer.FullUrl, reqContainer.Payload, headers); #if PLAYFAB_REQUEST_TIMING var stopwatch = System.Diagnostics.Stopwatch.StartNew(); #endif // Start the www corouting to Post, and get a response or error which is then passed to the callbacks. Action <string> wwwSuccessCallback = (response) => { try { #if PLAYFAB_REQUEST_TIMING var startTime = DateTime.UtcNow; #endif var httpResult = JsonWrapper.DeserializeObject <HttpResponseObject>(response); if (httpResult.code == 200) { // We have a good response from the server reqContainer.JsonResponse = JsonWrapper.SerializeObject(httpResult.data); reqContainer.DeserializeResultJson(); reqContainer.ApiResult.Request = reqContainer.ApiRequest; reqContainer.ApiResult.CustomData = reqContainer.CustomData; #if !DISABLE_PLAYFABCLIENT_API ClientModels.UserSettings userSettings = null; var res = reqContainer.ApiResult as ClientModels.LoginResult; var regRes = reqContainer.ApiResult as ClientModels.RegisterPlayFabUserResult; if (res != null) { userSettings = res.SettingsForUser; AuthKey = res.SessionTicket; } else if (regRes != null) { userSettings = regRes.SettingsForUser; AuthKey = regRes.SessionTicket; } if (userSettings != null && AuthKey != null && userSettings.NeedsAttribution) { PlayFabIdfa.OnPlayFabLogin(); } #endif try { PlayFabHttp.SendEvent(reqContainer.ApiEndpoint, reqContainer.ApiRequest, reqContainer.ApiResult, ApiProcessingEventType.Post); } catch (Exception e) { Debug.LogException(e); } #if PLAYFAB_REQUEST_TIMING stopwatch.Stop(); var timing = new PlayFabHttp.RequestTiming { StartTimeUtc = startTime, ApiEndpoint = reqContainer.ApiEndpoint, WorkerRequestMs = (int)stopwatch.ElapsedMilliseconds, MainThreadRequestMs = (int)stopwatch.ElapsedMilliseconds }; PlayFabHttp.SendRequestTiming(timing); #endif try { reqContainer.InvokeSuccessCallback(); } catch (Exception e) { Debug.LogException(e); } } else { if (reqContainer.ErrorCallback != null) { reqContainer.Error = PlayFabHttp.GeneratePlayFabError(response, reqContainer.CustomData); PlayFabHttp.SendErrorEvent(reqContainer.ApiRequest, reqContainer.Error); reqContainer.ErrorCallback(reqContainer.Error); } } } catch (Exception e) { Debug.LogException(e); } }; Action <string> wwwErrorCallback = (errorCb) => { reqContainer.JsonResponse = errorCb; if (reqContainer.ErrorCallback != null) { reqContainer.Error = PlayFabHttp.GeneratePlayFabError(reqContainer.JsonResponse, reqContainer.CustomData); PlayFabHttp.SendErrorEvent(reqContainer.ApiRequest, reqContainer.Error); reqContainer.ErrorCallback(reqContainer.Error); } }; PlayFabHttp.instance.StartCoroutine(Post(www, wwwSuccessCallback, wwwErrorCallback)); }
private static void ProcessJsonResponse(CallRequestContainer reqContainer) { try { var httpResult = JsonWrapper.DeserializeObject <HttpResponseObject>(reqContainer.JsonResponse, PlayFabUtil.ApiSerializerStrategy); #if PLAYFAB_REQUEST_TIMING reqContainer.Timing.WorkerRequestMs = (int)reqContainer.Stopwatch.ElapsedMilliseconds; #endif //This would happen if playfab returned a 500 internal server error or a bad json response. if (httpResult == null || httpResult.code != 200) { QueueRequestError(reqContainer); return; } reqContainer.JsonResponse = JsonWrapper.SerializeObject(httpResult.data, PlayFabUtil.ApiSerializerStrategy); reqContainer.DeserializeResultJson(); // Assigns Result with a properly typed object reqContainer.ApiResult.Request = reqContainer.ApiRequest; reqContainer.ApiResult.CustomData = reqContainer.CustomData; #if !DISABLE_PLAYFABCLIENT_API ClientModels.UserSettings userSettings = null; var res = reqContainer.ApiResult as ClientModels.LoginResult; var regRes = reqContainer.ApiResult as ClientModels.RegisterPlayFabUserResult; if (res != null) { userSettings = res.SettingsForUser; _authKey = res.SessionTicket; } else if (regRes != null) { userSettings = regRes.SettingsForUser; _authKey = regRes.SessionTicket; } if (userSettings != null && _authKey != null && userSettings.NeedsAttribution) { lock (ResultQueue) { ResultQueue.Enqueue(PlayFabIdfa.OnPlayFabLogin); } } var cloudScriptUrl = reqContainer.ApiResult as ClientModels.GetCloudScriptUrlResult; if (cloudScriptUrl != null) { PlayFabSettings.LogicServerUrl = cloudScriptUrl.Url; } #endif lock (ResultQueue) { //Queue The result callbacks to run on the main thread. ResultQueue.Enqueue(() => { #if PLAYFAB_REQUEST_TIMING reqContainer.Stopwatch.Stop(); reqContainer.Timing.MainThreadRequestMs = (int)reqContainer.Stopwatch.ElapsedMilliseconds; PlayFabHttp.SendRequestTiming(reqContainer.Timing); #endif try { PlayFabHttp.SendEvent(reqContainer.ApiRequest, reqContainer.ApiResult, ApiProcessingEventType.Post); reqContainer.InvokeSuccessCallback(); } catch (Exception e) { Debug.LogException(e); // Log the user's callback exception back to them without halting PlayFabHttp } }); } } catch (Exception e) { var msg = "Unhandled exception in ProcessJsonResponse : " + reqContainer.FullUrl; reqContainer.JsonResponse = reqContainer.JsonResponse ?? msg; var enhancedError = new Exception(msg, e); Debug.LogException(enhancedError); QueueRequestError(reqContainer); } }