예제 #1
0
        static public void Load()
        {
            try
            {
                Console.WriteLine($"{DateTime.Now}: Начат процесс загрузки…");
                MyBotSettings.Load();
                ImmutableList <MyPlayer> .Builder  playersBuilder  = ImmutableList.CreateBuilder <MyPlayer>();
                ImmutableList <MyFaction> .Builder factionsBuilder = ImmutableList.CreateBuilder <MyFaction>();
                ImmutableList <MySector> .Builder  sectorsBuilder  = ImmutableList.CreateBuilder <MySector>();
                ImmutableList <MyPolitic> .Builder politicsBuilder = ImmutableList.CreateBuilder <MyPolitic>();
                ImmutableList <AMyFight> .Builder  fightsBuilder   = ImmutableList.CreateBuilder <AMyFight>();
                ImmutableList <MyOffer> .Builder   offersBuilder   = ImmutableList.CreateBuilder <MyOffer>();
                ImmutableList <MyScript> .Builder  scriptsBuilder  = ImmutableList.CreateBuilder <MyScript>();
                ImmutableList <MyTimer> .Builder   timersBuilder   = ImmutableList.CreateBuilder <MyTimer>();

                Parallel.Invoke(() => Parallel.ForEach(Directory.GetFiles(SavePathPlayers), item =>
                {
                    using (FileStream stream = File.OpenRead(item))
                    {
                        MyPlayer player = (MyPlayer)MyPlayerSerializer.ReadObject(stream);
                        lock (playersBuilder)
                        {
                            playersBuilder.Add(player);
                        }
                    }
                }), () => Parallel.ForEach(Directory.GetFiles(SavePathFactions), item =>
                {
                    using (FileStream stream = File.OpenRead(item))
                    {
                        MyFaction faction = (MyFaction)MyFactionSerializer.ReadObject(stream);
                        lock (factionsBuilder)
                        {
                            factionsBuilder.Add(faction);
                        }
                    }
                }), () => Parallel.ForEach(Directory.GetFiles(SavePathSectors), item =>
                {
                    using (FileStream stream = File.OpenRead(item))
                    {
                        MySector sector = (MySector)MySectorSerializer.ReadObject(stream);
                        lock (sectorsBuilder)
                        {
                            sectorsBuilder.Add(sector);
                        }
                    }
                }), () => Parallel.ForEach(Directory.GetFiles(SavePathPolitics), item =>
                {
                    using (FileStream stream = File.OpenRead(item))
                    {
                        MyPolitic pol = (MyPolitic)MyPoliticSerializer.ReadObject(stream);
                        lock (politicsBuilder)
                        {
                            politicsBuilder.Add(pol);
                        }
                    }
                }), () => Parallel.ForEach(Directory.GetFiles(SavePathFights), item =>
                {
                    using (FileStream stream = File.OpenRead(item))
                    {
                        AMyFight fight;
                        if (item.Contains("@S"))
                        {
                            fight = (MySectorFight)MySectorFightSerializer.ReadObject(stream);
                        }
                        else if (item.Contains("@T"))
                        {
                            fight = (MyTradeShipFight)MyTradeShipFightSerializer.ReadObject(stream);
                        }
                        else if (item.Contains("@C"))
                        {
                            fight = (MyCustomFight)MyCustomFightSerializer.ReadObject(stream);
                        }
                        else
                        {
                            throw new FileLoadException("Неизвестный тип боя", item);
                        }

                        lock (fightsBuilder)
                        {
                            fightsBuilder.Add(fight);
                        }
                    }
                }), () => Parallel.ForEach(Directory.GetFiles(SavePathOffers), item =>
                {
                    using (FileStream stream = File.OpenRead(item))
                    {
                        MyOffer offer = (MyOffer)MyOfferSerializer.ReadObject(stream);
                        lock (offersBuilder)
                        {
                            offersBuilder.Add(offer);
                        }
                    }
                }), () => Parallel.ForEach(Directory.GetFiles(SavePathScripts), item =>
                {
                    using (FileStream stream = File.OpenRead(item))
                    {
                        MyScript scr = (MyScript)MyScriptSerializer.ReadObject(stream);
                        lock (scriptsBuilder)
                        {
                            scriptsBuilder.Add(scr);
                        }
                    }
                }), () => Parallel.ForEach(Directory.GetFiles(SavePathTimers), item =>
                {
                    using (FileStream stream = File.OpenRead(item))
                    {
                        MyTimer timer = (MyTimer)MyTimerSerializer.ReadObject(stream);
                        lock (timersBuilder)
                        {
                            timersBuilder.Add(timer);
                        }
                    }
                }));

                playersBuilder.Sort();
                factionsBuilder.Sort();
                sectorsBuilder.Sort();
                Players  = playersBuilder.ToImmutable();
                Factions = factionsBuilder.ToImmutable();
                Sectors  = sectorsBuilder.ToImmutable();
                Politics = politicsBuilder.ToImmutable();
                Fights   = fightsBuilder.ToImmutable();
                Offers   = offersBuilder.ToImmutable();
                Scripts  = scriptsBuilder.ToImmutable();
                Timers   = timersBuilder.ToImmutable();
                Console.WriteLine($"{DateTime.Now}: Загрузка завершена");
            }
            catch (Exception e)
            {
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine($"{DateTime.Now}: Исключение во время попытки загрузки: {e.Message}\r\n{e.StackTrace}");
                Console.ForegroundColor = ConsoleColor.Green;
            }
        }
