예제 #1
0
        /// <summary>
        /// import as an asynchronous operation.
        /// </summary>
        /// <param name="parameters">The parameters.</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        public async Task <bool> ImportAsync(ModCollectionExporterParams parameters)
        {
            var path = Path.Combine(Path.GetDirectoryName(parameters.ModDirectory), Constants.DLC_load_path);

            if (File.Exists(path))
            {
                var content = await File.ReadAllTextAsync(path);

                if (!string.IsNullOrWhiteSpace(content))
                {
                    try
                    {
                        var model = JsonConvert.DeserializeObject <DLCLoad>(content);
                        if (model.EnabledMods?.Count > 0)
                        {
                            parameters.Mod.Name = CollectionName;
                            parameters.Mod.Mods = model.EnabledMods;
                            return(true);
                        }
                    }
                    catch (Exception ex)
                    {
                        logger.Error(ex);
                    }
                }
            }
            return(false);
        }
예제 #2
0
        /// <summary>
        /// Database importv3 as an asynchronous operation.
        /// </summary>
        /// <param name="parameters">The parameters.</param>
        /// <returns>A Task&lt;ICollectionImportResult&gt; representing the asynchronous operation.</returns>
        protected virtual async Task <ICollectionImportResult> DatabaseImportv3Async(ModCollectionExporterParams parameters)
        {
            try
            {
                using var con = GetConnection(parameters);
                var activeCollection = (await con.QueryAsync <Models.Paradox.v4.Playsets>(p => p.IsActive == true, trace: trace)).FirstOrDefault();
                if (activeCollection != null)
                {
                    var collectionMods = await con.QueryAsync <Models.Paradox.v4.PlaysetsMods>(p => p.PlaysetId == activeCollection.Id.ToString(), trace : trace);

                    if (collectionMods?.Count() > 0)
                    {
                        var mods = await con.QueryAllAsync <Models.Paradox.v4.Mods>(trace : trace);

                        var ordered   = collectionMods.Where(p => p.Enabled).OrderBy(p => p.Position).ToList();
                        var validMods = mods.Where(p => ordered.Any(m => m.ModId.Equals(p.Id))).OrderBy(p => ordered.FindIndex(o => o.ModId == p.Id));
                        if (validMods.Any())
                        {
                            var result = DIResolver.Get <ICollectionImportResult>();
                            result.Name        = activeCollection.Name;
                            result.Descriptors = validMods.Select(p => p.GameRegistryId).ToList();
                            result.ModNames    = validMods.Select(p => p.DisplayName).ToList();
                            return(result);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Error(ex);
            }
            return(null);
        }
        /// <summary>
        /// import mods as an asynchronous operation.
        /// </summary>
        /// <param name="importType">Type of the import.</param>
        /// <param name="file">The file.</param>
        /// <returns>IModCollection.</returns>
        protected virtual async Task <IModCollection> ImportModsAsync(ImportType importType, string file = Shared.Constants.EmptyParam)
        {
            async Task <IModCollection> performImport(IGame game)
            {
                var instance   = Create();
                var parameters = new ModCollectionExporterParams()
                {
                    ModDirectory = Path.Combine(game.UserDirectory, Shared.Constants.ModDirectory),
                    File         = file,
                    Mod          = instance
                };
                ICollectionImportResult result = null;

                switch (importType)
                {
                case ImportType.Paradox:
                    result = await modCollectionExporter.ImportParadoxAsync(parameters);

                    break;

                case ImportType.ParadoxLauncher:
                    result = await modCollectionExporter.ImportParadoxLauncherAsync(parameters);

                    break;

                case ImportType.Paradoxos:
                    result = await modCollectionExporter.ImportParadoxosAsync(parameters);

                    break;

                case ImportType.ParadoxLauncherBeta:
                    result = await modCollectionExporter.ImportParadoxLauncherBetaAsync(parameters);

                    break;

                case ImportType.ParadoxLauncherJson:
                    result = await modCollectionExporter.ImportParadoxLauncherJsonAsync(parameters);

                    break;

                default:
                    break;
                }
                if (result != null)
                {
                    // Order of operations is very important here
                    MapImportResult(instance, result);
                    return(instance);
                }
                return(null);
            }

            var game = GameService.GetSelected();

            if (game == null)
            {
                return(null);
            }
            return(await performImport(game));
        }
예제 #4
0
        /// <summary>
        /// Exports the asynchronous.
        /// </summary>
        /// <param name="file">The file.</param>
        /// <param name="modCollection">The mod collection.</param>
        /// <param name="exportOrderOnly">if set to <c>true</c> [export order only].</param>
        /// <param name="exportMods">if set to <c>true</c> [export mods].</param>
        /// <returns>Task&lt;System.Boolean&gt;.</returns>
        public virtual Task <bool> ExportAsync(string file, IModCollection modCollection, bool exportOrderOnly = false, bool exportMods = false)
        {
            var game = GameService.GetSelected();

            if (game == null || modCollection == null)
            {
                return(Task.FromResult(false));
            }
            var collection = Mapper.Map <IModCollection>(modCollection);

            if (string.IsNullOrWhiteSpace(collection.MergedFolderName) && exportMods)
            {
                collection.MergedFolderName = collection.Name.GenerateValidFileName();
            }
            var path       = GetPatchModDirectory(game, modCollection);
            var parameters = new ModCollectionExporterParams()
            {
                File               = file,
                Mod                = collection,
                ModDirectory       = path,
                ExportModOrderOnly = exportOrderOnly
            };

            if (exportMods)
            {
                parameters.ExportMods = GetCollectionMods(collectionName: modCollection.Name);
            }
            return(modCollectionExporter.ExportAsync(parameters));
        }
예제 #5
0
        /// <summary>
        /// import as an asynchronous operation.
        /// </summary>
        /// <param name="parameters">The parameters.</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        public async Task <bool> ImportAsync(ModCollectionExporterParams parameters)
        {
            try
            {
                using var con = GetConnection(parameters);
                var activeCollection = (await con.QueryAsync <Playsets>(p => p.IsActive == true, trace: trace)).FirstOrDefault();
                if (activeCollection != null)
                {
                    var collectionMods = await con.QueryAsync <PlaysetsMods>(p => p.PlaysetId == activeCollection.Id.ToString(), trace : trace);

                    if (collectionMods?.Count() > 0)
                    {
                        var mods = await con.QueryAllAsync <Models.Paradox.v2.Mods>(trace : trace);

                        var ordered   = collectionMods.Where(p => p.Enabled).OrderBy(p => p.Position).ToList();
                        var validMods = mods.Where(p => ordered.Any(m => m.ModId.Equals(p.Id))).OrderBy(p => ordered.FindIndex(o => o.ModId == p.Id));
                        if (validMods.Count() > 0)
                        {
                            parameters.Mod.Name = activeCollection.Name;
                            parameters.Mod.Mods = validMods.Select(p => p.GameRegistryId).ToList();
                            return(true);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Error(ex);
            }
            return(false);
        }
예제 #6
0
        /// <summary>
        /// Imports the asynchronous.
        /// </summary>
        /// <param name="parameters">The parameters.</param>
        /// <returns>Task&lt;System.Boolean&gt;.</returns>
        public Task <ICollectionImportResult> ImportAsync(ModCollectionExporterParams parameters)
        {
            var importResult = ImportInternal(parameters, true, out var result);

            if (importResult)
            {
                return(Task.FromResult(result));
            }
            return(Task.FromResult((ICollectionImportResult)null));
        }
예제 #7
0
 /// <summary>
 /// database import as an asynchronous operation.
 /// </summary>
 /// <param name="parameters">The parameters.</param>
 /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
 public async Task <ICollectionImportResult> DatabaseImportAsync(ModCollectionExporterParams parameters)
 {
     // Caching sucks in this ORM
     DbFieldCache.Flush();
     FieldCache.Flush();
     IdentityCache.Flush();
     PrimaryCache.Flush();
     if (await IsV4Async(parameters))
     {
         return(await DatabaseImportv3Async(parameters));
     }
     return(await DatabaseImportv2Async(parameters));
 }
예제 #8
0
        /// <summary>
        /// Is v4 as an asynchronous operation.
        /// </summary>
        /// <param name="parameters">The parameters.</param>
        /// <returns>A Task&lt;System.Boolean&gt; representing the asynchronous operation.</returns>
        private async Task <bool> IsV4Async(ModCollectionExporterParams parameters)
        {
            try
            {
                using var con = GetConnection(parameters);
                var changes = await con.QueryAllAsync <Models.Paradox.v2.KnoxMigrations>();

                return(changes != null && changes.Any(c => c.Name.Equals(Constants.SqlV4Id.Name, StringComparison.OrdinalIgnoreCase) && c.Id.Equals(Constants.SqlV4Id.Id)));
            }
            catch
            {
                return(false);
            }
        }
        /// <summary>
        /// Exports the asynchronous.
        /// </summary>
        /// <param name="parameters">The parameters.</param>
        /// <returns>Task&lt;System.Boolean&gt;.</returns>
        public Task <bool> ExportAsync(ModCollectionExporterParams parameters)
        {
            var content = JsonConvert.SerializeObject(parameters.Mod, Formatting.None);

            using var zip    = ArchiveFactory.Create(ArchiveType.Zip);
            using var stream = new MemoryStream(Encoding.UTF8.GetBytes(content));
            zip.AddEntry(Common.Constants.ExportedModContentId, stream, false);
            if (Directory.Exists(parameters.ModDirectory) && !parameters.ExportModOrderOnly)
            {
                zip.AddAllFromDirectory(parameters.ModDirectory);
            }
            zip.SaveTo(parameters.File, new SharpCompress.Writers.WriterOptions(CompressionType.Deflate));
            zip.Dispose();
            return(Task.FromResult(true));
        }
예제 #10
0
        /// <summary>
        /// Exports the asynchronous.
        /// </summary>
        /// <param name="parameters">The parameters.</param>
        /// <returns>Task&lt;System.Boolean&gt;.</returns>
        public async Task <bool> ExportAsync(ModCollectionExporterParams parameters)
        {
            var content = JsonConvert.SerializeObject(parameters.Mod, Formatting.None);

            using var zip    = ArchiveFactory.Create(ArchiveType.Zip);
            using var stream = new MemoryStream(Encoding.UTF8.GetBytes(content));
            zip.AddEntry(Common.Constants.ExportedModContentId, stream, false);
            var streams = new List <MemoryStream>();

            if (Directory.Exists(parameters.ModDirectory) && !parameters.ExportModOrderOnly)
            {
                if (!RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
                {
                    zip.AddAllFromDirectory(parameters.ModDirectory);
                }
                else
                {
                    // Yeah, osx sucks (ulimit bypass)
                    var files = Directory.GetFiles(parameters.ModDirectory, "*.*", SearchOption.AllDirectories);
                    foreach (var item in files)
                    {
                        var fs = new FileStream(item, FileMode.Open, FileAccess.Read, FileShare.Read);
                        var ms = new MemoryStream();
                        await fs.CopyToAsync(ms);

                        var file = item.Replace(parameters.ModDirectory, string.Empty).Trim('\\').Trim('/');
                        zip.AddEntry(file, ms, false, modified: new System.IO.FileInfo(item).LastWriteTime);
                        fs.Close();
                        await fs.DisposeAsync();

                        streams.Add(ms);
                    }
                }
            }
            zip.SaveTo(parameters.File, new SharpCompress.Writers.WriterOptions(CompressionType.Deflate));
            zip.Dispose();
            if (streams.Any())
            {
                var task = streams.Select(async p =>
                {
                    p.Close();
                    await p.DisposeAsync();
                });
                await Task.WhenAll(task);
            }
            return(true);
        }
        /// <summary>
        /// Exports the paradox launcher json asynchronous.
        /// </summary>
        /// <param name="file">The file.</param>
        /// <param name="modCollection">The mod collection.</param>
        /// <returns>Task&lt;System.Boolean&gt;.</returns>
        public virtual Task <bool> ExportParadoxLauncherJsonAsync(string file, IModCollection modCollection)
        {
            var game = GameService.GetSelected();

            if (game == null || modCollection == null)
            {
                return(Task.FromResult(false));
            }
            var collection = Mapper.Map <IModCollection>(modCollection);
            var parameters = new ModCollectionExporterParams()
            {
                File       = file,
                Mod        = collection,
                ExportMods = GetCollectionMods(collectionName: modCollection.Name),
                Game       = game
            };

            return(modCollectionExporter.ExportParadoxLauncherJsonAsync(parameters));
        }
        /// <summary>
        /// Export as an asynchronous operation.
        /// </summary>
        /// <param name="params">The parameters.</param>
        /// <returns>A Task&lt;System.Boolean&gt; representing the asynchronous operation.</returns>
        public async Task <bool> ExportAsync(ModCollectionExporterParams @params)
        {
            // Paradox launcher only exports pdx or steam mods, local mods are not exported
            var validMods = @params.ExportMods.Where(p => p.Source != ModSource.Local).ToList();
            var modInfo   = new ModInfo()
            {
                Game = @params.Game.ParadoxGameId,
                Name = @params.Mod.Name,
                Mods = validMods.Select(p => new Models.Paradox.Json.v3.Mods()
                {
                    DisplayName = p.Name,
                    Enabled     = true,
                    Position    = validMods.IndexOf(p),
                    SteamId     = p.Source == ModSource.Steam ? p.RemoteId.ToString() : null,
                    PdxId       = p.Source == ModSource.Paradox ? p.RemoteId.ToString() : null
                }).ToList()
            };
            var json = JsonDISerializer.Serialize(modInfo);
            await File.WriteAllTextAsync(@params.File, json);

            return(true);
        }
예제 #13
0
        /// <summary>
        /// Imports the mod directory asynchronous.
        /// </summary>
        /// <param name="parameters">The parameters.</param>
        /// <returns>Task&lt;System.Boolean&gt;.</returns>
        public Task <bool> ImportModDirectoryAsync(ModCollectionExporterParams parameters)
        {
            var result = ImportInternal(parameters, false, out _);

            return(Task.FromResult(result));
        }
        /// <summary>
        /// Imports the internal.
        /// </summary>
        /// <param name="parameters">The parameters.</param>
        /// <param name="importInstance">if set to <c>true</c> [import instance].</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        private bool ImportInternal(ModCollectionExporterParams parameters, bool importInstance)
        {
            if (!importInstance)
            {
                if (Directory.Exists(parameters.ModDirectory))
                {
                    Directory.Delete(parameters.ModDirectory, true);
                }
            }

            var result = false;

            void parseUsingReaderFactory()
            {
                using var fileStream = File.OpenRead(parameters.File);
                using var reader     = ReaderFactory.Open(fileStream);
                while (reader.MoveToNextEntry())
                {
                    if (!reader.Entry.IsDirectory)
                    {
                        var relativePath = reader.Entry.Key.StandardizeDirectorySeparator().Trim(Path.DirectorySeparatorChar);
                        if (reader.Entry.Key.Equals(Common.Constants.ExportedModContentId, StringComparison.OrdinalIgnoreCase))
                        {
                            if (importInstance)
                            {
                                using var entryStream  = reader.OpenEntryStream();
                                using var memoryStream = new MemoryStream();
                                entryStream.CopyTo(memoryStream);
                                memoryStream.Seek(0, SeekOrigin.Begin);
                                using var streamReader = new StreamReader(memoryStream, true);
                                var text = streamReader.ReadToEnd();
                                streamReader.Close();
                                JsonConvert.PopulateObject(text, parameters.Mod);
                                result = true;
                                break;
                            }
                        }
                        else
                        {
                            reader.WriteEntryToDirectory(parameters.ModDirectory, ZipExtractionOpts.GetExtractionOptions());
                        }
                    }
                }
            }

            void parseUsingArchiveFactory()
            {
                using var fileStream = File.OpenRead(parameters.File);
                using var reader     = ArchiveFactory.Open(fileStream);
                foreach (var entry in reader.Entries.Where(entry => !entry.IsDirectory))
                {
                    var relativePath = entry.Key.StandardizeDirectorySeparator().Trim(Path.DirectorySeparatorChar);
                    if (entry.Key.Equals(Common.Constants.ExportedModContentId, StringComparison.OrdinalIgnoreCase))
                    {
                        if (importInstance)
                        {
                            using var entryStream  = entry.OpenEntryStream();
                            using var memoryStream = new MemoryStream();
                            entryStream.CopyTo(memoryStream);
                            memoryStream.Seek(0, SeekOrigin.Begin);
                            using var streamReader = new StreamReader(memoryStream, true);
                            var text = streamReader.ReadToEnd();
                            streamReader.Close();
                            JsonConvert.PopulateObject(text, parameters.Mod);
                            result = true;
                            break;
                        }
                    }
                    else
                    {
                        entry.WriteToDirectory(parameters.ModDirectory, ZipExtractionOpts.GetExtractionOptions());
                    }
                }
            }

            try
            {
                parseUsingReaderFactory();
            }
            catch (Exception ex)
            {
                logger.Error(ex);
                result = false;
                parseUsingArchiveFactory();
            }
            return(!importInstance || result);
        }
 /// <summary>
 /// json import as an asynchronous operation.
 /// </summary>
 /// <param name="parameters">The parameters.</param>
 /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
 /// <exception cref="System.NotSupportedException"></exception>
 public override Task <ICollectionImportResult> JsonImportAsync(ModCollectionExporterParams parameters)
 {
     throw new NotSupportedException();
 }
        /// <summary>
        /// import as an asynchronous operation.
        /// </summary>
        /// <param name="parameters">The parameters.</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        public async Task <bool> ImportAsync(ModCollectionExporterParams parameters)
        {
            if (File.Exists(parameters.File))
            {
                void map(ParadoxosExportedList model)
                {
                    parameters.Mod.Name = model.ExportedList.Name;
                    IOrderedEnumerable <ParadoxosMod> ordered;

                    // It got confusing a bit...
                    if (model.ExportedList.CustomOrder)
                    {
                        ordered = model.ExportedList.Mod.OrderByDescending(p => p.Order);
                    }
                    else
                    {
                        ordered = model.ExportedList.Mod.OrderByDescending(p => p.ModName, StringComparer.OrdinalIgnoreCase);
                    }
                    parameters.Mod.Mods = ordered.Select(p =>
                    {
                        if (!p.FileName.StartsWith("mod/", StringComparison.OrdinalIgnoreCase))
                        {
                            return(string.Format(ModDirectory, p.FileName));
                        }
                        return(p.FileName);
                    }).ToList();
                }

                bool parseXML(string content)
                {
                    try
                    {
                        var model = ParseParadoxosAsXML(content);
                        map(model);
                        return(true);
                    }
                    catch (Exception ex)
                    {
                        logger.Error(ex);
                    }
                    return(false);
                }

                bool parseJson(string content)
                {
                    try
                    {
                        var model = ParseParadoxosAsJSON(content);
                        map(model);
                        return(true);
                    }
                    catch (Exception ex)
                    {
                        logger.Error(ex);
                    }
                    return(false);
                }

                var content = await File.ReadAllTextAsync(parameters.File);

                if (!string.IsNullOrWhiteSpace(content))
                {
                    if (parameters.File.EndsWith(Shared.Constants.XMLExtension, StringComparison.OrdinalIgnoreCase))
                    {
                        return(parseXML(content));
                    }
                    else if (parameters.File.EndsWith(Shared.Constants.JsonExtension, StringComparison.OrdinalIgnoreCase))
                    {
                        return(parseJson(content));
                    }
                    else
                    {
                        // Try to guess and parse as both
                        return(parseXML(content) || parseJson(content));
                    }
                }
            }
            return(false);
        }
예제 #17
0
        /// <summary>
        /// Imports the internal.
        /// </summary>
        /// <param name="parameters">The parameters.</param>
        /// <param name="importInstance">if set to <c>true</c> [import instance].</param>
        /// <param name="collectionImportResult">The collection import result.</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        private bool ImportInternal(ModCollectionExporterParams parameters, bool importInstance, out ICollectionImportResult collectionImportResult)
        {
            ICollectionImportResult importResult = null;

            if (importInstance)
            {
                importResult = DIResolver.Get <ICollectionImportResult>();
            }
            if (!importInstance)
            {
                if (Directory.Exists(parameters.ModDirectory))
                {
                    DiskOperations.DeleteDirectory(parameters.ModDirectory, true);
                }
            }

            var result = false;

            int getTotalFileCount()
            {
                var count = 0;

                using var fileStream = File.OpenRead(parameters.File);
                using var reader     = ReaderFactory.Open(fileStream);
                while (reader.MoveToNextEntry())
                {
                    if (!reader.Entry.IsDirectory)
                    {
                        count++;
                    }
                }
                fileStream.Close();
                fileStream.Dispose();
                return(count);
            }

            void parseUsingReaderFactory()
            {
                double total = getTotalFileCount();

                using var fileStream = File.OpenRead(parameters.File);
                using var reader     = ReaderFactory.Open(fileStream);
                double processed        = 0;
                double previousProgress = 0;

                while (reader.MoveToNextEntry())
                {
                    if (!reader.Entry.IsDirectory)
                    {
                        var relativePath = reader.Entry.Key.StandardizeDirectorySeparator().Trim(Path.DirectorySeparatorChar);
                        if (reader.Entry.Key.Equals(Common.Constants.ExportedModContentId, StringComparison.OrdinalIgnoreCase))
                        {
                            if (importInstance)
                            {
                                using var entryStream  = reader.OpenEntryStream();
                                using var memoryStream = new MemoryStream();
                                entryStream.CopyTo(memoryStream);
                                memoryStream.Seek(0, SeekOrigin.Begin);
                                using var streamReader = new StreamReader(memoryStream, true);
                                var text = streamReader.ReadToEnd();
                                streamReader.Close();
                                streamReader.Dispose();
                                var model = JsonDISerializer.Deserialize <IModCollection>(text);
                                mapper.Map(model, importResult);
                                importResult.ModNames    = model.ModNames;
                                importResult.Descriptors = model.Mods;
                                result = true;
                                break;
                            }
                        }
                        else
                        {
                            if (!importInstance)
                            {
                                var exportFileName = Path.Combine(relativePath.StartsWith(Common.Constants.ModExportPath + Path.DirectorySeparatorChar) ? parameters.ExportModDirectory : parameters.ModDirectory, relativePath.Replace(Common.Constants.ModExportPath + Path.DirectorySeparatorChar, string.Empty));
                                if (!Directory.Exists(Path.GetDirectoryName(exportFileName)))
                                {
                                    Directory.CreateDirectory(Path.GetDirectoryName(exportFileName));
                                }
                                reader.WriteEntryToFile(exportFileName, ZipExtractionOpts.GetExtractionOptions());
                            }
                        }
                        processed++;
                        var perc = GetProgressPercentage(total, processed, 100);
                        if (perc != previousProgress)
                        {
                            messageBus.Publish(new ModExportProgressEvent(perc));
                            previousProgress = perc;
                        }
                    }
                }
            }

            void parseUsingArchiveFactory()
            {
                using var fileStream = File.OpenRead(parameters.File);
                using var reader     = ArchiveFactory.Open(fileStream);
                var    entries = reader.Entries.Where(entry => !entry.IsDirectory);
                double total   = !importInstance?entries.Count() : 1;

                double processed        = 0;
                double previousProgress = 0;

                foreach (var entry in entries)
                {
                    var relativePath = entry.Key.StandardizeDirectorySeparator().Trim(Path.DirectorySeparatorChar);
                    if (entry.Key.Equals(Common.Constants.ExportedModContentId, StringComparison.OrdinalIgnoreCase))
                    {
                        if (importInstance)
                        {
                            using var entryStream  = entry.OpenEntryStream();
                            using var memoryStream = new MemoryStream();
                            entryStream.CopyTo(memoryStream);
                            memoryStream.Seek(0, SeekOrigin.Begin);
                            using var streamReader = new StreamReader(memoryStream, true);
                            var text = streamReader.ReadToEnd();
                            streamReader.Close();
                            streamReader.Dispose();
                            var model = JsonDISerializer.Deserialize <IModCollection>(text);
                            mapper.Map(model, importResult);
                            importResult.ModNames    = model.ModNames;
                            importResult.Descriptors = model.Mods;
                            result = true;
                            break;
                        }
                    }
                    else
                    {
                        if (!importInstance)
                        {
                            var exportFileName = Path.Combine(relativePath.StartsWith(Common.Constants.ModExportPath + Path.DirectorySeparatorChar) ? parameters.ExportModDirectory : parameters.ModDirectory, relativePath.Replace(Common.Constants.ModExportPath + Path.DirectorySeparatorChar, string.Empty));
                            if (!Directory.Exists(Path.GetDirectoryName(exportFileName)))
                            {
                                Directory.CreateDirectory(Path.GetDirectoryName(exportFileName));
                            }
                            entry.WriteToFile(exportFileName, ZipExtractionOpts.GetExtractionOptions());
                        }
                    }
                    processed++;
                    var perc = GetProgressPercentage(total, processed, 100);
                    if (perc != previousProgress)
                    {
                        messageBus.Publish(new ModExportProgressEvent(perc));
                        previousProgress = perc;
                    }
                }
            }

            try
            {
                parseUsingArchiveFactory();
            }
            catch (Exception ex)
            {
                logger.Error(ex);
                result = false;
                parseUsingReaderFactory();
            }
            collectionImportResult = importResult;
            return(!importInstance || result);
        }
예제 #18
0
 /// <summary>
 /// import paradoxos as an asynchronous operation.
 /// </summary>
 /// <param name="parameters">The parameters.</param>
 /// <returns>Task&lt;System.Boolean&gt;.</returns>
 public Task <ICollectionImportResult> ImportParadoxosAsync(ModCollectionExporterParams parameters)
 {
     return(paradoxosImporter.ImportAsync(parameters));
 }
 /// <summary>
 /// Imports the paradox launcher asynchronous.
 /// </summary>
 /// <param name="parameters">The parameters.</param>
 /// <returns>Task&lt;System.Boolean&gt;.</returns>
 public Task <bool> ImportParadoxLauncherAsync(ModCollectionExporterParams parameters)
 {
     return(paradoxLauncherImporter.ImportAsync(parameters));
 }
예제 #20
0
 /// <summary>
 /// Gets the database path.
 /// </summary>
 /// <param name="parameters">The parameters.</param>
 /// <returns>System.String.</returns>
 private string GetDbPath(ModCollectionExporterParams parameters)
 {
     return(Path.Combine(Path.GetDirectoryName(parameters.ModDirectory), Constants.Sql_db_path));
 }
예제 #21
0
        /// <summary>
        /// json import as an asynchronous operation.
        /// </summary>
        /// <param name="parameters">The parameters.</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        /// <exception cref="System.AggregateException"></exception>
        public virtual async Task <ICollectionImportResult> JsonImportAsync(ModCollectionExporterParams parameters)
        {
            async Task <(Exception, ICollectionImportResult)> parseV2()
            {
                var content = await File.ReadAllTextAsync(parameters.File);

                if (!string.IsNullOrWhiteSpace(content))
                {
                    Models.Paradox.Json.v2.ModInfo model = null;
                    try
                    {
                        model = JsonDISerializer.Deserialize <Models.Paradox.Json.v2.ModInfo>(content);
                    }
                    catch (Exception ex)
                    {
                        return(ex, null);
                    }
                    if (!string.IsNullOrWhiteSpace(model.Game) && !string.IsNullOrWhiteSpace(model.Name))
                    {
                        // Validate whether this really is v2 (execting length larger than 4 as a dumb best guess)
                        if (model.Mods.Any(p => p.Position.Length >= 4))
                        {
                            var result = DIResolver.Get <ICollectionImportResult>();
                            result.Name = model.Name;
                            // Will need to lookup the game and mod ids in the mod service
                            result.Game = model.Game;
                            var mods = model.Mods.Where(p => p.Enabled).OrderBy(p => p.Position);
                            result.ModIds = mods.Select(p => !string.IsNullOrWhiteSpace(p.PdxId) ? p.PdxId : p.SteamId).ToList();
                            return(null, result);
                        }
                    }
                }
                return(null, null);
            }

            async Task <(Exception, ICollectionImportResult)> parseV3()
            {
                var content = await File.ReadAllTextAsync(parameters.File);

                if (!string.IsNullOrWhiteSpace(content))
                {
                    Models.Paradox.Json.v3.ModInfo model = null;
                    try
                    {
                        model = JsonDISerializer.Deserialize <Models.Paradox.Json.v3.ModInfo>(content);
                    }
                    catch (Exception ex)
                    {
                        return(ex, null);
                    }
                    if (!string.IsNullOrWhiteSpace(model.Game) && !string.IsNullOrWhiteSpace(model.Name))
                    {
                        var result = DIResolver.Get <ICollectionImportResult>();
                        result.Name = model.Name;
                        // Will need to lookup the game and mod ids in the mod service
                        result.Game = model.Game;
                        var mods = model.Mods.Where(p => p.Enabled).OrderBy(p => p.Position);
                        result.ModIds = mods.Select(p => !string.IsNullOrWhiteSpace(p.PdxId) ? p.PdxId : p.SteamId).ToList();
                        return(null, result);
                    }
                }
                return(null, null);
            }

            if (File.Exists(parameters.File))
            {
                var exceptions = new List <Exception>();
                var result     = await parseV2();

                if (result.Item2 != null)
                {
                    return(result.Item2);
                }
                if (result.Item1 != null)
                {
                    exceptions.Add(result.Item1);
                }
                result = await parseV3();

                if (result.Item2 != null)
                {
                    return(result.Item2);
                }
                if (result.Item1 != null)
                {
                    exceptions.Add(result.Item1);
                }
                if (exceptions.Any())
                {
                    throw new AggregateException(exceptions);
                }
            }
            return(null);
        }
 /// <summary>
 /// Imports the asynchronous.
 /// </summary>
 /// <param name="parameters">The parameters.</param>
 /// <returns>Task&lt;System.Boolean&gt;.</returns>
 public Task <bool> ImportAsync(ModCollectionExporterParams parameters)
 {
     return(Task.FromResult(ImportInternal(parameters, true)));
 }
예제 #23
0
 /// <summary>
 /// Exports the paradox launcher json asynchronous.
 /// </summary>
 /// <param name="parameters">The parameters.</param>
 /// <returns>Task&lt;System.Boolean&gt;.</returns>
 public Task <bool> ExportParadoxLauncherJsonAsync(ModCollectionExporterParams parameters)
 {
     return(paradoxLauncherExporter.ExportAsync(parameters));
 }
예제 #24
0
        /// <summary>
        /// Exports the asynchronous.
        /// </summary>
        /// <param name="parameters">The parameters.</param>
        /// <returns>Task&lt;System.Boolean&gt;.</returns>
        public async Task <bool> ExportAsync(ModCollectionExporterParams parameters)
        {
            double processed        = 0;
            double previousProgress = 0;

            void saveProgress(object sender, SaveProgressEventArgs e)
            {
                switch (e.EventType)
                {
                case ZipProgressEventType.Saving_AfterWriteEntry:
                    processed++;
                    var perc = GetProgressPercentage(e.EntriesTotal, processed, 100);
                    if (perc != previousProgress)
                    {
                        messageBus.Publish(new ModExportProgressEvent(perc));
                        previousProgress = perc;
                    }
                    break;

                default:
                    break;
                }
            }

            var content = JsonConvert.SerializeObject(parameters.Mod, Formatting.None);

            using var dataStream = new MemoryStream(Encoding.UTF8.GetBytes(content));

            var streams = new List <Stream>()
            {
                dataStream
            };

            using var zip          = new ZipFile();
            zip.UseZip64WhenSaving = Zip64Option.AsNecessary;
            zip.AddEntry(Common.Constants.ExportedModContentId, dataStream);

            if (Directory.Exists(parameters.ModDirectory) && !parameters.ExportModOrderOnly)
            {
                var files = Directory.GetFiles(parameters.ModDirectory, "*.*", SearchOption.AllDirectories);
                if (!RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
                {
                    foreach (var item in files)
                    {
                        var fs    = new FileStream(item, FileMode.Open, FileAccess.Read, FileShare.Read);
                        var file  = item.Replace(parameters.ModDirectory, string.Empty).Trim('\\').Trim('/');
                        var entry = zip.AddEntry(file, fs);
                        entry.AlternateEncoding      = Encoding.UTF8;
                        entry.AlternateEncodingUsage = ZipOption.AsNecessary;
                        streams.Add(fs);
                    }
                }
                else
                {
                    // Yeah, osx sucks (ulimit bypass)
                    foreach (var item in files)
                    {
                        var fs = new FileStream(item, FileMode.Open, FileAccess.Read, FileShare.Read);
                        var ms = new MemoryStream();
                        await fs.CopyToAsync(ms);

                        var file  = item.Replace(parameters.ModDirectory, string.Empty).Trim('\\').Trim('/');
                        var entry = zip.AddEntry(file, ms);
                        entry.AlternateEncoding      = Encoding.UTF8;
                        entry.AlternateEncodingUsage = ZipOption.AsNecessary;
                        fs.Close();
                        await fs.DisposeAsync();

                        streams.Add(ms);
                    }
                }
            }
            if ((parameters.ExportMods?.Any()).GetValueOrDefault())
            {
                foreach (var mod in parameters.ExportMods)
                {
                    if (Directory.Exists(mod.FullPath))
                    {
                        var files = Directory.GetFiles(mod.FullPath, "*.*", SearchOption.AllDirectories);
                        if (!RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
                        {
                            foreach (var item in files)
                            {
                                var fs   = new FileStream(item, FileMode.Open, FileAccess.Read, FileShare.Read);
                                var file = Path.Combine(Common.Constants.ModExportPath, parameters.Mod.Name.GenerateShortFileNameHashId(4).GenerateValidFileName() + "_" + mod.Name.GenerateValidFileName().GenerateShortFileNameHashId(8), item.Replace(mod.FullPath, string.Empty).Trim('\\').Trim('/'));
                                zip.AddEntry(file, fs);
                                streams.Add(fs);
                            }
                        }
                        else
                        {
                            foreach (var item in files)
                            {
                                var fs = new FileStream(item, FileMode.Open, FileAccess.Read, FileShare.Read);
                                var ms = new MemoryStream();
                                await fs.CopyToAsync(ms);

                                var file = Path.Combine(Common.Constants.ModExportPath, parameters.Mod.Name.GenerateShortFileNameHashId(4).GenerateValidFileName() + "_" + mod.Name.GenerateValidFileName().GenerateShortFileNameHashId(8), item.Replace(mod.FullPath, string.Empty).Trim('\\').Trim('/'));
                                zip.AddEntry(file, ms);
                                fs.Close();
                                await fs.DisposeAsync();

                                streams.Add(ms);
                            }
                        }
                    }
                    else if (File.Exists(mod.FullPath))
                    {
                        if (!RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
                        {
                            var fs   = new FileStream(mod.FullPath, FileMode.Open, FileAccess.Read, FileShare.Read);
                            var file = Path.Combine(Common.Constants.ModExportPath, parameters.Mod.Name.GenerateShortFileNameHashId(4).GenerateValidFileName() + "_" + Path.GetFileNameWithoutExtension(mod.FullPath).GenerateShortFileNameHashId(8) + Path.GetExtension(mod.FullPath));
                            zip.AddEntry(file, fs);
                            streams.Add(fs);
                        }
                        else
                        {
                            var fs = new FileStream(mod.FullPath, FileMode.Open, FileAccess.Read, FileShare.Read);
                            var ms = new MemoryStream();
                            await fs.CopyToAsync(ms);

                            var file = Path.Combine(Common.Constants.ModExportPath, parameters.Mod.Name.GenerateShortFileNameHashId(4).GenerateValidFileName() + "_" + Path.GetFileNameWithoutExtension(mod.FullPath).GenerateShortFileNameHashId(8) + Path.GetExtension(mod.FullPath));
                            zip.AddEntry(file, ms);
                            fs.Close();
                            await fs.DisposeAsync();

                            streams.Add(ms);
                        }
                    }
                }
            }

            zip.SaveProgress += saveProgress;
            zip.Save(parameters.File);
            zip.SaveProgress -= saveProgress;
            zip.Dispose();
            if (streams.Any())
            {
                var task = streams.Select(async p =>
                {
                    p.Close();
                    await p.DisposeAsync();
                });
                await Task.WhenAll(task);
            }
            return(true);
        }
예제 #25
0
 /// <summary>
 /// Gets the connection.
 /// </summary>
 /// <param name="parameters">The parameters.</param>
 /// <returns>IDbConnection.</returns>
 private IDbConnection GetConnection(ModCollectionExporterParams parameters)
 {
     return(new SqliteConnection($"Data Source=\"{GetDbPath(parameters)}\"").EnsureOpen());
 }
예제 #26
0
 /// <summary>
 /// Imports the paradox launcher beta asynchronous.
 /// </summary>
 /// <param name="parameters">The parameters.</param>
 /// <returns>Task&lt;ICollectionImportResult&gt;.</returns>
 public Task <ICollectionImportResult> ImportParadoxLauncherBetaAsync(ModCollectionExporterParams parameters)
 {
     return(paradoxLauncherImporterBeta.DatabaseImportAsync(parameters));
 }
예제 #27
0
 /// <summary>
 /// Imports the paradox launcher json asynchronous.
 /// </summary>
 /// <param name="parameters">The parameters.</param>
 /// <returns>Task&lt;System.Boolean&gt;.</returns>
 public Task <ICollectionImportResult> ImportParadoxLauncherJsonAsync(ModCollectionExporterParams parameters)
 {
     return(paradoxLauncherImporter.JsonImportAsync(parameters));
 }
 /// <summary>
 /// Imports the mod directory asynchronous.
 /// </summary>
 /// <param name="parameters">The parameters.</param>
 /// <returns>Task&lt;System.Boolean&gt;.</returns>
 public Task <bool> ImportModDirectoryAsync(ModCollectionExporterParams parameters)
 {
     return(Task.FromResult(ImportInternal(parameters, false)));
 }