From a22acdee6f690c89fe5408de586354013349538b Mon Sep 17 00:00:00 2001 From: Titlehhhh <93156853+Titlehhhh@users.noreply.github.com> Date: Wed, 27 Dec 2023 18:00:05 +0500 Subject: [PATCH 01/55] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c239d3c6..580a8a5a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Discord Banner](https://img.shields.io/badge/discord-join%20chat-46BC99)](https://discord.gg/HVDzx4rCgg) +[![Discord Banner](https://img.shields.io/badge/discord-join%20chat-46BC99)](https://discord.gg/HVDzx4rCgg)[![Github All Releases](https://img.shields.io/github/downloads/Titlehhhh/Minecraft-Holy-Client/total.svg)]() *На данный момент программа находится в предварительной версии, поэтому некоторые функции нестабильны. Подробнее можно узнать [здесь](preview.md).* From 0354d5fc83372a1e8757e71ce285bd047dcad09d Mon Sep 17 00:00:00 2001 From: Titlehhhh <93156853+Titlehhhh@users.noreply.github.com> Date: Wed, 27 Dec 2023 18:00:30 +0500 Subject: [PATCH 02/55] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 580a8a5a..7b332c40 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Discord Banner](https://img.shields.io/badge/discord-join%20chat-46BC99)](https://discord.gg/HVDzx4rCgg)[![Github All Releases](https://img.shields.io/github/downloads/Titlehhhh/Minecraft-Holy-Client/total.svg)]() +[![Discord Banner](https://img.shields.io/badge/discord-join%20chat-46BC99)](https://discord.gg/HVDzx4rCgg) [![Github All Releases](https://img.shields.io/github/downloads/Titlehhhh/Minecraft-Holy-Client/total.svg)]() *На данный момент программа находится в предварительной версии, поэтому некоторые функции нестабильны. Подробнее можно узнать [здесь](preview.md).* From eba64065bddbffa4dbfa642f3dc87aeb737ecb8e Mon Sep 17 00:00:00 2001 From: Titlehhhh <93156853+Titlehhhh@users.noreply.github.com> Date: Wed, 27 Dec 2023 18:02:01 +0500 Subject: [PATCH 03/55] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7b332c40..6ee7416d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Discord Banner](https://img.shields.io/badge/discord-join%20chat-46BC99)](https://discord.gg/HVDzx4rCgg) [![Github All Releases](https://img.shields.io/github/downloads/Titlehhhh/Minecraft-Holy-Client/total.svg)]() +[![Discord Banner](https://img.shields.io/badge/discord-join%20chat-46BC99)](https://discord.gg/HVDzx4rCgg) [![Github All Releases](https://img.shields.io/github/downloads/Titlehhhh/Minecraft-Holy-Client/total.svg)](https://github.com/Titlehhhh/Minecraft-Holy-Client/releases) *На данный момент программа находится в предварительной версии, поэтому некоторые функции нестабильны. Подробнее можно узнать [здесь](preview.md).* From 51c1424472e0568e969656de83d206322407f1fc Mon Sep 17 00:00:00 2001 From: Titlehhhh <93156853+Titlehhhh@users.noreply.github.com> Date: Wed, 27 Dec 2023 18:07:09 +0500 Subject: [PATCH 04/55] Update Ru.md --- ReleaseNotes/2.0.0-preview.1/Ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReleaseNotes/2.0.0-preview.1/Ru.md b/ReleaseNotes/2.0.0-preview.1/Ru.md index 34017dd4..b251d578 100644 --- a/ReleaseNotes/2.0.0-preview.1/Ru.md +++ b/ReleaseNotes/2.0.0-preview.1/Ru.md @@ -1,4 +1,4 @@ -# Что изменилось в Minecraft Holy Client *2.0.0-preview.1*? +# Что изменилось в Minecraft Holy Client **2.0.0-preview.1.1**? ## Основные исправления From 0af3ac1db5fc0e16ab9c18cd7b6e0f0438d28542 Mon Sep 17 00:00:00 2001 From: Titlehhhh <93156853+Titlehhhh@users.noreply.github.com> Date: Wed, 27 Dec 2023 18:07:37 +0500 Subject: [PATCH 05/55] Update Ru.md From 0ca71914a4dd8b59235fe99cb02ee0af909c1646 Mon Sep 17 00:00:00 2001 From: Titlehhhh <93156853+Titlehhhh@users.noreply.github.com> Date: Wed, 27 Dec 2023 18:07:52 +0500 Subject: [PATCH 06/55] Update En.md --- ReleaseNotes/2.0.0-preview.1/En.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReleaseNotes/2.0.0-preview.1/En.md b/ReleaseNotes/2.0.0-preview.1/En.md index 9975ba39..8eba07b2 100644 --- a/ReleaseNotes/2.0.0-preview.1/En.md +++ b/ReleaseNotes/2.0.0-preview.1/En.md @@ -1,7 +1,7 @@ > [!WARNING] > Disclaimer: This translation was generated using AI. -# What's New in Minecraft Holy Client *2.0.0-preview.1*? +# What's New in Minecraft Holy Client **2.0.0-preview.1.1**? ## Major Fixes From 7548be6e6d06d4c70a5adcbc06768550a3221775 Mon Sep 17 00:00:00 2001 From: Titlehhhh <93156853+Titlehhhh@users.noreply.github.com> Date: Wed, 27 Dec 2023 18:38:35 +0500 Subject: [PATCH 07/55] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 6ee7416d..2be3760c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +> [!WARNING] +> Приложение предназначено для стресс-тестирования своих серверов. Не используйте программу на чужих серверах без согласия владельца. В противном случае ответсвенны за это будете Вы. + [![Discord Banner](https://img.shields.io/badge/discord-join%20chat-46BC99)](https://discord.gg/HVDzx4rCgg) [![Github All Releases](https://img.shields.io/github/downloads/Titlehhhh/Minecraft-Holy-Client/total.svg)](https://github.com/Titlehhhh/Minecraft-Holy-Client/releases) *На данный момент программа находится в предварительной версии, поэтому некоторые функции нестабильны. Подробнее можно узнать [здесь](preview.md).* From 5c1b1af9b2b4421906297f80c7d38dbec15e2be3 Mon Sep 17 00:00:00 2001 From: Titlehhhh <93156853+Titlehhhh@users.noreply.github.com> Date: Thu, 28 Dec 2023 17:44:04 +0500 Subject: [PATCH 08/55] =?UTF-8?q?=D0=BE=D0=BF=D0=B5=D1=87=D0=B0=D1=82?= =?UTF-8?q?=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2be3760c..f0019d92 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ > [!WARNING] -> Приложение предназначено для стресс-тестирования своих серверов. Не используйте программу на чужих серверах без согласия владельца. В противном случае ответсвенны за это будете Вы. +> Приложение предназначено для стресс-тестирования своих серверов. Не используйте программу на чужих серверах без согласия владельца. В противном случае ответственны за это будете Вы. [![Discord Banner](https://img.shields.io/badge/discord-join%20chat-46BC99)](https://discord.gg/HVDzx4rCgg) [![Github All Releases](https://img.shields.io/github/downloads/Titlehhhh/Minecraft-Holy-Client/total.svg)](https://github.com/Titlehhhh/Minecraft-Holy-Client/releases) From e4b92f7e95569222d264e292061f3b6e0074f0ab Mon Sep 17 00:00:00 2001 From: TitleHHHH Date: Thu, 28 Dec 2023 20:39:08 +0500 Subject: [PATCH 09/55] singleton RecyclableMemoryStreamManager --- .../HolyClient.StressTest/DefaultBehavior.cs | 2 +- .../IO/MinecraftPrimitiveReader.cs | 4 ++-- .../McProtoNet.Core/Protocol/Extensions.cs | 6 +++--- .../Protocol/MinecraftPacketReader.cs | 16 ++++++++-------- .../Protocol/MinecraftPacketSender.cs | 6 +++--- .../Protocol/PacketReaderWriter.cs | 4 ++-- src/McProtoNet/McProtoNet.Core/SessionToken.cs | 5 ++--- .../McProtoNet.Core/StaticResources.cs | 11 +++++++++++ .../McProtoNet/Client/MinecraftClientCore.cs | 6 +++--- src/McProtoNet/McProtoNet/Performance.cs | 3 ++- 10 files changed, 37 insertions(+), 26 deletions(-) create mode 100644 src/McProtoNet/McProtoNet.Core/StaticResources.cs diff --git a/src/CoreLibs/HolyClient.StressTest/DefaultBehavior.cs b/src/CoreLibs/HolyClient.StressTest/DefaultBehavior.cs index 4348a0f4..f8dbd83a 100644 --- a/src/CoreLibs/HolyClient.StressTest/DefaultBehavior.cs +++ b/src/CoreLibs/HolyClient.StressTest/DefaultBehavior.cs @@ -60,7 +60,7 @@ public Task Activate(CompositeDisposable disposables, IEnumerable ReadToEndAsync(this Stream stream, Memory ReadNextPacketAsync(CancellationToken token) return new( id, - MSmanager.GetStream(memory.Memory.Span.Slice(0, len)), + StaticResources.MSmanager.GetStream(memory.Memory.Span.Slice(0, len)), memory); } @@ -142,7 +142,7 @@ public async ValueTask ReadNextPacketAsync(CancellationToken token) return new Packet( id, - MSmanager.GetStream(memory.Memory.Slice(0, sizeUncompressed).Span), + StaticResources.MSmanager.GetStream(memory.Memory.Slice(0, sizeUncompressed).Span), memory); } @@ -159,7 +159,7 @@ public async ValueTask ReadNextPacketAsync(CancellationToken token) await _baseStream.ReadExactlyAsync(memory.Memory.Slice(0, len), token); return new( id, - MSmanager.GetStream(memory.Memory.Slice(0, len).Span), + StaticResources.MSmanager.GetStream(memory.Memory.Slice(0, len).Span), memory); } diff --git a/src/McProtoNet/McProtoNet.Core/Protocol/MinecraftPacketSender.cs b/src/McProtoNet/McProtoNet.Core/Protocol/MinecraftPacketSender.cs index e84bb799..ddd5d5c6 100644 --- a/src/McProtoNet/McProtoNet.Core/Protocol/MinecraftPacketSender.cs +++ b/src/McProtoNet/McProtoNet.Core/Protocol/MinecraftPacketSender.cs @@ -22,7 +22,7 @@ public MinecraftPacketSender(Stream baseStream) : this(baseStream, true) private readonly byte[] ZERO_VARINT = { 0 }; private SemaphoreSlim semaphore = new SemaphoreSlim(1, 1); - static RecyclableMemoryStreamManager streamManager = new(); + public void SendPacket(Packet packet) { semaphore.Wait(); @@ -47,7 +47,7 @@ public void SendPacket(Packet packet) if (uncompressedSize >= _compressionThreshold) { - using (var compressedPacket = streamManager.GetStream()) + using (var compressedPacket = StaticResources.MSmanager.GetStream()) { using (var zlibStream = new ZLibStream(compressedPacket, CompressionMode.Compress, true)) { @@ -141,7 +141,7 @@ public async ValueTask SendPacketAsync(Packet packet, CancellationToken token = if (uncompressedSize >= _compressionThreshold) { - using (var compressedPacket = streamManager.GetStream()) + using (var compressedPacket = StaticResources.MSmanager.GetStream()) { using (var zlibStream = new ZLibStream(compressedPacket, CompressionMode.Compress, true)) { diff --git a/src/McProtoNet/McProtoNet.Core/Protocol/PacketReaderWriter.cs b/src/McProtoNet/McProtoNet.Core/Protocol/PacketReaderWriter.cs index 60b0de3a..4e6f9725 100644 --- a/src/McProtoNet/McProtoNet.Core/Protocol/PacketReaderWriter.cs +++ b/src/McProtoNet/McProtoNet.Core/Protocol/PacketReaderWriter.cs @@ -57,7 +57,7 @@ public MinecraftPacket ReadNextPacket() } } - static RecyclableMemoryStreamManager streamManager = new(); + public async Task SendPacketAsync(MinecraftPacket packet, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); @@ -65,7 +65,7 @@ public async Task SendPacketAsync(MinecraftPacket packet, CancellationToken canc if (ok) { - using (MemoryStream ms = streamManager.GetStream()) + using (MemoryStream ms = StaticResources.MSmanager.GetStream()) { IMinecraftPrimitiveWriter writer = new MinecraftPrimitiveWriter(ms); packet.Write(writer); diff --git a/src/McProtoNet/McProtoNet.Core/SessionToken.cs b/src/McProtoNet/McProtoNet.Core/SessionToken.cs index 3d5c169d..6e113689 100644 --- a/src/McProtoNet/McProtoNet.Core/SessionToken.cs +++ b/src/McProtoNet/McProtoNet.Core/SessionToken.cs @@ -1,7 +1,6 @@ - - -namespace McProtoNet +namespace McProtoNet { + public struct SessionToken { public string UUID { get; private set; } diff --git a/src/McProtoNet/McProtoNet.Core/StaticResources.cs b/src/McProtoNet/McProtoNet.Core/StaticResources.cs new file mode 100644 index 00000000..2e4d3d57 --- /dev/null +++ b/src/McProtoNet/McProtoNet.Core/StaticResources.cs @@ -0,0 +1,11 @@ + + +using Microsoft.IO; + +namespace McProtoNet +{ + public static class StaticResources + { + public static readonly RecyclableMemoryStreamManager MSmanager = new RecyclableMemoryStreamManager(); + } +} diff --git a/src/McProtoNet/McProtoNet/Client/MinecraftClientCore.cs b/src/McProtoNet/McProtoNet/Client/MinecraftClientCore.cs index 81e45a99..5c6e49d4 100644 --- a/src/McProtoNet/McProtoNet/Client/MinecraftClientCore.cs +++ b/src/McProtoNet/McProtoNet/Client/MinecraftClientCore.cs @@ -329,7 +329,7 @@ public ValueTask SendPacket(Action action, PacketOut return SendPacket(action, _id); } private SemaphoreSlim semaphore = new SemaphoreSlim(1, 1); - static RecyclableMemoryStreamManager streamManager = new(); + public async ValueTask SendPacket(Action action, int id) @@ -337,7 +337,7 @@ public async ValueTask SendPacket(Action action, int await semaphore.WaitAsync(); try { - using (MemoryStream ms = streamManager.GetStream()) + using (MemoryStream ms = StaticResources.MSmanager.GetStream()) { var writer = Performance.Writers.Get(); try @@ -367,7 +367,7 @@ public async ValueTask SendPacketAsync(IOutputPacket packet, int id) await semaphore.WaitAsync(); try { - using (MemoryStream ms = streamManager.GetStream()) + using (MemoryStream ms = StaticResources.MSmanager.GetStream()) { var writer = Performance.Writers.Get(); try diff --git a/src/McProtoNet/McProtoNet/Performance.cs b/src/McProtoNet/McProtoNet/Performance.cs index 5c46f960..dacaae87 100644 --- a/src/McProtoNet/McProtoNet/Performance.cs +++ b/src/McProtoNet/McProtoNet/Performance.cs @@ -1,12 +1,13 @@ using McProtoNet.Core.IO; using McProtoNet.Events; using Microsoft.Extensions.ObjectPool; +using Microsoft.IO; namespace McProtoNet { internal static class Performance { - + internal static ObjectPool Readers { get; private set; } internal static ObjectPool Writers { get; private set; } From 4e6aefa48eb31622e434e030d42fe8452c265d54 Mon Sep 17 00:00:00 2001 From: TitleHHHH Date: Thu, 28 Dec 2023 21:49:15 +0500 Subject: [PATCH 10/55] delete long time live objects --- .../Protocol/MinecraftPacketReader.cs | 50 ++++++++++--------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/src/McProtoNet/McProtoNet.Core/Protocol/MinecraftPacketReader.cs b/src/McProtoNet/McProtoNet.Core/Protocol/MinecraftPacketReader.cs index 81562ed5..b8475bfc 100644 --- a/src/McProtoNet/McProtoNet.Core/Protocol/MinecraftPacketReader.cs +++ b/src/McProtoNet/McProtoNet.Core/Protocol/MinecraftPacketReader.cs @@ -9,7 +9,7 @@ public class MinecraftPacketReader : IMinecraftPacketReader private readonly bool disposeStream; private Stream _baseStream; - private RecyclableMemoryStream fastStream = StaticResources.MSmanager.GetStream() as RecyclableMemoryStream; + //private RecyclableMemoryStream fastStream = StaticResources.MSmanager.GetStream() as RecyclableMemoryStream; @@ -55,24 +55,26 @@ public Packet ReadNextPacket() Memory compressedData = memory.Memory.Slice(0, len); - fastStream.Position = 0; - fastStream.SetLength(len); - var destMemory = fastStream.GetMemory(len); + //fastStream.Position = 0; + //fastStream.SetLength(len); + //var destMemory = fastStream.GetMemory(len); - compressedData.CopyTo(destMemory); - - using (var ReadZlib = new ZLibStream(fastStream, CompressionMode.Decompress, true)) + //compressedData.CopyTo(destMemory); + using (var fastStream = StaticResources.MSmanager.GetStream(compressedData.Span)) { - int id = ReadZlib.ReadVarInt(); + using (var ReadZlib = new ZLibStream(fastStream, CompressionMode.Decompress, true)) + { + int id = ReadZlib.ReadVarInt(); - sizeUncompressed -= id.GetVarIntLength(); + sizeUncompressed -= id.GetVarIntLength(); - ReadZlib.ReadExactly(memory.Memory.Slice(0, sizeUncompressed).Span); + ReadZlib.ReadExactly(memory.Memory.Slice(0, sizeUncompressed).Span); - return new Packet( - id, - StaticResources.MSmanager.GetStream(memory.Memory.Slice(0, sizeUncompressed).Span), - memory); + return new Packet( + id, + StaticResources.MSmanager.GetStream(memory.Memory.Slice(0, sizeUncompressed).Span), + memory); + } } @@ -126,12 +128,12 @@ public async ValueTask ReadNextPacketAsync(CancellationToken token) Memory compressedData = memory.Memory.Slice(0, len); - fastStream.Position = 0; - fastStream.SetLength(len); - var destMemory = fastStream.GetMemory(len); - - compressedData.CopyTo(destMemory); + //fastStream.Position = 0; + //fastStream.SetLength(len); + //var destMemory = fastStream.GetMemory(len); + //compressedData.CopyTo(destMemory); + using (var fastStream = StaticResources.MSmanager.GetStream(compressedData.Span)) using (var ReadZlib = new ZLibStream(fastStream, CompressionMode.Decompress, true)) { int id = await ReadZlib.ReadVarIntAsync(token); @@ -185,8 +187,8 @@ public void Dispose() if (_disposed) return; - fastStream?.Dispose(); - fastStream = null; + //fastStream?.Dispose(); + //fastStream = null; if (disposeStream) { if (_baseStream is not null) @@ -204,10 +206,10 @@ public async ValueTask DisposeAsync() if (_disposed) return; _disposed = true; - if (fastStream is not null) + //if (fastStream is not null) { - await fastStream.DisposeAsync(); - fastStream = null; + //await fastStream.DisposeAsync(); + //fastStream = null; } if (disposeStream) { From 892a5378f23a69a92935f9b2f37e950676519acc Mon Sep 17 00:00:00 2001 From: Titlehhhh <93156853+Titlehhhh@users.noreply.github.com> Date: Mon, 1 Jan 2024 13:37:23 +0500 Subject: [PATCH 11/55] Update --- roadmap.png | Bin 0 -> 266577 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 roadmap.png diff --git a/roadmap.png b/roadmap.png new file mode 100644 index 0000000000000000000000000000000000000000..3a07a87b3201eee5ad2d2b8e9a412e5bbd56f0b5 GIT binary patch literal 266577 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%0AGd~#ByYj$cM=N^WGAVRC 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
^vTA8(2d9t<+8d-QG9t1n-m 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 `_X;i0IP*| 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 gI_Uqr2lw6 Date: Mon, 1 Jan 2024 16:03:06 +0200 Subject: [PATCH 12/55] Update preview.md --- preview.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/preview.md b/preview.md index 2440d5a1..fd77f593 100644 --- a/preview.md +++ b/preview.md @@ -2,22 +2,18 @@ Этот раздел может меняться в течение разработки. Все изменения будут написаны в заметках о выпуске предварительной версии. -# Функции, которые нужно добавить -## Плагины -- Плагин, который будет установлен в программу по умолчанию. Это упростит использование программой простым пользователям. +# Плагины - Возможность перезагружать плагины из менеджера расширений, а также из вкладки "Поведения". - Возможность загружать плагины из NuGet. - Отображение ошибки, если плагин не найден. - Отображение ошибки, если поведение не найдено. -## Прокси -- Прокси по умолчанию. -- Возможность загружать прокси из URL источников, например, из открытых репозиториех GitHub с бесплатными списками прокси. +# Прокси - Возможность загружать прокси с логином и паролем. - Отображение количества загруженных прокси в окне с запуском стресс теста. - Возможность загружать разные типы прокси(HTTP(S), Socks(4/5)) из одного источника. -## Прочее +# Прочее - Система профилей в стресс тесте. From 23530654c84fb46c09b6655b172813a9e04f8c56 Mon Sep 17 00:00:00 2001 From: Titlehhhh <93156853+Titlehhhh@users.noreply.github.com> Date: Fri, 5 Jan 2024 22:10:59 +0500 Subject: [PATCH 13/55] Update README.md --- README.md | 113 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 85 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index f0019d92..69d3a4f2 100644 --- a/README.md +++ b/README.md @@ -1,46 +1,103 @@ -> [!WARNING] -> Приложение предназначено для стресс-тестирования своих серверов. Не используйте программу на чужих серверах без согласия владельца. В противном случае ответственны за это будете Вы. +

+ Minecraft Holy Client +

-[![Discord Banner](https://img.shields.io/badge/discord-join%20chat-46BC99)](https://discord.gg/HVDzx4rCgg) [![Github All Releases](https://img.shields.io/github/downloads/Titlehhhh/Minecraft-Holy-Client/total.svg)](https://github.com/Titlehhhh/Minecraft-Holy-Client/releases) -*На данный момент программа находится в предварительной версии, поэтому некоторые функции нестабильны. Подробнее можно узнать [здесь](preview.md).* +

A high-performance platform for running stress-testing minecraft bots.

-# Minecraft Holy Client +
-## Get Started -[Скачайте в релизах](https://github.com/Titlehhhh/Minecraft-Holy-Client/releases) последнюю версию Minecraft Holy Client и запустите её. +

+ Installation • + Features • + Symbols • + Binds • + Wiki • + Contributing • + Deprecated • + Credits • + Support • + License +

-После запуска приложения Вас встретит окно с главной страницей. -![image](https://github.com/Titlehhhh/Minecraft-Holy-Client/assets/93156853/4d582c49-13bd-44c7-81b4-f6ebd5b924cd) +--- -После открытия навигационного меню Вы увидите несколько пунктов: -- Главная. Страница где есть основная информация о приложении: GitHub, Наш Discord сервер, а также документация(в разрботке). -- Бот менеджер. Эта экспериментальная функция. Планируется в программу добавить простых ботов, таких как, боты афк-рыбалки или подобные. -- Настройки. Вы можете настроить язык. Пока можно настроить только это. -- Стресс-тест. Основная возможность приложения. Здесь Вы можете протестировать Ваш сервер под высокой нагрузкой. -- Управление расширениями. Здесь Вы можете добавить свои плагины в программу. -![image](https://github.com/Titlehhhh/Minecraft-Holy-Client/assets/93156853/3a156e06-bd3c-4882-9c5c-ce123c14b9c2) -### Запуск стресс-теста + + + + +
-1) Перейдем на страницу Стресс-тест и введем Ip адрес сервера, который мы хотим нагрузить. -2) Далее поставить префикс ника для ботов. Пусть будет "Title_" -3) Затем укажем количество ботов. Это количество, которое система будет стремиться запустить. Например 1000. -4) Укажем, что нужно в тестировании использовать прокси сервера, а также укажем версию 1.16.5. -5) В настройках поведения укажем, чтобы боты спамили "Hello from Minecraft Holy Client". -![image](https://github.com/Titlehhhh/Minecraft-Holy-Client/assets/93156853/fdbab77e-0eed-44ed-bbe3-30e6d100802b) +**Minecraft Holy Client** is a handy, **high-performance**, easily extensible **open-source** application designed to run load and stress-test **Minecraft** bots, written in C#. -Нажимаем на зеленую кнопку видим, что боты зашли на сервер и спамят "Hello from Minecraft Holy Client" -![image](https://github.com/Titlehhhh/Minecraft-Holy-Client/assets/93156853/51c89585-1fd5-4351-9677-a59322ececd7) +All components of the application have been designed to **maximize performance**, so it works stably on **weak devices**. -## Roadmap +![Minecraft Holy Client Bots](https://github.com/Titlehhhh/Minecraft-Holy-Client/assets/93156853/75c9f0a3-8ae2-4b7c-8ad5-e8b5fa120165) +

+(Preview 300~ bots) +

-![image](https://github.com/Titlehhhh/Minecraft-Holy-Client/assets/93156853/cee54a39-b6e5-4e10-b329-ec0230eb43b4) +
+## Installation + +Minecraft Holy Client is available for **Windows**, **Linux** and **MacOs**. In addition, it is **portable** and is not installed on the system, so it can be easily uninstalled. + +[Download](https://github.com/Titlehhhh/Minecraft-Holy-Client/releases) the latest version of HolyClient.Desktop and follow these instructions depending on your platform. + +### Windows + +1) Open and _extract_ the archive with the program. +2) Run **HolyClient.Desktop.exe** + +### Linux + +_Using Ubuntu as an example_ + +1) Open and _extract_ the archive with the program. +2) Open a terminal where the HolyClient.Desktop file is located and execute `./HolyClient.Desktop` in the console + +### Mac Os + +1) Open and _extract_ the archive with the program. +2) Open a terminal where the HolyClient.Desktop file is located and execute `./HolyClient.Desktop` in the console + +## Features + +| | Enable | Note +| -------------------------- | :-----------------:| +| Multiversion | ✔️ | +| Useful scripts | ✔️ | +| Enabled in-game advantages | ✔️ | +| Documented commands | ✔️ | +| No misconfigured commands | ✔️ | +| Professional info sources | ✔️ | +| Clean sheet/template | ✔️ | +| Easy to customize | ✔️ | +| Categorized by functions | ✔️ | +| New commands/values | ✔️ | +| No old command leftovers | ✔️ | From 41d6c14925a6dc947881807cebb435c18a8e7e84 Mon Sep 17 00:00:00 2001 From: Titlehhhh <93156853+Titlehhhh@users.noreply.github.com> Date: Fri, 5 Jan 2024 22:59:24 +0500 Subject: [PATCH 14/55] Update README.md --- README.md | 46 +++++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 69d3a4f2..2de5e0bb 100644 --- a/README.md +++ b/README.md @@ -28,14 +28,10 @@

Installation • - Features • - Symbols • - Binds • - Wiki • - Contributing • - Deprecated • - Credits • - Support • + Launch • + Features • + Contributing • + Custom pluginLicense

@@ -83,21 +79,29 @@ _Using Ubuntu as an example_ 1) Open and _extract_ the archive with the program. 2) Open a terminal where the HolyClient.Desktop file is located and execute `./HolyClient.Desktop` in the console + +## Launch + +When we have launched the app, then we can safely go to the "Stress Test" tab and we can launch bots. + + + +![image](https://github.com/Titlehhhh/Minecraft-Holy-Client/assets/93156853/55769ef1-f81d-477d-9027-02dfa0339f80) + + ## Features -| | Enable | Note -| -------------------------- | :-----------------:| -| Multiversion | ✔️ | -| Useful scripts | ✔️ | -| Enabled in-game advantages | ✔️ | -| Documented commands | ✔️ | -| No misconfigured commands | ✔️ | -| Professional info sources | ✔️ | -| Clean sheet/template | ✔️ | -| Easy to customize | ✔️ | -| Categorized by functions | ✔️ | -| New commands/values | ✔️ | -| No old command leftovers | ✔️ | +- **Custom proxies**. It is possible to load custom proxies from a link and a file. +- **Multiverse in bots**. Bots can enter servers from 1.12.2 to 1.19.3. Temporarily not all packets are supported, this is being actively worked on. +- **Using user behavior for stress testing**. There is a default behavior in the program, but it is not very rich in functionality. + +## Contributing + +Contributions are always welcome! + +## Custom plugin + + From fa052c5b8e49f93fe5c66da201eef346161e09f7 Mon Sep 17 00:00:00 2001 From: Titlehhhh <93156853+Titlehhhh@users.noreply.github.com> Date: Fri, 5 Jan 2024 23:04:48 +0500 Subject: [PATCH 15/55] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 2de5e0bb..186c3d28 100644 --- a/README.md +++ b/README.md @@ -101,6 +101,8 @@ Contributions are always welcome! ## Custom plugin +The default plugin has few features. It just sends `/register ` first and starts spamming immediately. +Minecraft servers are a large number, with different anti-bot systems and if you want to test your server for bot attacks, it makes sense to write a custom plugin that would bypass it. How to write custom plugins is written here. From b14c7a1a9a6108893e5692b625ec412d73626dc2 Mon Sep 17 00:00:00 2001 From: Titlehhhh <93156853+Titlehhhh@users.noreply.github.com> Date: Fri, 5 Jan 2024 23:07:03 +0500 Subject: [PATCH 16/55] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 186c3d28..05f2bc18 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ When we have launched the app, then we can safely go to the "Stress Test" tab an - **Custom proxies**. It is possible to load custom proxies from a link and a file. - **Multiverse in bots**. Bots can enter servers from 1.12.2 to 1.19.3. Temporarily not all packets are supported, this is being actively worked on. -- **Using user behavior for stress testing**. There is a default behavior in the program, but it is not very rich in functionality. +- **Using user behavior for stress testing**. ## Contributing From a026050bf5d89a3ab83cb57ff22d66f1c49dc742 Mon Sep 17 00:00:00 2001 From: Titlehhhh <93156853+Titlehhhh@users.noreply.github.com> Date: Sat, 6 Jan 2024 09:14:59 +0500 Subject: [PATCH 17/55] Create tasks.md --- tasks.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 tasks.md diff --git a/tasks.md b/tasks.md new file mode 100644 index 00000000..fd39399d --- /dev/null +++ b/tasks.md @@ -0,0 +1,22 @@ +- Вырезать бот менеджер +- на главную страницу добавить ссылку на Release Notes + + + +- Сделать систему профилей +- Number of bots переименовать во что то связанное с паралелностью +- Сделать возможность загрузки прокси с логином и паролем +- сделать возможность загрузки разных прокси из одного источника +- Добавить флажок "Загрузка офлайн" у файла и ссылки +- добавить больше настроек в поведение +- В процессе добавить две вкладки: + - Графики с метриками + - Популярные исключения + +- Генерация отчетов на основе стресс-теста +- Разделение чекинга прокси и стресс-теста +- Добавить вкладку с атакой разными методами +- Динамическая перезагрузка плагинов +- Загрузка плагинов из NuGet +- В настройках сделать красиво +- Добавить автообновление программы From 85edc654efb796c3c09a7c93ae1b058d4573147b Mon Sep 17 00:00:00 2001 From: Titlehhhh <93156853+Titlehhhh@users.noreply.github.com> Date: Sat, 6 Jan 2024 09:16:41 +0500 Subject: [PATCH 18/55] Update tasks.md --- tasks.md | 1 + 1 file changed, 1 insertion(+) diff --git a/tasks.md b/tasks.md index fd39399d..b2d2347f 100644 --- a/tasks.md +++ b/tasks.md @@ -20,3 +20,4 @@ - Загрузка плагинов из NuGet - В настройках сделать красиво - Добавить автообновление программы +- В процессе кнопку отмены вынести отдельно и красиво и перекрасить в красный From 8eb3d0cf85f9bf733591b26943f20d6e0b4fd890 Mon Sep 17 00:00:00 2001 From: Titlehhhh <93156853+Titlehhhh@users.noreply.github.com> Date: Sat, 6 Jan 2024 09:19:46 +0500 Subject: [PATCH 19/55] Update tasks.md --- tasks.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tasks.md b/tasks.md index b2d2347f..3b37ddfa 100644 --- a/tasks.md +++ b/tasks.md @@ -2,6 +2,7 @@ - на главную страницу добавить ссылку на Release Notes +# General - Сделать систему профилей - Number of bots переименовать во что то связанное с паралелностью @@ -21,3 +22,11 @@ - В настройках сделать красиво - Добавить автообновление программы - В процессе кнопку отмены вынести отдельно и красиво и перекрасить в красный + +# Documentation + +Сделать документацию по созданию плагинов + +# Future + +Сделать генерацию пакетов с помощью codegen From 69796a2c87ff436142c644686fc7c02b8dd6c03f Mon Sep 17 00:00:00 2001 From: Titlehhhh <93156853+Titlehhhh@users.noreply.github.com> Date: Sat, 6 Jan 2024 09:21:06 +0500 Subject: [PATCH 20/55] Update tasks.md --- tasks.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tasks.md b/tasks.md index 3b37ddfa..91eb93ec 100644 --- a/tasks.md +++ b/tasks.md @@ -30,3 +30,9 @@ # Future Сделать генерацию пакетов с помощью codegen + + +# Readme + +- добавить RoadMap +- Добавить release notes From 8bf237a161aba411124cf1ca843910098505d24c Mon Sep 17 00:00:00 2001 From: Titlehhhh <93156853+Titlehhhh@users.noreply.github.com> Date: Sat, 6 Jan 2024 09:22:31 +0500 Subject: [PATCH 21/55] Create changelog.md --- changelog.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 changelog.md diff --git a/changelog.md b/changelog.md new file mode 100644 index 00000000..db54dfdd --- /dev/null +++ b/changelog.md @@ -0,0 +1,2 @@ +- memory performance +- default plugin /reg to /regoster From a23b2436ba6da720a2022d7c1fd8d8c5d000c6ab Mon Sep 17 00:00:00 2001 From: TitleHHHH Date: Sat, 6 Jan 2024 09:42:25 +0500 Subject: [PATCH 22/55] change tasks.md --- tasks.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tasks.md b/tasks.md index 91eb93ec..66c5708e 100644 --- a/tasks.md +++ b/tasks.md @@ -36,3 +36,7 @@ - добавить RoadMap - Добавить release notes + +# Disocrd + +- Уведомление о новой версии в дискорд From fb3152e6e0fa0a36876d4e9bfc56907237bec735 Mon Sep 17 00:00:00 2001 From: TitleHHHH Date: Sat, 6 Jan 2024 09:47:33 +0500 Subject: [PATCH 23/55] add release notes --- ReleaseNotes/2.0.0-preview.2/En.md | 0 ReleaseNotes/2.0.0-preview.2/Ru.md | 2 ++ changelog.md | 2 -- tasks.md | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 ReleaseNotes/2.0.0-preview.2/En.md create mode 100644 ReleaseNotes/2.0.0-preview.2/Ru.md delete mode 100644 changelog.md diff --git a/ReleaseNotes/2.0.0-preview.2/En.md b/ReleaseNotes/2.0.0-preview.2/En.md new file mode 100644 index 00000000..e69de29b diff --git a/ReleaseNotes/2.0.0-preview.2/Ru.md b/ReleaseNotes/2.0.0-preview.2/Ru.md new file mode 100644 index 00000000..d885aba8 --- /dev/null +++ b/ReleaseNotes/2.0.0-preview.2/Ru.md @@ -0,0 +1,2 @@ +- memory performance +- default plugin /reg to /register \ No newline at end of file diff --git a/changelog.md b/changelog.md deleted file mode 100644 index db54dfdd..00000000 --- a/changelog.md +++ /dev/null @@ -1,2 +0,0 @@ -- memory performance -- default plugin /reg to /regoster diff --git a/tasks.md b/tasks.md index 66c5708e..9299a3b5 100644 --- a/tasks.md +++ b/tasks.md @@ -37,6 +37,6 @@ - добавить RoadMap - Добавить release notes -# Disocrd +# Discord - Уведомление о новой версии в дискорд From 3ff9672b28ccb3e097c4d9aceda9c968700f0bbd Mon Sep 17 00:00:00 2001 From: TitleHHHH Date: Sat, 6 Jan 2024 09:57:06 +0500 Subject: [PATCH 24/55] change tasks.md --- tasks.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tasks.md b/tasks.md index 9299a3b5..b46903e0 100644 --- a/tasks.md +++ b/tasks.md @@ -22,6 +22,11 @@ - В настройках сделать красиво - Добавить автообновление программы - В процессе кнопку отмены вынести отдельно и красиво и перекрасить в красный +- Добавить логгер в плагины +- Добавить логгер в программу +- Добавить дилоговое окно с фатальной ошибкой +- Протестить minver перед релизом +- Добавить возможность плагинам делать свой UI # Documentation @@ -36,6 +41,7 @@ - добавить RoadMap - Добавить release notes +- Disclaimer # Discord From a29814979210352d7e6a4bbc6f3e226b11018622 Mon Sep 17 00:00:00 2001 From: Titlehhhh <93156853+Titlehhhh@users.noreply.github.com> Date: Sat, 6 Jan 2024 10:06:14 +0500 Subject: [PATCH 25/55] Update continuous.yml --- .github/workflows/continuous.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/continuous.yml b/.github/workflows/continuous.yml index 73cdef68..077499cf 100644 --- a/.github/workflows/continuous.yml +++ b/.github/workflows/continuous.yml @@ -9,6 +9,7 @@ on: - '**/*.md' - '**/*.gitignore' - '**/*.gitattributes' + - mhc.svg @@ -150,4 +151,4 @@ jobs: -#dotnet.exe publish ~\Minecraft-Holy-Client\Minecraft-Holy-Client\src\Platforms\HolyClient.Desktop\HolyClient.Desktop.csproj --no-restore --no-build /property:DebugType=None /property:DebugSymbols=False /property:PublishProfile=FolderProfile /property:PublishDir=~\Minecraft-Holy-Client\Minecraft-Holy-Client\.artifacts \ No newline at end of file +#dotnet.exe publish ~\Minecraft-Holy-Client\Minecraft-Holy-Client\src\Platforms\HolyClient.Desktop\HolyClient.Desktop.csproj --no-restore --no-build /property:DebugType=None /property:DebugSymbols=False /property:PublishProfile=FolderProfile /property:PublishDir=~\Minecraft-Holy-Client\Minecraft-Holy-Client\.artifacts From 9ef3bc01615f07a2c8d4948dadfe9e307ce593df Mon Sep 17 00:00:00 2001 From: TitleHHHH Date: Sat, 6 Jan 2024 10:10:46 +0500 Subject: [PATCH 26/55] clear commentar --- .../Protocol/MinecraftPacketReader.cs | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/McProtoNet/McProtoNet.Core/Protocol/MinecraftPacketReader.cs b/src/McProtoNet/McProtoNet.Core/Protocol/MinecraftPacketReader.cs index b8475bfc..86403da3 100644 --- a/src/McProtoNet/McProtoNet.Core/Protocol/MinecraftPacketReader.cs +++ b/src/McProtoNet/McProtoNet.Core/Protocol/MinecraftPacketReader.cs @@ -9,8 +9,7 @@ public class MinecraftPacketReader : IMinecraftPacketReader private readonly bool disposeStream; private Stream _baseStream; - //private RecyclableMemoryStream fastStream = StaticResources.MSmanager.GetStream() as RecyclableMemoryStream; - + public MinecraftPacketReader(Stream baseStream, bool disposeStream) @@ -55,11 +54,6 @@ public Packet ReadNextPacket() Memory compressedData = memory.Memory.Slice(0, len); - //fastStream.Position = 0; - //fastStream.SetLength(len); - //var destMemory = fastStream.GetMemory(len); - - //compressedData.CopyTo(destMemory); using (var fastStream = StaticResources.MSmanager.GetStream(compressedData.Span)) { using (var ReadZlib = new ZLibStream(fastStream, CompressionMode.Decompress, true)) @@ -128,11 +122,6 @@ public async ValueTask ReadNextPacketAsync(CancellationToken token) Memory compressedData = memory.Memory.Slice(0, len); - //fastStream.Position = 0; - //fastStream.SetLength(len); - //var destMemory = fastStream.GetMemory(len); - - //compressedData.CopyTo(destMemory); using (var fastStream = StaticResources.MSmanager.GetStream(compressedData.Span)) using (var ReadZlib = new ZLibStream(fastStream, CompressionMode.Decompress, true)) { From f1d288f77a9afaec26b4bff86a174cfd500eaa20 Mon Sep 17 00:00:00 2001 From: Titlehhhh <93156853+Titlehhhh@users.noreply.github.com> Date: Sat, 6 Jan 2024 10:49:13 +0500 Subject: [PATCH 27/55] Update tasks.md --- tasks.md | 1 + 1 file changed, 1 insertion(+) diff --git a/tasks.md b/tasks.md index b46903e0..32bf8bcf 100644 --- a/tasks.md +++ b/tasks.md @@ -5,6 +5,7 @@ # General - Сделать систему профилей +- Ники из файла - Number of bots переименовать во что то связанное с паралелностью - Сделать возможность загрузки прокси с логином и паролем - сделать возможность загрузки разных прокси из одного источника From 799c9fa8b62485ed0e22e19d97a2f13ef272f93b Mon Sep 17 00:00:00 2001 From: TitleHHHH Date: Sat, 6 Jan 2024 10:40:08 +0500 Subject: [PATCH 28/55] delete --- src/HolyClient/BootStrap.cs | 3 +- .../DesignTime/DesignBotManagerViewModel.cs | 59 ----- .../DesignBottingProfileViewModel.cs | 40 ---- src/HolyClient/HolyClient.csproj | 6 - .../ViewModels/IBotManagerViewModel.cs | 20 -- .../ViewModels/IBotProfileViewModel.cs | 22 -- src/HolyClient/Models/Page.cs | 6 +- .../Pages/BotManager/BotManagerViewModel.cs | 129 ----------- .../Pages/BotManager/BotProfileViewModel.cs | 211 ------------------ .../Pages/BotManager/ConsoleViewModel.cs | 53 ----- src/HolyClient/Views/MainView.axaml | 8 +- .../Pages/BotManager/BotManagerMainView.axaml | 61 ----- .../BotManager/BotManagerMainView.axaml.cs | 14 -- .../Pages/BotManager/BotManagerView.axaml | 47 ---- .../Pages/BotManager/BotManagerView.axaml.cs | 44 ---- .../Pages/BotManager/BotProfileView.axaml | 210 ----------------- .../Pages/BotManager/BotProfileView.axaml.cs | 14 -- .../Pages/BotManager/EmptyProfilesView.axaml | 12 - .../BotManager/EmptyProfilesView.axaml.cs | 12 - src/HolyClient/lang/words.loc.json | 102 +-------- 20 files changed, 5 insertions(+), 1068 deletions(-) delete mode 100644 src/HolyClient/DesignTime/DesignBotManagerViewModel.cs delete mode 100644 src/HolyClient/DesignTime/DesignBottingProfileViewModel.cs delete mode 100644 src/HolyClient/Interfaces/ViewModels/IBotManagerViewModel.cs delete mode 100644 src/HolyClient/Interfaces/ViewModels/IBotProfileViewModel.cs delete mode 100644 src/HolyClient/ViewModels/Pages/BotManager/BotManagerViewModel.cs delete mode 100644 src/HolyClient/ViewModels/Pages/BotManager/BotProfileViewModel.cs delete mode 100644 src/HolyClient/ViewModels/Pages/BotManager/ConsoleViewModel.cs delete mode 100644 src/HolyClient/Views/Pages/BotManager/BotManagerMainView.axaml delete mode 100644 src/HolyClient/Views/Pages/BotManager/BotManagerMainView.axaml.cs delete mode 100644 src/HolyClient/Views/Pages/BotManager/BotManagerView.axaml delete mode 100644 src/HolyClient/Views/Pages/BotManager/BotManagerView.axaml.cs delete mode 100644 src/HolyClient/Views/Pages/BotManager/BotProfileView.axaml delete mode 100644 src/HolyClient/Views/Pages/BotManager/BotProfileView.axaml.cs delete mode 100644 src/HolyClient/Views/Pages/BotManager/EmptyProfilesView.axaml delete mode 100644 src/HolyClient/Views/Pages/BotManager/EmptyProfilesView.axaml.cs diff --git a/src/HolyClient/BootStrap.cs b/src/HolyClient/BootStrap.cs index ca84e8bd..9a27bbb7 100644 --- a/src/HolyClient/BootStrap.cs +++ b/src/HolyClient/BootStrap.cs @@ -145,8 +145,7 @@ private static void RegisterStates(MainState state) private static void RegisterPages() { - Locator.CurrentMutable.RegisterConstant(new HomeViewModel(), nameof(Page.Home)); - Locator.CurrentMutable.RegisterConstant(new BotManagerViewModel(), nameof(Page.BotManager)); + Locator.CurrentMutable.RegisterConstant(new HomeViewModel(), nameof(Page.Home)); Locator.CurrentMutable.RegisterConstant(new SettingsViewModel(), nameof(Page.Settings)); Locator.CurrentMutable.RegisterConstant(new StressTestViewModel(), nameof(Page.StressTest)); Locator.CurrentMutable.RegisterConstant(new ManagingExtensionsViewModel(), nameof(Page.ManagingExtensions)); diff --git a/src/HolyClient/DesignTime/DesignBotManagerViewModel.cs b/src/HolyClient/DesignTime/DesignBotManagerViewModel.cs deleted file mode 100644 index 67656add..00000000 --- a/src/HolyClient/DesignTime/DesignBotManagerViewModel.cs +++ /dev/null @@ -1,59 +0,0 @@ -using HolyClient.ViewModels; -using ReactiveUI; -using System; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Linq; -using System.Reactive; - -namespace HolyClient.DesignTime -{ - public class DesignBotManagerViewModel : IBotManagerViewModel - { - public DesignBotManagerViewModel() - { - ObservableCollection profiles = new() - { - new DesignBotProfileViewModel() - { - Name = "New Profile" - } - }; - Profiles = new(profiles); - SelectedProfile = Profiles.First(); - - } - - public ViewModelActivator Activator { get; } = new(); - - public ReactiveCommand CreateProfileCommand { get; } - - public IScreen HostScreen => null; - - public ReadOnlyObservableCollection Profiles { get; } - - public RoutingState Router { get; set; } - - - public IBotProfileViewModel SelectedProfile { get; set; } - - public string? UrlPathSegment => "botManager"; - - public Interaction Dialog => throw new NotImplementedException(); - - public ReactiveCommand RemoveProfileCommand => throw new NotImplementedException(); - - public event PropertyChangedEventHandler? PropertyChanged; - public event PropertyChangingEventHandler? PropertyChanging; - - public void RaisePropertyChanged(PropertyChangedEventArgs args) - { - throw new NotImplementedException(); - } - - public void RaisePropertyChanging(PropertyChangingEventArgs args) - { - throw new NotImplementedException(); - } - } -} diff --git a/src/HolyClient/DesignTime/DesignBottingProfileViewModel.cs b/src/HolyClient/DesignTime/DesignBottingProfileViewModel.cs deleted file mode 100644 index 3f39d06f..00000000 --- a/src/HolyClient/DesignTime/DesignBottingProfileViewModel.cs +++ /dev/null @@ -1,40 +0,0 @@ -using HolyClient.ViewModels; -using McProtoNet; -using ReactiveUI; -using System; -using System.Collections.ObjectModel; -using System.Windows.Input; - -namespace HolyClient.DesignTime -{ - public class DesignBotProfileViewModel : IBotProfileViewModel - { - public ViewModelActivator Activator { get; } - - public Guid Id => Guid.NewGuid(); - - public string Name { get; set; } - - public ICommand StartBotCommand => throw new NotImplementedException(); - - public ICommand StopBotCommand => throw new NotImplementedException(); - - public RoutingState Router => throw new NotImplementedException(); - - - - public ObservableCollection LogItems => throw new NotImplementedException(); - - public ConsoleViewModel Console => throw new NotImplementedException(); - - public string Server { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } - public string Nickname { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } - public MinecraftVersion Version { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } - public int SelectedTab { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } - - public void Dispose() - { - - } - } -} diff --git a/src/HolyClient/HolyClient.csproj b/src/HolyClient/HolyClient.csproj index f68627da..d130c87e 100644 --- a/src/HolyClient/HolyClient.csproj +++ b/src/HolyClient/HolyClient.csproj @@ -68,12 +68,6 @@ - - BotProfileView.axaml - - - EmptyProfilesView.axaml - AssemblyManagerView.axaml diff --git a/src/HolyClient/Interfaces/ViewModels/IBotManagerViewModel.cs b/src/HolyClient/Interfaces/ViewModels/IBotManagerViewModel.cs deleted file mode 100644 index 43cc0579..00000000 --- a/src/HolyClient/Interfaces/ViewModels/IBotManagerViewModel.cs +++ /dev/null @@ -1,20 +0,0 @@ -using ReactiveUI; -using System.Collections.ObjectModel; -using System.Reactive; - -namespace HolyClient.ViewModels -{ - public interface IBotManagerViewModel - { - public Interaction Dialog { get; } - - ViewModelActivator Activator { get; } - ReactiveCommand CreateProfileCommand { get; } - ReactiveCommand RemoveProfileCommand { get; } - - ReadOnlyObservableCollection Profiles { get; } - - IBotProfileViewModel SelectedProfile { get; set; } - string? UrlPathSegment { get; } - } -} \ No newline at end of file diff --git a/src/HolyClient/Interfaces/ViewModels/IBotProfileViewModel.cs b/src/HolyClient/Interfaces/ViewModels/IBotProfileViewModel.cs deleted file mode 100644 index 72d8a82c..00000000 --- a/src/HolyClient/Interfaces/ViewModels/IBotProfileViewModel.cs +++ /dev/null @@ -1,22 +0,0 @@ -using McProtoNet; -using ReactiveUI; -using System; - -namespace HolyClient.ViewModels -{ - public interface IBotProfileViewModel : IActivatableViewModel - { - Guid Id { get; } - string Name { get; set; } - string Server { get; set; } - string Nickname { get; set; } - MinecraftVersion Version { get; set; } - - int SelectedTab { get; set; } - ConsoleViewModel Console { get; } - - - - - } -} \ No newline at end of file diff --git a/src/HolyClient/Models/Page.cs b/src/HolyClient/Models/Page.cs index 3e3a9f0f..cb6053f8 100644 --- a/src/HolyClient/Models/Page.cs +++ b/src/HolyClient/Models/Page.cs @@ -3,11 +3,9 @@ public enum Page { - Home, - BotManager, + Home, StressTest, - ManagingExtensions, - Sniffer, + ManagingExtensions, Settings } diff --git a/src/HolyClient/ViewModels/Pages/BotManager/BotManagerViewModel.cs b/src/HolyClient/ViewModels/Pages/BotManager/BotManagerViewModel.cs deleted file mode 100644 index ca1b2e9f..00000000 --- a/src/HolyClient/ViewModels/Pages/BotManager/BotManagerViewModel.cs +++ /dev/null @@ -1,129 +0,0 @@ -using DynamicData; -using DynamicData.Binding; -using HolyClient.Contracts.Models; -using ReactiveUI; -using ReactiveUI.Fody.Helpers; -using Splat; -using System; -using System.Collections.ObjectModel; -using System.Linq; -using System.Reactive; -using System.Reactive.Disposables; -using System.Reactive.Linq; - -namespace HolyClient.ViewModels; - - -public class BotManagerViewModel : ReactiveObject, IRoutableViewModel, IBotManagerViewModel, IActivatableViewModel -{ - - - - public string? UrlPathSegment => "/botmanager"; - - public IScreen HostScreen { get; } - - - - [Reactive] - public ReadOnlyObservableCollection Profiles { get; private set; } - - [Reactive] - public ReactiveCommand CreateProfileCommand { get; private set; } - [Reactive] - public ReactiveCommand RemoveProfileCommand { get; private set; } - - - - [Reactive] - public IBotProfileViewModel SelectedProfile { get; set; } - - public ViewModelActivator Activator { get; } = new(); - - public Interaction Dialog { get; } = new(); - - public BotManagerViewModel() - { - var state = Locator.Current.GetService(); - - CreateProfileCommand = - ReactiveCommand.Create(() => - { - var newProfile = state.CreateAndAddBot(); - newProfile.Name = "New Profile"; - }); - - RemoveProfileCommand = - ReactiveCommand.CreateFromTask(async () => - { - if (await Dialog.Handle(Unit.Default) && SelectedProfile is { }) - { - state.RemoveBot(SelectedProfile.Id); - SelectedProfile = Profiles.FirstOrDefault(); - } - else - { - - } - - - }); - - - state.Profiles - .Connect() - .Transform(x => - { - return (IBotProfileViewModel)new BotProfileViewModel(x); - }) - .ObserveOn(RxApp.MainThreadScheduler) - .Bind(out var _profiles) - .DisposeMany() - .Subscribe(); - - - - Profiles = _profiles; - var outputCollectionChanges = Profiles - .ToObservableChangeSet(x => x.Id) - .Publish() - .RefCount(); - - - - - - outputCollectionChanges - .ObserveOn(RxApp.MainThreadScheduler) - .OnItemAdded(profile => SelectedProfile = profile) - .Subscribe(); - - - outputCollectionChanges - .ObserveOn(RxApp.MainThreadScheduler) - .OnItemRemoved(profile => - { - SelectedProfile = Profiles.FirstOrDefault(); - }) - .Subscribe(); - - - - this.WhenActivated(d => - { - SelectedProfile = _profiles.FirstOrDefault(x => x.Id == state.SelectedProfile, _profiles.FirstOrDefault()); - this.WhenAnyValue(x => x.SelectedProfile) - .Where(x => x is { }) - .Subscribe(x => - { - Console.WriteLine("Select: " + x.Id); - state.SelectedProfile = x.Id; - }) - .DisposeWith(d); - }); - } - - -} - - diff --git a/src/HolyClient/ViewModels/Pages/BotManager/BotProfileViewModel.cs b/src/HolyClient/ViewModels/Pages/BotManager/BotProfileViewModel.cs deleted file mode 100644 index d43d1856..00000000 --- a/src/HolyClient/ViewModels/Pages/BotManager/BotProfileViewModel.cs +++ /dev/null @@ -1,211 +0,0 @@ -using HolyClient.Commands; -using HolyClient.Contracts.Models; -using HolyClient.LoadPlugins.Models; -using HolyClient.Models; -using McProtoNet; -using ReactiveUI; -using ReactiveUI.Fody.Helpers; -using System; -using System.Collections.ObjectModel; -using System.Linq; -using System.Reactive; -using System.Reactive.Disposables; -using System.Reactive.Linq; -using System.Reactive.Subjects; -using System.Threading; -using System.Windows.Input; - -namespace HolyClient.ViewModels -{ - public class BotProfileViewModel : ReactiveObject, IBotProfileViewModel, IDisposable - { - #region Commands - public StartStopBotCommand StartStopCommand { get; } - - public ICommand AddPluginCommand { get; } - - public ICommand RemovePluginCommand { get; } - - #endregion - #region Properties - - public bool IsActivate { get; private set; } - public ViewModelActivator Activator { get; } = new(); - public MinecraftVersion[] SupportedVersions { get; } = Enum.GetValues(); - public ConsoleViewModel Console { get; } - public Guid Id => _profile.Id; - public string Name - { - get => _profile.Name; - set - { - _profile.Name = value; - this.RaisePropertyChanged(); - } - } - - public string Server - { - get => _profile.Server; - set => _profile.Server = value; - } - - public string Nickname - { - get => _profile.Nickname; - set => _profile.Nickname = value; - } - - public MinecraftVersion Version - { - get => _profile.Version; - set => _profile.Version = value; - } - - public int SelectedTab - { - get => _profile.SelectedTab; - set => _profile.SelectedTab = value; - } - - - [Reactive] - public ReadOnlyObservableCollection AvailablePlugins { get; private set; } - - - [Reactive] - public ObservableCollection LoadedPlugins { get; private set; } = new(); - - [Reactive] - public BotPluginViewModel? SelectedAvailablePlugin { get; set; } - [Reactive] - public BotPluginViewModel? SelectedLoadedPlugin { get; set; } - #endregion - - private IBotProfile _profile; - private IDisposable? _cleanUp; - - public BotProfileViewModel(IBotProfile profile) - { - try - { - CompositeDisposable d = new CompositeDisposable(); - - _profile = profile; - - Name = _profile.Name; - - - - Console = new ConsoleViewModel(); - - Serilog.ILogger logger = this.Console; - - - this.StartStopCommand = new StartStopBotCommand(_profile, logger); - - Func createVM = x => new BotPluginViewModel(x); - - - - LoadedPlugins = new(profile.PluignStore.Plugins.Select(createVM)); - - Subject filterAvailablePlugins = new(); - - filterAvailablePlugins.DisposeWith(d); - - return; - - //var pluginProvider = Locator.Current.GetService(); - - - //pluginProvider.AvailableBotPlugins - // .Connect() - // .ObserveOn(RxApp.MainThreadScheduler) - // .Filter(predicateChanged: filterAvailablePlugins.Select(x => this.BuildFilterAvailablePlugins())) - // .Transform(createVM) - - // .Bind(out var plugins) - // .Subscribe() - // .DisposeWith(d); - - //AvailablePlugins = plugins; - - filterAvailablePlugins.OnNext(default); - - - var canExectuteAddPlugin = this - .WhenAnyValue(x => x.SelectedAvailablePlugin) - .Select(x => x is not null); - - AddPluginCommand = ReactiveCommand.Create(() => - { - //var pl = pluginProvider.AvailableBotPlugins.Lookup(this.SelectedAvailablePlugin.Token); - - //if (pl.HasValue) - //{ - // this._profile.PluignStore.AddPlugin(pl.Value); - - // LoadedPlugins.Add(this.SelectedAvailablePlugin); - //} - - //filterAvailablePlugins.OnNext(default); - - }, canExecute: canExectuteAddPlugin).DisposeWith(d); - - - RemovePluginCommand = ReactiveCommand.Create(() => - { - - this._profile.PluignStore.RemovePlugin(this.SelectedLoadedPlugin.Token); - - LoadedPlugins.Remove(this.SelectedLoadedPlugin); - - filterAvailablePlugins.OnNext(default); - - }, canExecute: this.WhenAnyValue(x => x.SelectedLoadedPlugin).Select(x => x is not null)); - - _cleanUp = d; - } - catch (Exception ex) - { - System.Console.WriteLine(ex); - } - } - - private Func BuildFilterAvailablePlugins() - { - - return FilterAvailablePlugins; - } - private bool FilterAvailablePlugins(IBotPluginCreater creater) - { - if (this._profile.PluignStore.Contains(creater.Token)) - { - return false; - } - return true; - } - - public void Dispose() - { - System.Console.WriteLine("Dispose Bot Profile View Model"); - Interlocked.Exchange(ref _cleanUp, null)?.Dispose(); - } - } - - - public class BotPluginViewModel : ReactiveObject - { - public BotPluginReference Token => _model.Token; - - public string Name => _model.Name; - - private IBotPluginCreater _model; - - public BotPluginViewModel(IBotPluginCreater model) - { - _model = model; - } - } -} diff --git a/src/HolyClient/ViewModels/Pages/BotManager/ConsoleViewModel.cs b/src/HolyClient/ViewModels/Pages/BotManager/ConsoleViewModel.cs deleted file mode 100644 index d91100a8..00000000 --- a/src/HolyClient/ViewModels/Pages/BotManager/ConsoleViewModel.cs +++ /dev/null @@ -1,53 +0,0 @@ -using Avalonia.Threading; -using ReactiveUI; -using Serilog; -using Serilog.Events; -using System; -using System.Collections.ObjectModel; -using System.Windows.Input; - -namespace HolyClient.ViewModels -{ - public class ConsoleViewModel : ReactiveObject, ILogger - { - - - public void Clear() => LogItems.Clear(); - public ICommand SendCommand { get; } - public string MessageText { get; set; } - private ObservableCollection _log = new(); - public ObservableCollection LogItems => _log; - - public async void Write(LogEvent logEvent) - { - - string level = logEvent.Level switch - { - (LogEventLevel.Debug) => "DEBUG", - (LogEventLevel.Error) => "ERROR", - (LogEventLevel.Fatal) => "FATAL", - (LogEventLevel.Information) => "INFO", - (LogEventLevel.Verbose) => "VERB", - (LogEventLevel.Warning) => "WARN" - }; - - string date = logEvent.Timestamp.ToString("T"); - - - - await Dispatcher.UIThread.InvokeAsync(() => - { - _log.Add($"[{date}] [{level}] {logEvent.MessageTemplate.Text} {FormatException(logEvent.Exception)}"); - }); - } - private string FormatException(Exception? ex) - { - if (ex is null) - return null; - - return $"\n{ex.Message}\n{ex.StackTrace}"; - - } - } - -} diff --git a/src/HolyClient/Views/MainView.axaml b/src/HolyClient/Views/MainView.axaml index 602034bb..36adbec8 100644 --- a/src/HolyClient/Views/MainView.axaml +++ b/src/HolyClient/Views/MainView.axaml @@ -13,7 +13,6 @@ - @@ -38,12 +37,7 @@ - - - BotManager - - - + StressTest diff --git a/src/HolyClient/Views/Pages/BotManager/BotManagerMainView.axaml b/src/HolyClient/Views/Pages/BotManager/BotManagerMainView.axaml deleted file mode 100644 index 05ab0b70..00000000 --- a/src/HolyClient/Views/Pages/BotManager/BotManagerMainView.axaml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/HolyClient/Views/Pages/BotManager/BotManagerMainView.axaml.cs b/src/HolyClient/Views/Pages/BotManager/BotManagerMainView.axaml.cs deleted file mode 100644 index dfe32939..00000000 --- a/src/HolyClient/Views/Pages/BotManager/BotManagerMainView.axaml.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Avalonia.ReactiveUI; -using HolyClient.ViewModels; - -namespace HolyClient.Views -{ - public partial class BotManagerMainView : ReactiveUserControl - { - public BotManagerMainView() - { - - InitializeComponent(); - } - } -} diff --git a/src/HolyClient/Views/Pages/BotManager/BotManagerView.axaml b/src/HolyClient/Views/Pages/BotManager/BotManagerView.axaml deleted file mode 100644 index 1e2b9c21..00000000 --- a/src/HolyClient/Views/Pages/BotManager/BotManagerView.axaml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/HolyClient/Views/Pages/BotManager/BotManagerView.axaml.cs b/src/HolyClient/Views/Pages/BotManager/BotManagerView.axaml.cs deleted file mode 100644 index 8ae00cb5..00000000 --- a/src/HolyClient/Views/Pages/BotManager/BotManagerView.axaml.cs +++ /dev/null @@ -1,44 +0,0 @@ -using Avalonia.ReactiveUI; -using FluentAvalonia.UI.Controls; -using HolyClient.Localization; -using HolyClient.ViewModels; -using ReactiveUI; - -namespace HolyClient.Views; - -public partial class BotManagerView : ReactiveUserControl -{ - public BotManagerView() - { - InitializeComponent(); - this.WhenActivated(x => - { - this.ViewModel.Dialog.RegisterHandler(async x => - { - ContentDialog contentDialog = new ContentDialog() - { - Title = Loc.Tr("BotManager.DialogRemoveConfirmRequest"), - - IsSecondaryButtonEnabled = true, - IsPrimaryButtonEnabled = true, - PrimaryButtonText = Loc.Tr("Yes"), - SecondaryButtonText = Loc.Tr("No"), - }; - - var result = await contentDialog.ShowAsync(); - - if (result == ContentDialogResult.Primary) - { - x.SetOutput(true); - } - else - { - x.SetOutput(false); - // throw new System.Exception("Unkown type dialog"); - } - //this.InvalidateVisual(); - }); - }); - } - -} \ No newline at end of file diff --git a/src/HolyClient/Views/Pages/BotManager/BotProfileView.axaml b/src/HolyClient/Views/Pages/BotManager/BotProfileView.axaml deleted file mode 100644 index bfdcc27a..00000000 --- a/src/HolyClient/Views/Pages/BotManager/BotProfileView.axaml +++ /dev/null @@ -1,210 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + From f11dee54c1718c86ef374632567164f2dec0df07 Mon Sep 17 00:00:00 2001 From: TitleHHHH Date: Sat, 6 Jan 2024 12:27:21 +0500 Subject: [PATCH 30/55] Working profile system --- src/HolyClient/BootStrap.cs | 4 +- .../Commands/StartStopBotCommand.cs | 50 -- .../Commands/StartStressTestCommand.cs | 189 ------ .../Commands/StopStressTestCommand.cs | 32 - src/HolyClient/Designer/CustomStyles.axaml | 2 +- src/HolyClient/HolyClient.csproj | 6 +- .../LoadPlugins/Models/BotPluginCreater.cs | 5 +- .../LoadPlugins/Models/IBotPluginCreater.cs | 5 +- .../StressTestConfigurationViewModel.cs | 3 +- .../StressTest/StressTestProcessViewModel.cs | 5 +- .../Pages/StressTest/StressTestViewModel.cs | 18 +- .../StressTestConfigurationView.axaml.cs | 98 --- .../StressTest/StressTestLoadingView.axaml | 14 - .../StressTest/StressTestLoadingView.axaml.cs | 12 - ...View.axaml => StressTestProfileView.axaml} | 634 +++++++++--------- .../StressTest/StressTestProfileView.axaml.cs | 84 +++ .../Pages/StressTest/StressTestView.axaml | 8 +- tasks.md | 3 +- 18 files changed, 439 insertions(+), 733 deletions(-) delete mode 100644 src/HolyClient/Commands/StartStopBotCommand.cs delete mode 100644 src/HolyClient/Commands/StartStressTestCommand.cs delete mode 100644 src/HolyClient/Commands/StopStressTestCommand.cs delete mode 100644 src/HolyClient/Views/Pages/StressTest/StressTestConfigurationView.axaml.cs delete mode 100644 src/HolyClient/Views/Pages/StressTest/StressTestLoadingView.axaml delete mode 100644 src/HolyClient/Views/Pages/StressTest/StressTestLoadingView.axaml.cs rename src/HolyClient/Views/Pages/StressTest/{StressTestConfigurationView.axaml => StressTestProfileView.axaml} (96%) create mode 100644 src/HolyClient/Views/Pages/StressTest/StressTestProfileView.axaml.cs diff --git a/src/HolyClient/BootStrap.cs b/src/HolyClient/BootStrap.cs index 5fd42298..ff99c271 100644 --- a/src/HolyClient/BootStrap.cs +++ b/src/HolyClient/BootStrap.cs @@ -67,11 +67,11 @@ await Task.Run(async () => Locator.CurrentMutable.RegisterConstant(new PluginProvider()); - await state.BotManagerState.Initialization(); + - await state.StressTestState.Initialization(Locator.Current.GetService()); + //await state.StressTestState.Initialization(Locator.Current.GetService()); progress.OnNext("Bootstrap.LoadingState.AlmostDone"); diff --git a/src/HolyClient/Commands/StartStopBotCommand.cs b/src/HolyClient/Commands/StartStopBotCommand.cs deleted file mode 100644 index 0efd1548..00000000 --- a/src/HolyClient/Commands/StartStopBotCommand.cs +++ /dev/null @@ -1,50 +0,0 @@ -using HolyClient.Contracts.Models; -using ReactiveUI; -using ReactiveUI.Fody.Helpers; -using System; -using System.Windows.Input; - -namespace HolyClient.Commands -{ - public class StartStopBotCommand : ReactiveObject, ICommand - { - - private IBotProfile _profile; - private Serilog.ILogger _logger; - [Reactive] - public bool IsActivate { get; private set; } = false; - - - public StartStopBotCommand(IBotProfile profile, Serilog.ILogger logger) - { - _logger = logger; - _profile = profile; - } - private bool _canExectute; - - public event EventHandler? CanExecuteChanged; - - private void RaiseCanExecute() - { - - } - - public bool CanExecute(object? parameter) - { - return true; - } - - public void Execute(object? parameter) - { - if (IsActivate) - { - _profile.Stop(); - } - else - { - _profile.Start(this._logger); - } - IsActivate = !IsActivate; - } - } -} diff --git a/src/HolyClient/Commands/StartStressTestCommand.cs b/src/HolyClient/Commands/StartStressTestCommand.cs deleted file mode 100644 index adad22ac..00000000 --- a/src/HolyClient/Commands/StartStressTestCommand.cs +++ /dev/null @@ -1,189 +0,0 @@ -using HolyClient.StressTest; -using HolyClient.ViewModels; -using ReactiveUI; -using Serilog; -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Reactive.Disposables; -using System.Reactive.Linq; -using System.Threading; -using System.Threading.Tasks; -using System.Windows.Input; - -namespace HolyClient.Commands -{ - public class StartStressTestCommand : ICommand, IDisposable - { - public event EventHandler? CanExecuteChanged; - - private IScreen screen; - private IStressTest _model; - private IDisposable? _cleanUp = null; - private bool _canExecute; - public StartStressTestCommand(IScreen screen, IStressTest model, IObservable canExecute) - { - CompositeDisposable d = new(); - - this.screen = screen; - _model = model; - - canExecute.Subscribe(x => - { - Console.WriteLine("CanExecute: " + _canExecute); - _canExecute = x; - this.CanExecuteChanged?.Invoke(this, new EventArgs()); - }).DisposeWith(d); - - _cleanUp = d; - } - - public bool CanExecute(object? parameter) - { - return _canExecute; - } - public async void Execute(object? parameter) - { - if (!_canExecute) - return; - - Thread.CurrentThread.Priority = ThreadPriority.Highest; - LoggerWrapper loggerWrapper = new LoggerWrapper(); - - ILogger logger = loggerWrapper; - - try - { - - - - StressTestLoadingViewModel loadingVM = new StressTestLoadingViewModel(this.screen, _model); - - StressTestProcessViewModel proccess = new StressTestProcessViewModel(this.screen, _model, loggerWrapper); - await screen.Router.Navigate.Execute(loadingVM); - - - - await _model.Start(logger); - //await Task.Factory.StartNew(() =>, default, TaskCreationOptions.LongRunning, StaScheduler).Unwrap(); - - - await screen.Router.Navigate.Execute(proccess); - - } - catch (TaskCanceledException) - { - logger.Information("[STRESS TEST] Завершился из-за отмены"); - } - catch (Exception ex) - { - logger.Error(ex, "[STRESS TEST] завершился с ошибкой"); - } - finally - { - - } - - } - - public void Dispose() - { - Interlocked.Exchange(ref _cleanUp, null)?.Dispose(); - } - } - public sealed class StaTaskScheduler : TaskScheduler, IDisposable - { - /// Stores the queued tasks to be executed by our pool of STA threads. - private BlockingCollection _tasks; - /// The STA threads used by the scheduler. - private readonly List _threads; - - /// Initializes a new instance of the StaTaskScheduler class with the specified concurrency level. - /// The number of threads that should be created and used by this scheduler. - public StaTaskScheduler(int numberOfThreads) - { - // Validate arguments - if (numberOfThreads < 1) throw new ArgumentOutOfRangeException("concurrencyLevel"); - - // Initialize the tasks collection - _tasks = new BlockingCollection(); - - // Create the threads to be used by this scheduler - _threads = Enumerable.Range(0, numberOfThreads).Select(i => - { - var thread = new Thread(() => - { - // Continually get the next task and try to execute it. - // This will continue until the scheduler is disposed and no more tasks remain. - foreach (var t in _tasks.GetConsumingEnumerable()) - { - TryExecuteTask(t); - } - }); - thread.Name = "STA THREAD"; - thread.IsBackground = true; - // thread.SetApartmentState(ApartmentState.STA); - return thread; - }).ToList(); - - // Start all of the threads - _threads.ForEach(t => t.Start()); - } - - /// Queues a Task to be executed by this scheduler. - /// The task to be executed. - protected override void QueueTask(Task task) - { - // Push it into the blocking collection of tasks - _tasks.Add(task); - } - - /// Provides a list of the scheduled tasks for the debugger to consume. - /// An enumerable of all tasks currently scheduled. - protected override IEnumerable GetScheduledTasks() - { - // Serialize the contents of the blocking collection of tasks for the debugger - return _tasks.ToArray(); - } - - /// Determines whether a Task may be inlined. - /// The task to be executed. - /// Whether the task was previously queued. - /// true if the task was successfully inlined; otherwise, false. - protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued) - { - // Try to inline if the current thread is STA - return - Thread.CurrentThread.GetApartmentState() == ApartmentState.STA && - TryExecuteTask(task); - } - - /// Gets the maximum concurrency level supported by this scheduler. - public override int MaximumConcurrencyLevel - { - get { return _threads.Count; } - } - - /// - /// Cleans up the scheduler by indicating that no more tasks will be queued. - /// This method blocks until all threads successfully shutdown. - /// - public void Dispose() - { - if (_tasks != null) - { - // Indicate that no new tasks will be coming in - _tasks.CompleteAdding(); - - // Wait for all threads to finish processing tasks - foreach (var thread in _threads) thread.Join(); - - // Cleanup - _tasks.Dispose(); - _tasks = null; - } - } - } - -} diff --git a/src/HolyClient/Commands/StopStressTestCommand.cs b/src/HolyClient/Commands/StopStressTestCommand.cs deleted file mode 100644 index f3a8bba0..00000000 --- a/src/HolyClient/Commands/StopStressTestCommand.cs +++ /dev/null @@ -1,32 +0,0 @@ -using HolyClient.StressTest; -using HolyClient.ViewModels; -using ReactiveUI; -using System; -using System.Reactive.Linq; -using System.Windows.Input; - -namespace HolyClient.Commands -{ - public class StopStressTestCommand : ICommand - { - public event EventHandler? CanExecuteChanged; - private readonly IScreen screen; - private readonly IStressTest stressTest; - public StopStressTestCommand(IScreen screen, IStressTest stressTest) - { - this.screen = screen; - this.stressTest = stressTest; - } - - public bool CanExecute(object? parameter) - { - return true; - } - - public async void Execute(object? parameter) - { - await this.stressTest.Stop(); - await screen.Router.NavigateAndReset.Execute(new StressTestConfigurationViewModel(screen, stressTest)); - } - } -} diff --git a/src/HolyClient/Designer/CustomStyles.axaml b/src/HolyClient/Designer/CustomStyles.axaml index 5138b575..cf7ecc58 100644 --- a/src/HolyClient/Designer/CustomStyles.axaml +++ b/src/HolyClient/Designer/CustomStyles.axaml @@ -12,7 +12,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + GitHub last commit + + GitHub issues + + GitHub pull requests + + Discord + + Download -Высокопроизводительная платформа для запуска стресс-тест ботов Minecraft, написанная на C#. + +