Ejemplo n.º 1
0
        /// <summary>Get metadata about a mod in the repository.</summary>
        /// <param name="id">The mod ID in this repository.</param>
        public override async Task <ModInfoModel> GetModInfoAsync(string id)
        {
            // validate ID format
            if (!uint.TryParse(id, out uint nexusID))
            {
                return(new ModInfoModel().SetError(RemoteModStatus.DoesNotExist, $"The value '{id}' isn't a valid Nexus mod ID, must be an integer ID."));
            }

            // fetch info
            try
            {
                NexusMod mod = await this.Client.GetModAsync(nexusID);

                if (mod == null)
                {
                    return(new ModInfoModel().SetError(RemoteModStatus.DoesNotExist, "Found no Nexus mod with this ID."));
                }
                if (mod.Error != null)
                {
                    RemoteModStatus remoteStatus = mod.Status == NexusModStatus.Hidden || mod.Status == NexusModStatus.NotPublished
                        ? RemoteModStatus.DoesNotExist
                        : RemoteModStatus.TemporaryError;
                    return(new ModInfoModel().SetError(remoteStatus, mod.Error));
                }

                return(new ModInfoModel(name: mod.Name, version: this.NormalizeVersion(mod.Version), previewVersion: mod.LatestFileVersion?.ToString(), url: mod.Url));
            }
            catch (Exception ex)
            {
                return(new ModInfoModel().SetError(RemoteModStatus.TemporaryError, ex.ToString()));
            }
        }
Ejemplo n.º 2
0
        /// <summary>Get metadata about a mod in the repository.</summary>
        /// <param name="id">The mod ID in this repository.</param>
        public override async Task <ModInfoModel> GetModInfoAsync(string id)
        {
            // validate ID format
            if (!uint.TryParse(id, out uint nexusID))
            {
                return(new ModInfoModel($"The value '{id}' isn't a valid Nexus mod ID, must be an integer ID."));
            }

            // fetch info
            try
            {
                NexusMod mod = await this.Client.GetModAsync(nexusID);

                if (mod == null)
                {
                    return(new ModInfoModel("Found no mod with this ID."));
                }
                if (mod.Error != null)
                {
                    return(new ModInfoModel(mod.Error));
                }
                return(new ModInfoModel(mod.Name, this.NormaliseVersion(mod.Version), mod.Url));
            }
            catch (Exception ex)
            {
                return(new ModInfoModel(ex.ToString()));
            }
        }
Ejemplo n.º 3
0
        public string GetNexusDownloadLink(NexusMod archive, bool cache = false)
        {
            if (cache && TryGetCachedLink(archive, out var result))
            {
                return(result);
            }

            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

            var url = $"https://api.nexusmods.com/v1/games/{ConvertGameName(archive.GameName)}/mods/{archive.ModID}/files/{archive.FileID}/download_link.json";

            return(Get <List <DownloadLink> >(url).First().URI);
        }
Ejemplo n.º 4
0
        public EndorsementResponse EndorseMod(NexusMod mod)
        {
            Utils.Status($"Endorsing ${mod.GameName} - ${mod.ModID}");
            var url = $"https://api.nexusmods.com/v1/games/{ConvertGameName(mod.GameName)}/mods/{mod.ModID}/endorse.json";

            var content = new FormUrlEncodedContent(new Dictionary <string, string> {
                { "version", mod.Version }
            });

            using (var stream = _httpClient.PostStreamSync(url, content))
            {
                return(stream.FromJSON <EndorsementResponse>());
            }
        }
Ejemplo n.º 5
0
        private bool TryGetCachedLink(NexusMod archive, out string result)
        {
            if (!Directory.Exists(Consts.NexusCacheDirectory))
            {
                Directory.CreateDirectory(Consts.NexusCacheDirectory);
            }

            var path = Path.Combine(Consts.NexusCacheDirectory, $"link-{archive.GameName}-{archive.ModID}-{archive.FileID}.txt");

            if (!File.Exists(path) || (DateTime.Now - new FileInfo(path).LastWriteTime).TotalHours > 24)
            {
                File.Delete(path);
                result = GetNexusDownloadLink(archive);
                File.WriteAllText(path, result);
                return(true);
            }

            result = File.ReadAllText(path);
            return(true);
        }
