Esempio n. 1
0
        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;
                }
            }
Esempio n. 3
0
        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();
            }
        }
Esempio n. 4
0
 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;
                }
            }
Esempio n. 9
0
        /// <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();
                    }
                };
            });
        }
Esempio n. 10
0
        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();
                    }
                };
            });
        }
Esempio n. 11
0
        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);
                    }
                };
            });
        }
Esempio n. 13
0
        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();
                    }
                };
            }
        }