Esempio n. 1
0
        public void AssetManagement()
        {
            if (AvailableBibles.Count == 0)
            {
                Console.WriteLine("This program requires at least one bible to be installed. Please Install at least once");
            }
            else
            {
                Console.WriteLine("Displaying Installed bibles: ");
                DisplayAvailableBibles();
            }
            Console.WriteLine("\n1. Add a Bible\n2. Remove a Bible\n3. Remove All Bibles and Data\nPress any other key to go back to main menu\nEnter your choice : ");
            switch (Console.ReadLine()[0])
            {
            case '1':
                Console.WriteLine("Fetching data from server. Please wait...");
                BibleLink[] list = null;
                int         files;
                try { list = DisplayDownloadable(); }
                catch (Exception e) { Console.WriteLine(e.Message); }
                if (list == null || list.Length == 0)
                {
                    Console.WriteLine("Could not connect to the server... ");
                }
                else
                {
                    Console.WriteLine("Enter the ID(s) of the bible to download (Multiple IDs are to be separted by space");
                    files = 0;
                    object lockobject = new object();
                    foreach (string Id in Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries))
                    {
                        if (int.TryParse(Id, out int x) && x >= 1 && x <= list.Length)
                        {
                            BibleLink link = list[--x];
                            if (AvailableBibles.Contains(link))
                            {
                                Console.WriteLine($"File {AssetFileName(link)} already exists");
                            }
                            else
                            {
                                Console.WriteLine($"Downloading file: {AssetFileName(link)}");
                                ConsoleProgressBar progressBar = new ConsoleProgressBar((byte)(Console.WindowWidth / 2));
                                try
                                {
                                    Bible downloadedbible = Bible.ExtractBible(link.DownloadStreamAsync(OnDownloadProgress, OnDownloadComplete).Result);
                                    SaveFileAsJson(downloadedbible, AssetFileName(downloadedbible));
                                    files++;
                                    AvailableBibles.Add(link);
                                    Console.WriteLine("\nFile is saved successfully");
                                }
                                catch (Exception e)
                                {
                                    Debug.WriteLine(e.Message);
                                    Console.WriteLine("\n\nUnexpected Error");
                                }
                                void OnDownloadProgress(object o, DownloadProgressChangedEventArgs e)
                                {
                                    lock (lockobject)
                                    {
                                        progressBar.Percentage = (byte)e.ProgressPercentage;
                                        progressBar.Write();
                                    }
                                }

                                void OnDownloadComplete(object o, DownloadDataCompletedEventArgs e)
                                {
                                    lock (lockobject)
                                    {
                                        progressBar.Percentage = 100;
                                        progressBar.Write();
                                    }
                                    Console.WriteLine("\nFile Download Complete.");
                                }
                            }
                        }
                        else
                        {
                            Console.WriteLine($"Ignoring Invalid input {Id}");
                        }
                    }
                    Console.WriteLine($"Downloaded {files} file(s) Successfully");
                }
                break;

            case '2':
                Console.WriteLine("Enter the ID(s) of the bible to remove (Multiple IDs are to be separted by space");
                files = 0;
                foreach (string Id in Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries))
                {
                    if (int.TryParse(Id, out int x) && x >= 1 && x <= AvailableBibles.Count)
                    {
                        BibleLink link = AvailableBibles[--x];
                        try
                        {
                            File.Delete(AssetFilePath(AssetFileName(link)));
                            files++;
                            Console.WriteLine($"Removed {AssetFileName(link)}");
                            _ = AvailableBibles.Remove(link);
                        }
                        catch (Exception e) { Console.WriteLine(e.Message); }
                    }
                    else
                    {
                        Console.WriteLine($"Ignoring Invalid input {Id}");
                    }
                }
                Console.WriteLine($"Removed {files} file(s) Successfully");
                break;

            case '3':
                Console.WriteLine("This will delete all the content of this tool. Are you sure (y/n)?");
                char confirm = Console.ReadLine()[0];
                if (confirm == 'Y' || confirm == 'y')
                {
                    DeleteAllAssets();
                    Console.WriteLine("All assets removed");
                    ExitPressed = true;
                }
                else
                {
                    Console.WriteLine("Delete process skipped.");
                }
                break;

            default: Console.WriteLine("Returning to main menu"); break;
            }
            if (!ExitPressed)
            {
                SaveAssetLog();
            }
            void DisplayAvailableBibles()
            {
                int          choice = 1;
                ConsoleTable table  = new ConsoleTable("ID", "Title", "Language", "Version", "Location");

                foreach (BibleLink link in AvailableBibles)
                {
                    _ = table.AddRow(choice++, link.Title, link.Language, link.AionianEdition ? "Aionian" : "Standard", AssetFilePath(AssetFileName(link)));
                }
                table.Write();
            }

            BibleLink[] DisplayDownloadable()
            {
                (BibleLink Link, ulong SizeInBytes)[] results = BibleLink.GetAllUrlsFromWebsite();
                ConsoleTable table = new ConsoleTable("ID", "Title", "Language", "Size", "|", "ID", "Title", "Language", "Size");

                for (int i = 0; i < results.Length; i += 2)
                {
                    BibleLink link = results[i].Link;
                    BibleLink lin2 = results[i + 1].Link;
                    Debug.WriteLine($"link={AssetFileName(link)}; lin2={AssetFileName(lin2)};\n{link.Equals(lin2)} : {link.CompareTo(lin2)}\n\n");
                    _ = table.AddRow(i + 1, link.Title, link.Language, $"{results[i].SizeInBytes / 1048576.0f:0.000} MB", "|", i + 2, lin2.Title, lin2.Language, $"{results[i + 1].SizeInBytes / 1048576.0f:0.000} MB");
                }
                table.Options.EnableCount = false;
                table.Write();
                List <BibleLink> links = new List <BibleLink>();

                foreach ((BibleLink Link, ulong SizeInBytes) in results)
                {
                    links.Add(Link);
                }
                return(links.ToArray());
            }