示例#1
0
        public static async Task <List <ModlistMetadata> > LoadFromGithub()
        {
            var client = new Http.Client();

            Utils.Log("Loading ModLists from GitHub");
            var metadataResult = client.GetStringAsync(Consts.ModlistMetadataURL);
            var utilityResult  = client.GetStringAsync(Consts.UtilityModlistMetadataURL);
            var summaryResult  = client.GetStringAsync(Consts.ModlistSummaryURL);

            var metadata = (await metadataResult).FromJsonString <List <ModlistMetadata> >();

            metadata = metadata.Concat((await utilityResult).FromJsonString <List <ModlistMetadata> >()).ToList();
            try
            {
                var summaries = (await summaryResult).FromJsonString <List <ModListSummary> >().ToDictionary(d => d.MachineURL);

                foreach (var data in metadata)
                {
                    if (summaries.TryGetValue(data.Links.MachineURL, out var summary))
                    {
                        data.ValidationSummary = summary;
                    }
                }
            }
            catch (Exception)
            {
                // ignored
            }

            return(metadata.OrderBy(m => (m.ValidationSummary?.HasFailures ?? false ? 1 : 0, m.Title)).ToList());
        }
            private async Task <HttpResponseMessage> GetWithMirroredRetry(Http.Client client, string url)
            {
                int retries    = 0;
                var downloader = DownloadDispatcher.GetInstance <WabbajackCDNDownloader>();

                if (downloader.Mirrors != null)
                {
                    url = ReplaceHost(downloader.Mirrors, url);
                }

TOP:

                try
                {
                    return(await client.GetAsync(url, retry : false));
                }
                catch (Exception ex)
                {
                    if (retries > 5)
                    {
                        Utils.Log($"Tried to read from {retries} CDN servers, giving up");
                        throw;
                    }
                    Utils.Log($"Error reading {url} retying with a mirror");
                    Utils.Log(ex.ToString());
                    downloader.Mirrors ??= await ClientAPI.GetCDNMirrorList();

                    url      = ReplaceHost(downloader.Mirrors, url);
                    retries += 1;
                    Interlocked.Increment(ref downloader.TotalRetries);
                    goto TOP;
                }
            }
示例#3
0
 public static async Task <List <ModlistMetadata> > LoadUnlistedFromGithub()
 {
     try
     {
         var client = new Http.Client();
         return((await client.GetStringAsync(Consts.UnlistedModlistMetadataURL)).FromJsonString <List <ModlistMetadata> >());
     }
     catch (Exception)
     {
         Utils.LogStatus("Error loading unlisted modlists");
         return(new List <ModlistMetadata>());
     }
 }
示例#4
0
        /// <summary>
        /// This is all we track for metrics, action, and value. The action will be like
        /// "downloaded", the value "Joe's list".
        /// </summary>
        /// <param name="action"></param>
        /// <param name="value"></param>
        public static async Task Send(string action, string value)
        {
            if (BuildServerStatus.IsBuildServerDown)
            {
                return;
            }

            var key = await GetMetricsKey();

            Utils.Log($"File hash check (-42) {key}");
            var client = new Http.Client();

            client.Headers.Add((Consts.MetricsKeyHeader, key));
            await client.GetAsync($"{Consts.WabbajackBuildServerUri}metrics/{action}/{value}");
        }
示例#5
0
        private static bool CheckBuildServer()
        {
            var client = new Http.Client();

            try
            {
                var result = client.GetAsync($"{Consts.WabbajackBuildServerUri}heartbeat").Result;
                _isBuildServerDown = result.StatusCode != HttpStatusCode.OK && result.StatusCode != HttpStatusCode.InternalServerError;
            }
            catch (Exception)
            {
                _isBuildServerDown = true;
            }
            finally
            {
                _didCheck = true;
            }

            Utils.Log($"Build server is {(_isBuildServerDown ? "down" : "alive")}");
            return(_isBuildServerDown);
        }
