예제 #1
0
        public static async Task <PermissionValue> GetUploadPermissions(Game game, long modId)
        {
            var client = new Lib.Http.Client();

            if (Utils.HaveEncryptedJson("nexus-cookies"))
            {
                var cookies = await Utils.FromEncryptedJson <Helpers.Cookie[]>("nexus-cookies");

                client.AddCookies(cookies);
            }

            var response = await client.GetHtmlAsync($"https://nexusmods.com/{game.MetaData().NexusName}/mods/{modId}");

            var hidden = response.DocumentNode
                         .Descendants()
                         .Any(n => n.Id == $"{modId}-title" && n.InnerText == "Hidden mod");

            if (hidden)
            {
                return(PermissionValue.Hidden);
            }

            var perm = response.DocumentNode
                       .Descendants()
                       .Where(d => d.HasClass("permissions-title") && d.InnerHtml == "Upload permission")
                       .SelectMany(d => d.ParentNode.ParentNode.GetClasses())
                       .FirstOrDefault(perm => perm.StartsWith("permission-"));

            var not_found = response.DocumentNode.Descendants()
                            .Where(d => d.Id == $"{modId}-title")
                            .Select(d => d.InnerText)
                            .FirstOrDefault() == "Not found";

            if (not_found)
            {
                return(PermissionValue.NotFound);
            }

            return(perm switch
            {
                "permission-no" => PermissionValue.No,
                "permission-maybe" => PermissionValue.Maybe,
                "permission-yes" => PermissionValue.Yes,
                _ => PermissionValue.No
            });
예제 #2
0
        public override async Task <int> Execute()
        {
            var client = new Lib.Http.Client();
            var json   = await client.GetStringAsync("https://bunnycdn.com/api/system/edgeserverlist");

            client.Headers.Add(("Host", "wabbajack.b-cdn.net"));
            using var queue = new WorkQueue();
            var mirrors = json.FromJsonString <string[]>();

            _logger.LogInformation($"Found {mirrors.Length} edge severs");

            var servers = (await mirrors
                           .PMap(queue, async ip =>
            {
                try
                {
                    // We use a volume server, so this file will only exist on some (lower cost) servers
                    using var result = await client.GetAsync(
                              $"https://{ip}/WABBAJACK_TEST_FILE.zip_48f799f6-39b2-4229-a329-7459c9965c2d/definition.json.gz",
                              errorsAsExceptions: false, retry: false);
                    var data = await result.Content.ReadAsByteArrayAsync();
                    return(ip, use: result.IsSuccessStatusCode, size: data.Length);
                }
                catch (Exception)
                {
                    return(ip, use: false, size: 0);
                }
            }))
                          .Where(r => r.use && r.size == 267)
                          .Select(r => r.ip)
                          .ToArray();

            _logger.LogInformation($"Found {servers.Length} valid mirrors");
            Mirrors    = servers;
            LastUpdate = DateTime.UtcNow;
            return(Mirrors.Length);
        }