void RequestGameIdsOnCompleted(AsyncOperation asyncOperation) { if (asyncOperation.isDone) { if (ServicesUtils.IsUnityWebRequestReadyForJsonExtract(m_CurrentWebRequest)) { if (m_CurrentWebRequest.downloadHandler.text.Length != 0) { var jsonParser = new JSONParser(m_CurrentWebRequest.downloadHandler.text); try { var json = jsonParser.Parse(); var key = k_JsonAppleGameId; string appleGameId = null; string androidGameId = null; if (json.AsDict().ContainsKey(key)) { appleGameId = json.AsDict()[key].ToString(); } key = k_JsonAndroidGameId; if (json.AsDict().ContainsKey(key)) { androidGameId = json.AsDict()[key].ToString(); } SetGameIds(appleGameId, androidGameId); } catch (Exception ex) { Debug.LogException(ex); NotificationManager.instance.Publish(Notification.Topic.AdsService, Notification.Severity.Error, ex.Message); } } } else if (m_CurrentWebRequest?.result == UnityWebRequest.Result.ProtocolError && m_GameIdsRequestIteration < k_GameIdsRequestMaxIteration) { CancelCurrentWebRequest(); m_GameIdsRequestIteration++; //Adding a delay between retries as we may be waiting for the project to be created var context = SynchronizationContext.Current; m_RetryTimer = new Timer((obj) => { context?.Post((o) => this?.RequestGameIds(), null); }, null, k_GameIdsIterationDelay, 0); return; } else { SetGameIds(appleGameId: null, androidGameId: null); } CancelCurrentWebRequest(); } }
void GetProjectInfoRequestOnCompleted(AsyncOperation obj) { if (m_Provider.m_GetProjectRequest == null) { //If we lost our request reference, we can't risk doing anything. return; } try { if (ServicesUtils.IsUnityWebRequestReadyForJsonExtract(m_Provider.m_GetProjectRequest)) { try { var jsonParser = new JSONParser(m_Provider.m_GetProjectRequest.downloadHandler.text); var json = jsonParser.Parse(); if (json.AsDict()[k_JsonNodeNameDisabled].AsBool()) { NotificationManager.instance.Publish( Notification.Topic.BuildService, Notification.Severity.Error, L10n.Tr(k_MessageProjectStateMismatch)); } else { var linksDict = json.AsDict()[k_JsonNodeNameLinks].AsDict(); ServicesConfiguration.instance.RequestCloudBuildApiUrl(cloudBuildApiUrl => { m_CloudBuildApiOrgProjectUrl = cloudBuildApiUrl + linksDict[k_JsonNodeNameSelf].AsDict()[k_JsonNodeNameHref].AsString(); m_CloudBuildApiOrgProjectBillingPlanUrl = m_CloudBuildApiOrgProjectUrl + k_UrlSuffixBillingPlan; m_CloudBuildApiOrgProjectBuildTargetsUrl = cloudBuildApiUrl + linksDict[k_JsonNodeNameListBuildTargets].AsDict()[k_JsonNodeNameHref].AsString(); m_CloudBuildApiOrgLatestBuilds = cloudBuildApiUrl + linksDict[k_JsonNodeNameLatestBuilds].AsDict()[k_JsonNodeNameHref].AsString(); m_CloudBuildApiOrgLatestBuilds = m_CloudBuildApiOrgLatestBuilds.Remove(m_CloudBuildApiOrgLatestBuilds.Length - 1, 1) + k_NumberOfBuildsToQuery; GetProjectBillingPlan(); }); } } catch (Exception ex) { NotificationManager.instance.Publish( Notification.Topic.BuildService, Notification.Severity.Error, L10n.Tr(k_MessageErrorForProjectData)); Debug.LogException(ex); } } } finally { m_Provider.m_GetProjectRequest.Dispose(); m_Provider.m_GetProjectRequest = null; } }
void LoadConfigurationsFromCdn() { try { if (m_GetServicesUrlsRequest != null) { try { m_GetServicesUrlsRequest.Abort(); } catch (Exception) { // ignored, we try to abort (best effort) but no need to panic if it fails } m_GetServicesUrlsRequest.Dispose(); m_GetServicesUrlsRequest = null; } m_GetServicesUrlsRequest = new UnityWebRequest(string.Format(k_CdnConfigUrl, UnityConnect.instance.GetEnvironment()), UnityWebRequest.kHttpVerbGET) { downloadHandler = new DownloadHandlerBuffer() }; m_GetServicesUrlsRequest.suppressErrorsToConsole = true; var operation = m_GetServicesUrlsRequest.SendWebRequest(); operation.completed += asyncOperation => { try { if (ServicesUtils.IsUnityWebRequestReadyForJsonExtract(m_GetServicesUrlsRequest)) { LoadJsonConfiguration(m_GetServicesUrlsRequest.downloadHandler.text); SessionState.SetString(k_ConfigJsonSessionStateKey, m_GetServicesUrlsRequest.downloadHandler.text); BuildPaths(); } } catch (Exception) { //We fallback to hardcoded config BuildPaths(); } finally { m_GetServicesUrlsRequest?.Dispose(); m_GetServicesUrlsRequest = null; } }; } catch (Exception) { //We fallback to hardcoded config BuildPaths(); } }
void LoadConfigurationsFromCdn() { try { var getServicesUrlsRequest = new UnityWebRequest(string.Format(k_CdnConfigUrl, UnityConnect.instance.GetEnvironment()), UnityWebRequest.kHttpVerbGET) { downloadHandler = new DownloadHandlerBuffer() }; var operation = getServicesUrlsRequest.SendWebRequest(); operation.completed += asyncOperation => { try { if (ServicesUtils.IsUnityWebRequestReadyForJsonExtract(getServicesUrlsRequest)) { LoadJsonConfiguration(getServicesUrlsRequest.downloadHandler.text); BuildPaths(); } } catch (Exception) { //We fallback to local file config BuildPaths(); } finally { getServicesUrlsRequest.Dispose(); } }; } catch (Exception) { //We fallback to local file config BuildPaths(); } }
void GetProjectBillingPlanRequestOnCompleted(AsyncOperation obj) { if (m_Provider.m_GetProjectBillingPlanRequest == null) { //If we lost our request reference, we can't risk doing anything. return; } try { if (ServicesUtils.IsUnityWebRequestReadyForJsonExtract(m_Provider.m_GetProjectBillingPlanRequest)) { try { var jsonParser = new JSONParser(m_Provider.m_GetProjectBillingPlanRequest.downloadHandler.text); var json = jsonParser.Parse(); m_BillingPlanLabel = json.AsDict()[k_JsonNodeNameEffective].AsDict()[k_JsonNodeNameLabel].AsString(); GetProjectBuildTargets(); GetApiStatus(); } catch (Exception ex) { NotificationManager.instance.Publish( Notification.Topic.BuildService, Notification.Severity.Error, L10n.Tr(k_MessageErrorForProjectTeamData)); Debug.LogException(ex); } } } finally { m_Provider.m_GetProjectBillingPlanRequest.Dispose(); m_Provider.m_GetProjectBillingPlanRequest = null; } }
void GetApiStatusRequestOnCompleted(AsyncOperation obj) { if (m_Provider.m_GetApiStatusRequest == null) { //If we lost our request reference, we can't risk doing anything. return; } try { if (ServicesUtils.IsUnityWebRequestReadyForJsonExtract(m_Provider.m_GetApiStatusRequest)) { try { var jsonParser = new JSONParser(m_Provider.m_GetApiStatusRequest.downloadHandler.text); var json = jsonParser.Parse(); var notificationEntryList = json.AsList(); if (notificationEntryList.Count > 0) { foreach (var jsonNotificationEntry in notificationEntryList) { var notificationEntry = jsonNotificationEntry.AsDict(); var notificationText = notificationEntry[k_JsonNodeNameText].AsString(); var billingPlan = string.Empty; if (notificationEntry.ContainsKey(k_JsonNodeNameBillingPlan)) { billingPlan = notificationEntry[k_JsonNodeNameBillingPlan].AsString(); } var notificationAlertType = notificationEntry[k_JsonNodeNameAlertType].AsString().ToLower(); if (string.IsNullOrEmpty(billingPlan) || m_BillingPlanLabel.ToLower().Equals(billingPlan.ToLower())) { var severity = Notification.Severity.Error; if (notificationAlertType.Equals(Notification.Severity.Warning.ToString().ToLower())) { severity = Notification.Severity.Warning; } else if (notificationAlertType.Equals(Notification.Severity.Info.ToString().ToLower())) { severity = Notification.Severity.Info; } NotificationManager.instance.Publish(Notification.Topic.BuildService, severity, notificationText); } } } } catch (Exception ex) { NotificationManager.instance.Publish( Notification.Topic.BuildService, Notification.Severity.Error, L10n.Tr(k_MessageErrorForApiStatusData)); Debug.LogException(ex); } } } finally { m_Provider.m_GetApiStatusRequest.Dispose(); m_Provider.m_GetApiStatusRequest = null; } }
void AddBuildTarget(VisualElement targetsContainer, Dictionary <string, JSONValue> buildEntry) { if (buildEntry[k_JsonNodeNameEnabled].AsBool()) { ServicesConfiguration.instance.RequestCloudBuildApiUrl(cloudBuildApiUrl => { var buildTargetName = buildEntry[k_JsonNodeNameName].AsString(); var buildTargetId = buildEntry[k_JsonNodeNameBuildTargetId].AsString(); var buildTargetUrls = buildEntry[k_JsonNodeNameLinks].AsDict(); var startBuildUrl = cloudBuildApiUrl + buildTargetUrls[k_JsonNodeNameStartBuilds].AsDict()[k_JsonNodeNameHref].AsString(); var targetContainer = new VisualElement(); targetContainer.AddToClassList(k_ClassNameTargetEntry); var buildNameTextElement = new TextElement(); buildNameTextElement.AddToClassList(k_ClassNameTitle); buildNameTextElement.text = buildTargetName; targetContainer.Add(buildNameTextElement); var buildButton = new Button(); buildButton.name = k_BuildButtonNamePrefix + buildTargetId; buildButton.AddToClassList(k_ClassNameBuildButton); if (m_BillingPlanLabel.ToLower() == k_SubscriptionPersonal || k_SubscriptionTeamsBasic.ToLower() == k_SubscriptionPersonal) { buildButton.SetEnabled(false); } buildButton.text = L10n.Tr(k_LabelBuildButton); buildButton.clicked += () => { var uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(k_LaunchBuildPayload)); var launchBuildPostRequest = new UnityWebRequest(startBuildUrl, UnityWebRequest.kHttpVerbPOST) { downloadHandler = new DownloadHandlerBuffer(), uploadHandler = uploadHandler }; launchBuildPostRequest.suppressErrorsToConsole = true; launchBuildPostRequest.SetRequestHeader("AUTHORIZATION", $"Bearer {UnityConnect.instance.GetUserInfo().accessToken}"); launchBuildPostRequest.SetRequestHeader("Content-Type", "application/json;charset=utf-8"); m_Provider.m_BuildRequests.Add(launchBuildPostRequest); var launchingMessage = string.Format(L10n.Tr(k_MessageLaunchingBuild), buildTargetName); Debug.Log(launchingMessage); NotificationManager.instance.Publish( Notification.Topic.BuildService, Notification.Severity.Info, launchingMessage); EditorAnalytics.SendLaunchCloudBuildEvent(new BuildPostInfo() { targetName = buildTargetName }); var operation = launchBuildPostRequest.SendWebRequest(); operation.completed += asyncOperation => { try { if (ServicesUtils.IsUnityWebRequestReadyForJsonExtract(launchBuildPostRequest)) { try { if (launchBuildPostRequest.responseCode == k_HttpResponseCodeAccepted) { var jsonLaunchedBuildParser = new JSONParser(launchBuildPostRequest.downloadHandler.text); var launchedBuildJson = jsonLaunchedBuildParser.Parse(); var launchedBuilds = launchedBuildJson.AsList(); foreach (var rawLaunchedBuild in launchedBuilds) { var launchedBuild = rawLaunchedBuild.AsDict(); if (launchedBuild.ContainsKey(k_JsonNodeNameBuild)) { var buildNumber = launchedBuild[k_JsonNodeNameBuild].AsFloat().ToString(); var message = string.Format(L10n.Tr(k_MessageLaunchedBuildSuccess), buildNumber, buildTargetName); Debug.Log(message); NotificationManager.instance.Publish( Notification.Topic.BuildService, Notification.Severity.Info, message); } else if (launchedBuild.ContainsKey(k_JsonNodeNameError)) { var message = string.Format(L10n.Tr(k_MessageLaunchedBuildFailedWithMsg), buildTargetName, launchedBuild[k_JsonNodeNameError].ToString()); Debug.LogError(message); NotificationManager.instance.Publish( Notification.Topic.BuildService, Notification.Severity.Error, message); } } } else { var message = L10n.Tr(k_MessageLaunchedBuildFailure); Debug.LogError(message); NotificationManager.instance.Publish( Notification.Topic.BuildService, Notification.Severity.Error, message); } } catch (Exception ex) { NotificationManager.instance.Publish( Notification.Topic.BuildService, Notification.Severity.Error, L10n.Tr(k_MessageErrorForBuildLaunch)); Debug.LogException(ex); } } } finally { m_Provider.m_BuildRequests.Remove(launchBuildPostRequest); launchBuildPostRequest.Dispose(); launchBuildPostRequest = null; } }; }; targetContainer.Add(buildButton); targetsContainer.Add(targetContainer); var separator = new VisualElement(); separator.AddToClassList(k_ClassNameSeparator); targetsContainer.Add(separator); }); } }
void GetBuildTargetsRequestOnCompleted(AsyncOperation obj) { if (m_Provider.m_GetProjectBuildTargetsRequest == null) { //If we lost our request reference, we can't risk doing anything. return; } try { if (ServicesUtils.IsUnityWebRequestReadyForJsonExtract(m_Provider.m_GetProjectBuildTargetsRequest)) { try { var jsonParser = new JSONParser(m_Provider.m_GetProjectBuildTargetsRequest.downloadHandler.text); var json = jsonParser.Parse(); var buildEntryList = json.AsList(); if (buildEntryList.Count <= 0) { CloudBuildPoller.instance.Disable(); } else { m_Provider.rootVisualElement.Q(k_NoTargetContainer).style.display = DisplayStyle.None; m_Provider.rootVisualElement.Q(k_AddTargetButton).style.display = DisplayStyle.None; m_Provider.rootVisualElement.Q(k_ManageTargetButton).style.display = DisplayStyle.Flex; m_Provider.rootVisualElement.Q(k_PollFooterName).style.display = DisplayStyle.Flex; m_Provider.rootVisualElement.Q(k_PollFooterSectionName).style.display = DisplayStyle.Flex; var pollerToggle = m_Provider.rootVisualElement.Q <Toggle>(k_PollToggleName); if (!CloudBuildPoller.instance.enabledOnce) { CloudBuildPoller.instance.Enable(m_CloudBuildApiOrgLatestBuilds); } pollerToggle.SetValueWithoutNotify(CloudBuildPoller.instance.enabled); pollerToggle.RegisterValueChangedCallback(evt => { if (evt.newValue) { CloudBuildPoller.instance.Enable(m_CloudBuildApiOrgLatestBuilds); } else { CloudBuildPoller.instance.Disable(); } }); m_Provider.rootVisualElement.Q <TextElement>(className: k_ServiceTargetContainerTitleClassName).text = L10n.Tr(k_LabelConfiguredTargets); var targetsContainer = m_Provider.rootVisualElement.Q(className: k_ServiceTargetContainerClassName); foreach (var jsonBuildEntry in buildEntryList) { var buildEntry = jsonBuildEntry.AsDict(); AddBuildTarget(targetsContainer, buildEntry); } } m_Provider.rootVisualElement.Q(className: k_ServiceCloudBuildContainerClassName).style.display = DisplayStyle.Flex; m_Provider.rootVisualElement.Q(className: k_ServiceCloudProgressClassName).style.display = DisplayStyle.None; } catch (Exception ex) { NotificationManager.instance.Publish( Notification.Topic.BuildService, Notification.Severity.Error, L10n.Tr(k_MessageErrorForProjectBuildTargetsData)); Debug.LogException(ex); } } } finally { m_Provider.m_GetProjectBuildTargetsRequest.Dispose(); m_Provider.m_GetProjectBuildTargetsRequest = null; } }
/// <summary> /// To attach a project an existing project, we must collect all orgs the current user is a member of. /// In addition the current user may be a guest of a specific project, in which case we must also look at /// all projects to find organizations. /// </summary> /// <param name="organizationField"></param> /// <param name="projectIdField"></param> void LoadReuseOrganizationField(PopupField <string> organizationField, PopupField <string> projectIdField = null) { ServicesConfiguration.instance.RequestCurrentUserApiUrl(currentUserApiUrl => { var getOrganizationsRequest = new UnityWebRequest(currentUserApiUrl + "?include=orgs,projects", UnityWebRequest.kHttpVerbGET) { downloadHandler = new DownloadHandlerBuffer() }; getOrganizationsRequest.suppressErrorsToConsole = true; getOrganizationsRequest.SetRequestHeader("AUTHORIZATION", $"Bearer {UnityConnect.instance.GetUserInfo().accessToken}"); var operation = getOrganizationsRequest.SendWebRequest(); operation.completed += op => { try { if (ServicesUtils.IsUnityWebRequestReadyForJsonExtract(getOrganizationsRequest)) { var jsonParser = new JSONParser(getOrganizationsRequest.downloadHandler.text); var json = jsonParser.Parse(); try { m_OrgIdByName.Clear(); var sortedOrganizationNames = new List <string>(); foreach (var rawOrg in json.AsDict()[k_JsonOrgsNodeName].AsList()) { var org = rawOrg.AsDict(); if (k_AnyRoleFilter.Contains(org[k_JsonRoleNodeName].AsString())) { sortedOrganizationNames.Add(org[k_JsonNameNodeName].AsString()); m_OrgIdByName.Add(org[k_JsonNameNodeName].AsString(), org[k_JsonIdNodeName].AsString()); } } foreach (var rawProject in json.AsDict()[k_JsonProjectsNodeName].AsList()) { var project = rawProject.AsDict(); if (!project[k_JsonArchivedNodeName].AsBool() && !sortedOrganizationNames.Contains(project[k_JsonOrgNameNodeName].AsString())) { sortedOrganizationNames.Add(project[k_JsonOrgNameNodeName].AsString()); m_OrgIdByName.Add(project[k_JsonOrgNameNodeName].AsString(), project[k_JsonOrgIdNodeName].AsString()); } } sortedOrganizationNames.Sort(); var popUpChoices = new List <string> { L10n.Tr(k_SelectOrganizationText) }; organizationField.SetEnabled(true); popUpChoices.AddRange(sortedOrganizationNames); organizationField.choices = popUpChoices; organizationField.SetValueWithoutNotify(organizationField.choices[0]); if (projectIdField != null) { projectIdField.choices = new List <string> { L10n.Tr(k_SelectProjectText) }; projectIdField.SetValueWithoutNotify(L10n.Tr(k_SelectProjectText)); projectIdField.SetEnabled(false); } } catch (Exception ex) { if (exceptionCallback != null) { exceptionCallback.Invoke(ex); } else { //If there is no exception callback, we have to at least log it Debug.LogException(ex); } } } else { var ex = new UnityConnectWebRequestException(L10n.Tr(k_CouldNotObtainOrganizationsMessage)) { error = getOrganizationsRequest.error, method = getOrganizationsRequest.method, timeout = getOrganizationsRequest.timeout, url = getOrganizationsRequest.url, responseHeaders = getOrganizationsRequest.GetResponseHeaders(), responseCode = getOrganizationsRequest.responseCode, isHttpError = (getOrganizationsRequest.result == UnityWebRequest.Result.ProtocolError), isNetworkError = (getOrganizationsRequest.result == UnityWebRequest.Result.ConnectionError), }; if (exceptionCallback != null) { exceptionCallback.Invoke(ex); } else { //If there is no exception callback, we have to at least log it Debug.LogException(ex); } } } finally { getOrganizationsRequest.Dispose(); } }; }); }
void LoadProjectField(string organizationName, PopupField <string> projectIdField) { ServicesConfiguration.instance.RequestOrganizationProjectsApiUrl(m_OrgIdByName[organizationName], organizationProjectsApiUrl => { var getProjectsRequest = new UnityWebRequest(organizationProjectsApiUrl, UnityWebRequest.kHttpVerbGET) { downloadHandler = new DownloadHandlerBuffer() }; getProjectsRequest.suppressErrorsToConsole = true; getProjectsRequest.SetRequestHeader("AUTHORIZATION", $"Bearer {UnityConnect.instance.GetUserInfo().accessToken}"); var operation = getProjectsRequest.SendWebRequest(); operation.completed += op => { try { if (ServicesUtils.IsUnityWebRequestReadyForJsonExtract(getProjectsRequest)) { var jsonParser = new JSONParser(getProjectsRequest.downloadHandler.text); var json = jsonParser.Parse(); try { m_ProjectInfoByName = new Dictionary <string, ProjectInfoData>(); var jsonProjects = json.AsDict()[k_JsonProjectsNodeName].AsList(); foreach (var jsonProject in jsonProjects) { if (!jsonProject.AsDict()[k_JsonArchivedNodeName].AsBool()) { var projectInfo = ExtractProjectInfoFromJson(jsonProject); m_ProjectInfoByName.Add(projectInfo.name, projectInfo); } } var projectNames = new List <string> { L10n.Tr(k_SelectProjectText) }; var sortedProjectNames = new List <string>(m_ProjectInfoByName.Keys); sortedProjectNames.Sort(); projectNames.AddRange(sortedProjectNames); projectIdField.choices = projectNames; projectIdField.SetEnabled(true); } catch (Exception ex) { if (exceptionCallback != null) { exceptionCallback.Invoke(ex); } else { //If there is no exception callback, we have to at least log it Debug.LogException(ex); } } } else { var ex = new UnityConnectWebRequestException(L10n.Tr(k_CouldNotObtainProjectMessage)) { error = getProjectsRequest.error, method = getProjectsRequest.method, timeout = getProjectsRequest.timeout, url = getProjectsRequest.url, responseHeaders = getProjectsRequest.GetResponseHeaders(), responseCode = getProjectsRequest.responseCode, isHttpError = (getProjectsRequest.result == UnityWebRequest.Result.ProtocolError), isNetworkError = (getProjectsRequest.result == UnityWebRequest.Result.ConnectionError), }; if (exceptionCallback != null) { exceptionCallback.Invoke(ex); } else { //If there is no exception callback, we have to at least log it Debug.LogException(ex); } } } finally { getProjectsRequest.Dispose(); } }; }); }
void CreateOperationOnCompleted(AsyncOperation obj) { if (m_CurrentRequest == null) { //If we lost our m_CurrentRequest request reference, we can't risk doing anything. return; } if (ServicesUtils.IsUnityWebRequestReadyForJsonExtract(m_CurrentRequest)) { var jsonParser = new JSONParser(m_CurrentRequest.downloadHandler.text); var json = jsonParser.Parse(); var abort = false; try { var projectInfo = ExtractProjectInfoFromJson(json); try { ServicesRepository.DisableAllServices(shouldUpdateApiFlag: false); //Only register before creation. Remove first in case it was already added. //TODO: Review to avoid dependency on project refreshed UnityConnect.instance.ProjectStateChanged -= OnProjectStateChangedAfterCreation; UnityConnect.instance.ProjectStateChanged += OnProjectStateChangedAfterCreation; BindProject(projectInfo); } catch (Exception ex) { if (exceptionCallback != null) { exceptionCallback.Invoke(ex); abort = true; } else { //If there is no exception callback, we have to at least log it Debug.LogException(ex); } } if (!abort) { createButtonCallback?.Invoke(projectInfo); } } finally { m_CurrentRequest?.Dispose(); m_CurrentRequest = null; } } else if (m_CurrentRequest.responseCode == k_HttpStatusCodeUnprocessableEntity) { m_CurrentRequest?.Dispose(); m_CurrentRequest = null; m_CreateIteration++; RequestCreateOperation(); } else { try { var ex = new UnityConnectWebRequestException(L10n.Tr(k_CouldNotCreateProjectMessage)) { error = m_CurrentRequest.error, method = m_CurrentRequest.method, timeout = m_CurrentRequest.timeout, url = m_CurrentRequest.url, responseHeaders = m_CurrentRequest.GetResponseHeaders(), responseCode = m_CurrentRequest.responseCode, isHttpError = (m_CurrentRequest.result == UnityWebRequest.Result.ProtocolError), isNetworkError = (m_CurrentRequest.result == UnityWebRequest.Result.ConnectionError), }; if (exceptionCallback != null) { exceptionCallback.Invoke(ex); } else { //If there is no exception callback, we have to at least log it Debug.LogException(ex); } } finally { m_CurrentRequest?.Dispose(); m_CurrentRequest = null; } } }
private void RequestServicesApiFlags(Action <Dictionary <string, bool> > callback) { if (m_ServiceRequest != null) { m_ServiceRequest?.Abort(); m_ServiceRequest?.Dispose(); m_ServiceRequest = null; } ServicesConfiguration.instance.RequestCurrentProjectApiUrl(currentProjectApiUrl => { m_ServiceRequest = new UnityWebRequest(currentProjectApiUrl, UnityWebRequest.kHttpVerbGET) { downloadHandler = new DownloadHandlerBuffer() }; m_ServiceRequest.SetRequestHeader("AUTHORIZATION", $"Bearer {UnityConnect.instance.GetUserInfo().accessToken}"); m_ServiceRequest.SendWebRequest().completed += op => { if (op.isDone) { Dictionary <string, bool> serviceFlags = null; if (ServicesUtils.IsUnityWebRequestReadyForJsonExtract(m_ServiceRequest)) { if (m_ServiceRequest.downloadHandler.text.Length != 0) { var jsonParser = new JSONParser(m_ServiceRequest.downloadHandler.text); try { var json = jsonParser.Parse(); serviceFlags = new Dictionary <string, bool>(); Dictionary <string, JSONValue> jsonFlags = null; if (json.AsDict().ContainsKey(k_serviceFlagsKey)) { jsonFlags = json.AsDict()[k_serviceFlagsKey].AsDict(); } if (jsonFlags != null) { foreach (var key in jsonFlags.Keys) { serviceFlags.Add(key, jsonFlags[key].AsBool()); } } } catch (Exception ex) { Debug.LogException(ex); NotificationManager.instance.Publish(Notification.Topic.AdsService, Notification.Severity.Error, ex.Message); } } } m_ServiceRequest?.Abort(); m_ServiceRequest?.Dispose(); m_ServiceRequest = null; callback?.Invoke(serviceFlags); } }; }); }
void Update() { if (m_Timer.DoTick()) { var getCurrentBuildTargetStatusRequest = new UnityWebRequest(m_PollingUrl, UnityWebRequest.kHttpVerbGET) { downloadHandler = new DownloadHandlerBuffer() }; getCurrentBuildTargetStatusRequest.suppressErrorsToConsole = true; getCurrentBuildTargetStatusRequest.SetRequestHeader("AUTHORIZATION", $"Bearer {UnityConnect.instance.GetUserInfo().accessToken}"); var operation = getCurrentBuildTargetStatusRequest.SendWebRequest(); operation.completed += asyncOperation => { try { if (ServicesUtils.IsUnityWebRequestReadyForJsonExtract(getCurrentBuildTargetStatusRequest)) { try { var jsonParser = new JSONParser(getCurrentBuildTargetStatusRequest.downloadHandler.text); var json = jsonParser.Parse(); var buildList = json.AsList(); var trackedBuilds = new List <string>(m_BuildsToReportOn); if (buildList.Count > 0) { foreach (var rawBuild in buildList) { var build = rawBuild.AsDict(); var buildNumber = build[k_JsonNodeNameBuild].AsFloat().ToString(); var buildId = build[k_JsonNodeNameBuildTargetId].AsString() + "_" + buildNumber; var buildStatus = build[k_JsonNodeNameBuildStatus].AsString().ToLower(); if (trackedBuilds.Contains(buildId)) { trackedBuilds.Remove(buildId); } if (m_BuildsToReportOn.Contains(buildId) && (k_BuildStatusCanceled.Equals(buildStatus) || k_BuildStatusFailure.Equals(buildStatus) || k_BuildStatusSuccess.Equals(buildStatus) || k_BuildStatusUnknown.Equals(buildStatus) ) ) { if (!k_BuildStatusStarted.Equals(buildStatus) && !k_BuildStatusUnknown.Equals(buildStatus)) { m_BuildsToReportOn.Remove(buildId); } var buildTargetName = build[k_JsonNodeNameBuildTargetName].AsString(); var severity = Notification.Severity.Info; var message = string.Empty; switch (buildStatus) { case k_BuildStatusCanceled: severity = Notification.Severity.Warning; message = string.Format(L10n.Tr(k_BuildFinishedWithStatusMsg), buildNumber, buildTargetName, k_BuildStatusCanceled); Debug.LogWarning(message); break; case k_BuildStatusFailure: severity = Notification.Severity.Error; message = string.Format(L10n.Tr(k_BuildFinishedWithStatusMsg), buildNumber, buildTargetName, k_BuildStatusFailure); Debug.LogError(message); break; case k_BuildStatusStarted: message = string.Format(L10n.Tr(k_BuildFinishedWithStatusMsg), buildNumber, buildTargetName, k_BuildStatusStartedMessage); Debug.Log(message); break; case k_BuildStatusSuccess: message = string.Format(L10n.Tr(k_BuildFinishedWithStatusMsg), buildNumber, buildTargetName, k_BuildStatusSuccess); Debug.Log(message); break; case k_BuildStatusUnknown: message = string.Format(L10n.Tr(k_BuildFinishedWithStatusMsg), buildNumber, buildTargetName, k_BuildStatusUnknown); Debug.LogWarning(message); break; } NotificationManager.instance.Publish(Notification.Topic.BuildService, severity, message); } else if (!m_BuildsToReportOn.Contains(buildId) && (k_BuildStatusQueued.Equals(buildStatus) || k_BuildStatusStarted.Equals(buildStatus) || k_BuildStatusSentToBuilder.Equals(buildStatus) || k_BuildStatusSentRestarted.Equals(buildStatus) ) ) { if (k_BuildStatusSentRestarted.Equals(buildStatus)) { var buildTargetName = build[k_JsonNodeNameBuildTargetName].AsString(); var message = string.Format(L10n.Tr(k_BuildFinishedWithStatusMsg), buildNumber, buildTargetName, k_BuildStatusSentRestarted); Debug.Log(message); NotificationManager.instance.Publish(Notification.Topic.BuildService, Notification.Severity.Info, message); } m_BuildsToReportOn.Add(buildId); } } //If a build vanishes, we don't want to keep investigating it foreach (var missingTrackedBuild in trackedBuilds) { m_BuildsToReportOn.Remove(missingTrackedBuild); } } } catch (Exception ex) { NotificationManager.instance.Publish( Notification.Topic.BuildService, Notification.Severity.Error, L10n.Tr(k_MessageErrorForApiStatusData)); Debug.LogException(ex); } } } finally { getCurrentBuildTargetStatusRequest.Dispose(); } }; } }