示例#6
0
        public async Task <bool> Refresh(string siteName = "")
        {
            if (ExpiresAt > DateTime.UtcNow + TimeSpan.FromHours(6))
            {
                return(true);
            }

            var client   = new Http.Client();
            var formData = new KeyValuePair <string?, string?>[]
            {
                new ("grant_type", "refresh_token"),
                new ("refresh_token", RefreshToken),
                new ("client_id", ClientID)
            };

            try
            {
                using var response = await client.PostAsync(TokenEndpoint !.ToString(),
                                                            new FormUrlEncodedContent (formData.ToList()));

                var responseData = (await response.Content.ReadAsStringAsync()).FromJsonString <OAuthResultState>();

                AccessToken = responseData.AccessToken;
                ExpiresIn   = responseData.ExpiresIn;
                ExpiresAt   = DateTime.UtcNow + TimeSpan.FromSeconds(ExpiresIn);

                return(true);
            }
            catch (HttpException ex)
            {
                if (ex.Code == 400)
                {
                    Utils.ErrorThrow(new CriticalFailureIntervention(
                                         $"You have been logged out of {siteName} for reasons out of our control, please re-login via the settings panel.",
                                         $"Bad Request: Logged Out - {siteName}"));
                }
            }

            return(true);
        }
示例#7
0
            private async Task <HTTPDownloader.State?> Resolve(CancellationToken?token = null)
            {
                var client = new Http.Client();
                var result = await client.GetAsync(Url, HttpCompletionOption.ResponseHeadersRead, token : token);

                if (!result.IsSuccessStatusCode)
                {
                    return(null);
                }

                if (result.Content.Headers.ContentType !.MediaType !.StartsWith("text/html",
                                                                                StringComparison.OrdinalIgnoreCase))
                {
                    var body = await client.GetHtmlAsync(Url);

                    var node = body.DocumentNode.DescendantsAndSelf().First(d => d.HasClass("input") && d.HasClass("popsok") &&
                                                                            d.GetAttributeValue("aria-label", "") == "Download file");
                    return(new HTTPDownloader.State(node.GetAttributeValue("href", "not-found")));
                }

                return(new HTTPDownloader.State(Url));
            }
示例#8
0
        public static async Task <List <ModlistMetadata> > LoadFromGithub()
        {
            var client = new Http.Client();

            Utils.Log("Loading ModLists from GitHub");
            var metadataResult = client.GetStringAsync(Consts.ModlistMetadataURL);
            var utilityResult  = client.GetStringAsync(Consts.UtilityModlistMetadataURL);
            var summaryResult  = client.GetStringAsync(Consts.ModlistSummaryURL);

            var metadata = (await metadataResult).FromJsonString <List <ModlistMetadata> >();

            metadata = metadata.Concat((await utilityResult).FromJsonString <List <ModlistMetadata> >()).ToList();
            try
            {
                var summaries = (await summaryResult).FromJsonString <List <ModListSummary> >().ToDictionary(d => d.MachineURL);

                foreach (var data in metadata)
                {
                    if (summaries.TryGetValue(data.Links.MachineURL, out var summary))
                    {
                        data.ValidationSummary = summary;
                    }
                }
            }
            catch (Exception)
            {
                // ignored
            }

            var random = new Random();

            return(metadata
                   // Sort randomly initially, just to give each list a fair shake
                   .Shuffle(random)
                   // Put broken lists at bottom
                   .OrderBy(m => (m.ValidationSummary?.HasFailures ?? false ? 1 : 0))
                   .ToList());
        }
示例#9
0
            private async Task <HttpResponseMessage> GetWithCDNRetry(Http.Client client, string url, CancellationToken?token = null)
            {
                int retries = 0;

TOP:

                try
                {
                    return(await client.GetAsync(url, retry : false, token : token));
                }
                catch (Exception ex)
                {
                    if (retries > 2)
                    {
                        Utils.Log($"Trying CDN...");
                        var remap = url.Replace(new Uri(url).Host, DomainRemaps.FirstOrDefault(x => x.Value == new Uri(url).Host).Key);
                        return(await client.GetAsync(remap, retry : false, token : token));
                    }
                    retries += 1;
                    Utils.Log($"Error reading {url} retrying [{retries}]");
                    Utils.Log(ex.ToString());
                    goto TOP;
                }
            }
示例#10
0
 public Page(Http.Client client) : base(client)
 {
 }