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; } }
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; } }