Ejemplo n.º 6
0
        public ModInfo GetModInfo(NexusMod archive)
        {
            if (!Directory.Exists(Consts.NexusCacheDirectory))
            {
                Directory.CreateDirectory(Consts.NexusCacheDirectory);
            }

            ModInfo result = null;

TOP:
            var path = Path.Combine(Consts.NexusCacheDirectory, $"mod-info-{archive.GameName}-{archive.ModID}.json");

            try
            {
                if (File.Exists(path))
                {
                    result = path.FromJSON <ModInfo>();
                    if (result._internal_version != CACHED_VERSION_NUMBER)
                    {
                        File.Delete(path);
                        goto TOP;
                    }

                    return(result);
                }
            }
            catch (Exception)
            {
                File.Delete(path);
            }

            var url = $"https://api.nexusmods.com/v1/games/{ConvertGameName(archive.GameName)}/mods/{archive.ModID}.json";

            result = Get <ModInfo>(url);

            result.game_name         = archive.GameName;
            result.mod_id            = archive.ModID;
            result._internal_version = CACHED_VERSION_NUMBER;
            result.ToJSON(path);
            return(result);
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Initializes the NXMWorker pipe listener.
        /// </summary>
        private void InitializeDownloadHandle()
        {
            if (NoMissingMods)
            {
                return;
            }

            var nexusProtocol = new NexusProtocol();

            // Start capturing piped messages from the NXMWorker, handle any progress reports.
            nexusProtocol.StartRecievingProtocolValues(new Progress <CaptureProtocolValuesProgress>(async x =>
            {
                var matchingMods = MissingMods.Where(y => y.NexusModId == x.ModId);

                if (!matchingMods.Any())
                {
                    return;
                }

                var matchingMod = matchingMods.First();

                if (matchingMod != null)
                {
                    WindowNotificationControls.MoveToFront();

                    // Start downloading the mod file.
                    await NexusMod.DownloadModFile(matchingMod, x.FileId, new Progress <DownloadModFileProgress>(downloadProgress =>
                    {
                        MissingMods[MissingMods.IndexOf(matchingMod)].CurrentDownloadPercentage = downloadProgress.CurrentDownloadPercentage;

                        if (downloadProgress.IsDownloadComplete)
                        {
                            Modpack.UpdateModArchivePaths(matchingMod, downloadProgress.DownloadLocation);
                            MissingMods.Remove(matchingMod);

                            NoMissingMods = MissingMods.Count == 0;
                        }
                    }));
                }
            }));
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Takes all the permissions for a given Nexus mods and merges them down to a single permissions record
        /// the more specific record having precedence in each field.
        /// </summary>
        /// <param name="mod"></param>
        /// <returns></returns>
        public Permissions FilePermissions(NexusMod mod)
        {
            var author_permissions = AuthorPermissions.GetOrDefault(mod.Author)?.Permissions;
            var game_permissions   = AuthorPermissions.GetOrDefault(mod.Author)?.Games.GetOrDefault(mod.GameName)?.Permissions;
            var mod_permissions    = AuthorPermissions.GetOrDefault(mod.Author)?.Games.GetOrDefault(mod.GameName)?.Mods.GetOrDefault(mod.ModID)
                                     ?.Permissions;
            var file_permissions = AuthorPermissions.GetOrDefault(mod.Author)?.Games.GetOrDefault(mod.GameName)?.Mods
                                   .GetOrDefault(mod.ModID)?.Files.GetOrDefault(mod.FileID)?.Permissions;

            return(new Permissions
            {
                CanExtractBSAs = file_permissions?.CanExtractBSAs ?? mod_permissions?.CanExtractBSAs ??
                                 game_permissions?.CanExtractBSAs ?? author_permissions?.CanExtractBSAs ?? true,
                CanModifyAssets = file_permissions?.CanModifyAssets ?? mod_permissions?.CanModifyAssets ??
                                  game_permissions?.CanModifyAssets ?? author_permissions?.CanModifyAssets ?? true,
                CanModifyESPs = file_permissions?.CanModifyESPs ?? mod_permissions?.CanModifyESPs ??
                                game_permissions?.CanModifyESPs ?? author_permissions?.CanModifyESPs ?? true,
                CanUseInOtherGames = file_permissions?.CanUseInOtherGames ?? mod_permissions?.CanUseInOtherGames ??
                                     game_permissions?.CanUseInOtherGames ?? author_permissions?.CanUseInOtherGames ?? true,
            });
        }
Ejemplo n.º 9
0
        public NexusFileInfo GetFileInfo(NexusMod mod)
        {
            var url = $"https://api.nexusmods.com/v1/games/{ConvertGameName(mod.GameName)}/mods/{mod.ModID}/files/{mod.FileID}.json";

            return(Get <NexusFileInfo>(url));
        }