Example #1
0
        public IDictionary <string, List <File <IReplay> > > PreviewSort(List <string> replaysThrowingExceptions, BackgroundWorker worker_ReplaySorter, int currentCriteria, int numberOfCriteria, int currentPositionNested = 0, int numberOfPositions = 0)
        {
            var directoryFileReplay = new Dictionary <string, List <File <IReplay> > >();

            var playerNames         = new List <string>();
            var makeFolderForWinner = (bool)SortCriteriaParameters.MakeFolderForWinner;
            var makeFolderForLoser  = (bool)SortCriteriaParameters.MakeFolderForLoser;
            var currentDirectory    = Sorter.CurrentDirectory;
            var sortCriteria        = Sorter.SortCriteria;
            var playerType          = GetPlayerType(makeFolderForWinner, makeFolderForLoser);

            playerNames.AddRange(ExtractPlayers(Sorter.ListReplays.Select(f => f.Content), playerType).Select(playerName => FileHandler.RemoveInvalidChars(playerName)).Distinct());

            string sortDirectory = Sorter.CurrentDirectory;

            if (!(IsNested && !Sorter.GenerateIntermediateFolders))
            {
                if (IsNested)
                {
                    sortDirectory = Sorter.CurrentDirectory + @"\" + sortCriteria;
                }
                else
                {
                    sortDirectory = Sorter.CurrentDirectory + @"\" + string.Join(",", Sorter.CriteriaStringOrder);
                }
                sortDirectory = FileHandler.AdjustName(sortDirectory, true);
            }

            foreach (var playerName in playerNames)
            {
                directoryFileReplay.Add(Path.Combine(sortDirectory, playerName), new List <File <IReplay> >());
            }

            if (playerType == PlayerType.None)
            {
                directoryFileReplay.Add(sortDirectory, new List <File <IReplay> >());
            }

            int currentPosition    = 0;
            int progressPercentage = 0;

            foreach (var replay in Sorter.ListReplays)
            {
                if (worker_ReplaySorter.CancellationPending == true)
                {
                    return(null);
                }

                currentPosition++;
                if (IsNested == false)
                {
                    progressPercentage = Convert.ToInt32(((double)currentPosition / Sorter.ListReplays.Count) * 1 / numberOfCriteria * 100);
                }
                else
                {
                    progressPercentage  = Convert.ToInt32((((double)currentPosition / Sorter.ListReplays.Count) * 1 / numberOfPositions * 100 + ((currentPositionNested - 1) * 100 / numberOfPositions)) * ((double)1 / numberOfCriteria));
                    progressPercentage += (currentCriteria - 1) * 100 / numberOfCriteria;
                }
                worker_ReplaySorter.ReportProgress(progressPercentage, $"sorting on playername... {replay.FilePath}");

                var newReplayName = KeepOriginalReplayNames ? FileHandler.GetFileName(replay.FilePath) : ReplayHandler.GenerateReplayName(replay, Sorter.CustomReplayFormat) + ".rep";

                try
                {
                    if (playerType == PlayerType.None)
                    {
                        var newReplayPath = Path.Combine(sortDirectory, newReplayName);

                        if (IsNested)
                        {
                            ReplayHandler.MoveReplay(replay, newReplayPath, true);
                        }
                        else
                        {
                            ReplayHandler.CopyReplay(replay, newReplayPath, true);
                        }
                        directoryFileReplay[sortDirectory].Add(replay);
                    }
                    else
                    {
                        var playersToSortFor = GetPlayers(playerType, replay.Content);

                        foreach (var player in playersToSortFor)
                        {
                            var folderName    = Path.Combine(sortDirectory, FileHandler.RemoveInvalidChars(player.Name));
                            var newReplayPath = Path.Combine(folderName, newReplayName);

                            if (IsNested && player == playersToSortFor.Last())
                            {
                                ReplayHandler.MoveReplay(replay, newReplayPath, true);
                                directoryFileReplay[folderName].Add(replay);
                            }
                            else
                            {
                                ReplayHandler.CopyReplay(replay, newReplayPath, true);
                                var additionalReplayCreated = File <IReplay> .Create(replay.Content, replay.OriginalFilePath, replay.Hash);

                                additionalReplayCreated.AddAfterCurrent(replay.FilePath);
                                additionalReplayCreated.Forward();
                                replay.Rewind();
                                directoryFileReplay[folderName].Add(additionalReplayCreated);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    replaysThrowingExceptions.Add(replay.OriginalFilePath);
                    ErrorLogger.GetInstance()?.LogError($"{DateTime.Now} - sort on playername exception: {replay.FilePath}", ex: ex);
                }
            }
            return(directoryFileReplay);
        }
Example #2
0
        private ServiceResult <ServiceResultSummary <IEnumerable <File <IReplay> > > > ComputeNames(BackgroundWorker worker_ReplayRenamer, string outputDirectory, bool restore = false)
        {
            worker_ReplayRenamer.ReportProgress(0, "Computing names...");

            var firstReplay = _listReplays.FirstOrDefault();

            if (firstReplay == null)
            {
                return(new ServiceResult <ServiceResultSummary <IEnumerable <File <IReplay> > > >(ServiceResultSummary <IEnumerable <File <IReplay> > > .Default, false, new List <string> {
                    "You have to parse replays before you can sort. Replay list is empty!"
                }));
            }

            if (!string.IsNullOrWhiteSpace(outputDirectory) && !Directory.Exists(outputDirectory))
            {
                return(new ServiceResult <ServiceResultSummary <IEnumerable <File <IReplay> > > >(ServiceResultSummary <IEnumerable <File <IReplay> > > .Default, false, new List <string> {
                    "Output directory does not exist."
                }));
            }

            Stopwatch sw = new Stopwatch();

            sw.Start();
            int currentPosition           = 0;
            int progressPercentage        = 0;
            int replaysThrowingExceptions = 0;
            var renamedReplays            = new List <File <IReplay> >();

            foreach (var replay in _listReplays)
            {
                if (worker_ReplayRenamer.CancellationPending == true)
                {
                    sw.Stop();
                    return(new ServiceResult <ServiceResultSummary <IEnumerable <File <IReplay> > > >(
                               new ServiceResultSummary <IEnumerable <File <IReplay> > >(
                                   renamedReplays,
                                   $"Renaming cancelled by user... It took {sw.Elapsed} to rename {renamedReplays.Count()} of {_listReplays.Count()} replays. {replaysThrowingExceptions} replays encountered exceptions.",
                                   sw.Elapsed,
                                   currentPosition,
                                   replaysThrowingExceptions
                                   ),
                               true,
                               null
                               ));
                }

                currentPosition++;
                progressPercentage = Convert.ToInt32(((double)currentPosition / (_listReplays.Count() * 2)) * 100);
                worker_ReplayRenamer.ReportProgress(progressPercentage);
                try
                {
                    replay.AddAfterCurrent(
                        (string.IsNullOrWhiteSpace(outputDirectory) ? Directory.GetParent(replay.FilePath).ToString() : outputDirectory) + @"\"
                        +
                        (restore ? FileHandler.GetFileName(replay.OriginalFilePath) : ReplayHandler.GenerateReplayName(replay, CustomReplayFormat) + ".rep")
                        );
                    renamedReplays.Add(replay);
                }
                catch (Exception ex)
                {
                    replaysThrowingExceptions++;
                    //TODO add to serviceresult instead... log later?
                    ErrorLogger.GetInstance()?.LogError($"{DateTime.Now} - Error while renaming replay: {replay.OriginalFilePath}", ex: ex);
                }
            }

            sw.Stop();
            return(new ServiceResult <ServiceResultSummary <IEnumerable <File <IReplay> > > >(
                       new ServiceResultSummary <IEnumerable <File <IReplay> > >(
                           renamedReplays,
                           $"Finished renaming replays! It took {sw.Elapsed} to rename {_listReplays.Count()} replays. {replaysThrowingExceptions} replays encountered exceptions.",
                           sw.Elapsed,
                           currentPosition,
                           replaysThrowingExceptions
                           ),
                       true,
                       null
                       ));
        }
Example #3
0
        public IDictionary <string, List <File <IReplay> > > Sort(List <string> replaysThrowingExceptions)
        {
            var directoryFileReplay = new Dictionary <string, List <File <IReplay> > >();

            var playerNames         = new List <string>();
            var makeFolderForWinner = (bool)SortCriteriaParameters.MakeFolderForWinner;
            var makeFolderForLoser  = (bool)SortCriteriaParameters.MakeFolderForLoser;
            var currentDirectory    = Sorter.CurrentDirectory;
            var sortCriteria        = Sorter.SortCriteria;
            var sortDirectory       = Sorter.CurrentDirectory;

            playerNames.AddRange(ExtractPlayers(Sorter.ListReplays.Select(f => f.Content), GetPlayerType(makeFolderForWinner, makeFolderForLoser)).Select(playerName => FileHandler.RemoveInvalidChars(playerName)).Distinct());

            if (!(IsNested && !Sorter.GenerateIntermediateFolders))
            {
                if (IsNested)
                {
                    sortDirectory = Path.Combine(sortDirectory, sortCriteria.ToString());
                }
                else
                {
                    sortDirectory = Path.Combine(sortDirectory, string.Join(",", Sorter.CriteriaStringOrder));
                }
                sortDirectory = FileHandler.CreateDirectory(sortDirectory);
            }

            var playerType = GetPlayerType(makeFolderForWinner, makeFolderForLoser);

            foreach (var playerName in playerNames)
            {
                try
                {
                    Directory.CreateDirectory(sortDirectory + @"\" + playerName);
                    directoryFileReplay.Add(Path.Combine(sortDirectory, playerName), new List <File <IReplay> >());
                }
                catch (Exception ex)
                {
                    ErrorLogger.GetInstance()?.LogError($"{DateTime.Now} - Could not create folder for {playerName}", ex: ex);
                }
            }

            if (playerType == PlayerType.None)
            {
                directoryFileReplay.Add(sortDirectory, new List <File <IReplay> >());
            }

            foreach (var replay in Sorter.ListReplays)
            {
                try
                {
                    var newReplayName = KeepOriginalReplayNames ? FileHandler.GetFileName(replay.FilePath) : ReplayHandler.GenerateReplayName(replay, Sorter.CustomReplayFormat) + ".rep";
                    if (playerType == PlayerType.None)
                    {
                        var newReplayPath = Path.Combine(sortDirectory, newReplayName);

                        if (IsNested)
                        {
                            ReplayHandler.MoveReplay(replay, newReplayPath);
                        }
                        else
                        {
                            ReplayHandler.CopyReplay(replay, newReplayPath);
                        }
                        directoryFileReplay[sortDirectory].Add(replay);
                    }
                    else
                    {
                        var playersToSortFor = GetPlayers(playerType, replay.Content);
                        foreach (var player in playersToSortFor)
                        {
                            var folderName    = Path.Combine(sortDirectory, FileHandler.RemoveInvalidChars(player.Name));
                            var newReplayPath = Path.Combine(folderName, newReplayName);

                            if (IsNested && player == playersToSortFor.Last())
                            {
                                ReplayHandler.MoveReplay(replay, newReplayPath);
                                directoryFileReplay[folderName].Add(replay);
                            }
                            else
                            {
                                ReplayHandler.CopyReplay(replay, newReplayPath);
                                var additionalReplayCreated = File <IReplay> .Create(replay.Content, replay.OriginalFilePath, replay.Hash);

                                additionalReplayCreated.AddAfterCurrent(replay.FilePath);
                                additionalReplayCreated.Forward();
                                replay.Rewind();
                                directoryFileReplay[folderName].Add(additionalReplayCreated);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    replaysThrowingExceptions.Add(replay.OriginalFilePath);
                    ErrorLogger.GetInstance()?.LogError($"{DateTime.Now} - sort on player name exception: {replay.FilePath}", ex: ex);
                }
            }
            return(directoryFileReplay);
        }