예제 #2
0
        static public void Save()
        {
            try
            {
                Console.WriteLine($"{DateTime.Now}: Начат процесс сохранения…");
                ZipFile.CreateFromDirectory("Save\\", BackupPath + DateTime.UtcNow.ToBinary().ToString(CultureInfo.InvariantCulture) + ".zip", CompressionLevel.Optimal, true, Encoding.UTF8);
                MyBotSettings.Save();
                List <string> files = new List <string>(64);
                files.AddRange(Directory.GetFiles(SavePathPlayers));
                files.AddRange(Directory.GetFiles(SavePathFactions));
                files.AddRange(Directory.GetFiles(SavePathSectors));
                files.AddRange(Directory.GetFiles(SavePathFights));
                files.AddRange(Directory.GetFiles(SavePathOffers));
                files.AddRange(Directory.GetFiles(SavePathPolitics));
                files.AddRange(Directory.GetFiles(SavePathTimers));
                files.AddRange(Directory.GetFiles(SavePathScripts));
                Parallel.ForEach(files, File.Delete);
                CreateDirectories();
                Parallel.Invoke(() => Parallel.ForEach(Players, item =>
                {
                    using (StreamWriter stream = File.CreateText(SavePathPlayers + item.Name + ".json"))
                    {
                        MyPlayerSerializer.WriteObject(stream.BaseStream, item);
                    }
                }), () => Parallel.ForEach(Factions, item =>
                {
                    using (StreamWriter stream = File.CreateText(SavePathFactions + item.Tag + ".json"))
                    {
                        MyFactionSerializer.WriteObject(stream.BaseStream, item);
                    }
                }), () => Parallel.ForEach(Sectors, item =>
                {
                    using (StreamWriter stream = File.CreateText(SavePathSectors + item.Name + ".json"))
                    {
                        MySectorSerializer.WriteObject(stream.BaseStream, item);
                    }
                }), () => Parallel.ForEach(Politics, item =>
                {
                    using (StreamWriter stream = File.CreateText(SavePathPolitics + item.Id + ".json"))
                    {
                        MyPoliticSerializer.WriteObject(stream.BaseStream, item);
                    }
                }), () => Parallel.ForEach(Offers, item =>
                {
                    using (StreamWriter stream = File.CreateText(SavePathOffers + $"{item.CreateTime:yy\\-mm\\-dd\\_HH\\-mm\\-ss}^{item.Factions.Item1}-{item.Factions.Item2}" + ".json"))
                    {
                        MyOfferSerializer.WriteObject(stream.BaseStream, item);
                    }
                }), () => Parallel.ForEach(Fights, item =>
                {
                    string prefix;
                    switch (item)
                    {
                    case MySectorFight _:
                        prefix = "S";
                        break;

                    case MyTradeShipFight _:
                        prefix = "T";
                        break;

                    case MyCustomFight _:
                        prefix = "C";
                        break;

                    default: throw new InvalidDataException();
                    }

                    using (StreamWriter stream = File.CreateText($"{SavePathOffers}{item.StartTime:yy\\-mm\\-dd\\_HH\\-mm\\-ss}^{item.AttackersTag}-{item.DefendersTag}@{prefix}.json"))
                    {
                        switch (prefix)
                        {
                        case "S":
                            MySectorFightSerializer.WriteObject(stream.BaseStream, item);
                            break;

                        case "T":
                            MyTradeShipFightSerializer.WriteObject(stream.BaseStream, item);
                            break;

                        case "C":
                            MyCustomFightSerializer.WriteObject(stream.BaseStream, item);
                            break;

                        default: throw new ArgumentException("Неизвестный тип боя", nameof(item));
                        }
                    }
                }), () => Parallel.ForEach(Scripts, item =>
                {
                    using (StreamWriter stream = File.CreateText(SavePathOffers + item.Name + ".json"))
                    {
                        MyScriptSerializer.WriteObject(stream.BaseStream, item);
                    }
                }), () => Parallel.ForEach(Timers, item =>
                {
                    using (StreamWriter stream = File.CreateText(SavePathOffers + item.Name + ".json"))
                    {
                        MyTimerSerializer.WriteObject(stream.BaseStream, item);
                    }
                }));

                Console.WriteLine($"{DateTime.Now}: Сохранение завершено");
            }
            catch (Exception e)
            {
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine($"{DateTime.Now}: Исключение во время попытки сохранения: {e.Message}\r\n{e.StackTrace}");
                Console.ForegroundColor = ConsoleColor.Green;
            }
        }