diff --git a/.github/workflows/continuous.yml b/.github/workflows/continuous.yml
index 088fe16b..73cdef68 100644
--- a/.github/workflows/continuous.yml
+++ b/.github/workflows/continuous.yml
@@ -4,17 +4,19 @@ on:
push:
branches:
- master
+ - release/**
paths-ignore:
- '**/*.md'
- '**/*.gitignore'
- '**/*.gitattributes'
+
jobs:
Libs:
name: Build and deploy NuGet
- runs-on: ubuntu-latest
+ runs-on: ubuntu-latest
env:
FeedzApiKey: ${{ secrets.FEEDZ_TOKEN }}
DOTNET_CLI_TELEMETRY_OPTOUT: 1
@@ -47,6 +49,7 @@ jobs:
run: chmod +x ./build.sh
- name: Run './build.cmd'
+ if: github.ref == 'refs/heads/master'
run: ./build.sh LibsPush
env:
NuGetApiKey: ${{ secrets.NUGET_API_KEY }}
@@ -108,6 +111,7 @@ jobs:
name: "CreateRelease"
needs: [build-desktop-app]
runs-on: ubuntu-latest
+
steps:
- uses: actions/checkout@v4
with:
@@ -137,6 +141,7 @@ jobs:
run: chmod +x ./build.sh
- name: Run './build.cmd'
+ if: github.ref == 'refs/heads/master'
run: ./build.sh CreateRelease
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/Directory.Build.props b/Directory.Build.props
index 22b1b74a..f8158243 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -5,5 +5,6 @@
all3.6.133
+
\ No newline at end of file
diff --git a/README.md b/README.md
index 2751bbf0..c239d3c6 100644
--- a/README.md
+++ b/README.md
@@ -4,31 +4,34 @@
# Minecraft Holy Client
-Удобное, высокопроизводительное, легко масштабируемое и кроссплатформенное приложение для создания и управления ботами Minecraft.
+Высокопроизводительная платформа для запуска стресс-тест ботов Minecraft, написанная на C#.
-## Основные функции
+## Get Started
-- Стресс-тест - высокопроизводительные боты, которые тестируют Ваш сервер на устойчивость к распределенным кибер-атакам типа "Отказ в обслуживании". Поведение ботов можно переопределять с помощью плагинов.
-- Менеджер ботов(в разработке) - Вы можете создавать и запускать простых ботов на сервера для автоматизации игровых процессов, например, авто-рыбалка.
+[Скачайте в релизах](https://github.com/Titlehhhh/Minecraft-Holy-Client/releases) последнюю версию Minecraft Holy Client и запустите её.
+После запуска приложения Вас встретит окно с главной страницей.
+
-## Начать пользоваться
+После открытия навигационного меню Вы увидите несколько пунктов:
+- Главная. Страница где есть основная информация о приложении: GitHub, Наш Discord сервер, а также документация(в разрботке).
+- Бот менеджер. Эта экспериментальная функция. Планируется в программу добавить простых ботов, таких как, боты афк-рыбалки или подобные.
+- Настройки. Вы можете настроить язык. Пока можно настроить только это.
+- Стресс-тест. Основная возможность приложения. Здесь Вы можете протестировать Ваш сервер под высокой нагрузкой.
+- Управление расширениями. Здесь Вы можете добавить свои плагины в программу.
+
-[Скачайте](https://raw.githubusercontent.com/Titlehhhh/HolyClientTestDeploy/main/preview/setup.exe) установщик, установите программу и запустите её.
+### Запуск стресс-теста
-Как запустить стресс-тест смотрите [здесь](docs/RunStressTest.md).
+1) Перейдем на страницу Стресс-тест и введем Ip адрес сервера, который мы хотим нагрузить.
+2) Далее поставить префикс ника для ботов. Пусть будет "Title_"
+3) Затем укажем количество ботов. Это количество, которое система будет стремиться запустить. Например 1000.
+4) Укажем, что нужно в тестировании использовать прокси сервера, а также укажем версию 1.16.5.
+5) В настройках поведения укажем, чтобы боты спамили "Hello from Minecraft Holy Client".
+
-
-## Screenshots
-
-### Home
-
-
-### Bot manager (beta)
-
-
-### Stress test
-
+Нажимаем на зеленую кнопку видим, что боты зашли на сервер и спамят "Hello from Minecraft Holy Client"
+
## Roadmap
diff --git a/ReleaseNotes/2.0.0-preview.1/En.md b/ReleaseNotes/2.0.0-preview.1/En.md
new file mode 100644
index 00000000..9975ba39
--- /dev/null
+++ b/ReleaseNotes/2.0.0-preview.1/En.md
@@ -0,0 +1,63 @@
+> [!WARNING]
+> Disclaimer: This translation was generated using AI.
+
+# What's New in Minecraft Holy Client *2.0.0-preview.1*?
+
+## Major Fixes
+
+This section includes the following subsections:
+
+- [Bug Fixes](#bug-fixes)
+- [Performance](#performance)
+- [Stress Test](#stress-test)
+- [Installer](#installer)
+
+### Bug Fixes
+
+#### Bot Counter
+
+There was a minor issue where, during the stress test process, the bot count would spike, inaccurately portraying more bots than actually present. The bot counter now accurately reflects the current number of online bots.
+
+#### Bot Restarts
+
+In previous versions, bots might fail to restart in situations such as unsuccessful attempts to connect to a proxy, bots exiting the server, or internal errors during operation. Currently, bots correctly execute the restart process in such scenarios.
+
+#### Socks5 Proxy
+
+Previously, bots were unable to connect to socks5 proxies due to a protocol implementation error. Bots can now successfully connect to socks5 proxies.
+
+### Performance
+
+Performance is a crucial aspect of Minecraft Holy Client, with each feature designed for maximum efficiency. Additionally, the following enhancements have been implemented in Minecraft Holy Client, specifically geared towards improving performance:
+
+- Drastically reduced RAM consumption. Previously, instances of MinecraftPrimitiveReader and MinecraftPrimitiveWriter were created for each test bot, and memory was allocated for each new packet received from the server. Now, we actively use an object pool for reusing MinecraftPrimitiveReader and MinecraftPrimitiveWriter.
+
+- Increased throughput. Bots in Play mode now separate the processes of reading data from the network and parsing packets into two threads, using the System.IO.Pipelines library. This has resulted in a 10% increase in throughput.
+
+- Optimized proxy servers. QuickProxyNet now efficiently manages memory when connecting to Socks4, Socks4a, and Socks5 proxy servers.
+
+### Stress Test
+
+#### Default Proxies
+
+Now, default proxies are used in the stress test if the user hasn't added their own proxies. This feature was added based on a [Discord poll](https://discord.com/channels/1166051202367246396/1166055869566419085/1172042445928812574).
+
+#### Default Plugins
+
+Previously, there was an option to create behavior for stress tests using plugins, which might have been challenging for regular users. Now, a new default plugin has been introduced, simplifying the process of launching stress tests and making it accessible to everyone. It's worth noting that the default plugin currently only runs simple bots that register on the server using /reg \ \ and immediately start spamming. The plugin's functionality will be expanded in the future.
+
+#### Proxy Loading from Clipboard and URL
+
+Previously, proxies could only be loaded from a file. Now, proxies can be imported in three ways: file, URL, and manual entry of the proxy list.
+
+#### Proxy Disabling
+
+In the main proxy settings, the option to disable the use of proxies has been added. Bots will use the user's IP.
+
+#### Stress Test Process Window Design
+
+The stress test process window no longer displays a graph of the number of online bots and connections per second. Instead, a logger has been added. Online bot and connections per second indicators have been moved to the top, and a peak connections per second indicator has been added.
+
+### Installer
+
+The program is now fully cross-platform and portable, so the ClickOnce installer on Windows is no longer supported.
diff --git a/ReleaseNotes/2.0.0-preview.1/Ru.md b/ReleaseNotes/2.0.0-preview.1/Ru.md
new file mode 100644
index 00000000..34017dd4
--- /dev/null
+++ b/ReleaseNotes/2.0.0-preview.1/Ru.md
@@ -0,0 +1,67 @@
+# Что изменилось в Minecraft Holy Client *2.0.0-preview.1*?
+
+## Основные исправления
+
+Этот раздел содержит следующие подразделы:
+
+- [Исправление багов](#исправление-багов)
+- [Производительность](#производительность)
+- [Стресс-тест](#стресс-тест)
+- [Установщик](#установщик)
+
+### Исправление багов
+
+#### Счетчик ботов
+
+Была маленькая проблема, где в стресс-тест процессе счетчик количества ботов зашкаливал, когда как в реальности ботов было меньше или не было совсем. Теперь счетчик количества ботов онлайн показывает значение корректно.
+
+#### Рестарт ботов
+
+В предшествующих версиях боты могли не перезапускаться при возникновении ситуаций, таких как неудачная попытка подключения к прокси, выход ботов из сервера или внутренняя ошибка в процессе работы. В настоящее время бот корректно выполняет процесс перезапуска в таких сценариях.
+
+#### Socks5 прокси
+
+Раньше боты не могли подключатся к socks5 прокси из-за ошибки в реализации протокола. Сейчас боты могут подключаться к socks5 прокси.
+
+### Производительность
+
+
+Производительность является важнейшим аспектом функционала Minecraft Holy Client, и каждая его особенность разрабатывается с учетом максимальной эффективности. Дополнительно, в Minecraft Holy Client внедрены следующие усовершенствования, заточенные исключительно под повышение производительности:
+
+- Радикально уменьшено потребление оперативной памяти. До этого на каждый тестовый бот создавались экземпляры MinecraftPrimitiveReader и MinecraftPrimitiveWriter, а также выделялась память при получении каждого нового пакета от сервера. Теперь мы активно используем пул объектов для повторного использования MinecraftPrimitiveReader и MinecraftPrimitiveWriter.
+
+- Увеличена пропускная способность. Теперь боты в режиме Play разделяют процессы чтения данных из сети и их синтаксического анализа на два потока, используя библиотеку System.IO.Pipelines. Это привело к увеличению пропускной способности на 10%.
+
+- Оптимизированы прокси-сервера. QuickProxyNet теперь максимально эффективно управляет памятью при подключении к прокси-серверам Socks4, Socks4a и Socks5.
+
+### Стресс-тест
+
+
+#### Прокси по умолчанию
+
+Теперь в стресс-тесте используются прокси по умолчанию, если пользователь не добавил свои прокси. Эта возможность была добавлена на основе [голосования в Discord](https://discord.com/channels/1166051202367246396/1166055869566419085/1172042445928812574).
+
+#### Плагины по умолчанию
+
+Ранее существовала опция создания поведения для стресс-тестов с использованием плагинов, что, возможно, могло показаться сложным для обычных пользователей.
+Теперь в системе представлен новый плагин по умолчанию, который упрощает процесс запуска стресс-тестов и делает его доступным для всех. Но стоит отметить, что плагин по умолчанию пока всего лишь запускает простых ботов, которые регистрируются на сервер с помощью /reg \ \ и сразу начинают спамить. В будущем функционал плагина будет дополнен.
+
+#### Загрузка прокси из буфера обмена и URL
+
+Раньше можно было загружать прокси только из файла, теперь импортировать прокси можно тремя способами:
+- Файл
+- URL
+- Ручной ввод списка прокси
+
+#### Отключение прокси
+
+В основных настройках прокси добавлена возможность отключать использование прокси; боты будут использовать IP пользователя.
+
+#### Дизайн окна со стресс-тест процессом
+
+B окне со стресс-тест процессом убран график количества ботов онлайн, а также подключения в секунду. На место него поставлен логгер.
+Показатели ботов онлайн и подключения в секунду перенесены наверх, также добавлен показатель пиковых подключений в секунду.
+
+### Установщик
+
+Теперь программа стала полностью кроссплатформенной и портативной, поэтому установщик ClickOnce на Windows больше не поддерживается.
diff --git a/build/Build.cs b/build/Build.cs
index 2caded5d..05577244 100644
--- a/build/Build.cs
+++ b/build/Build.cs
@@ -192,11 +192,21 @@ class Build : NukeBuild
{
Console.WriteLine("Version: " + MinVer.Version);
- DotNetNuGetPush(s => s
+ if (GitRepository.IsOnMasterBranch())
+ {
+ DotNetNuGetPush(s => s
.SetTargetPath($"{ArtifactsDirectory}/**/*.nupkg")
- .SetSource("https://f.feedz.io/holyclient/holyclient/nuget/index.json")
- .SetApiKey(FeedzApiKey)
- );
+ .SetSource("https://api.nuget.org/v3/index.json")
+ .SetApiKey(NuGetApiKey));
+ }
+ else
+ {
+
+ DotNetNuGetPush(s => s
+ .SetTargetPath($"{ArtifactsDirectory}/**/*.nupkg")
+ .SetSource("https://f.feedz.io/holyclient/holyclient/nuget/index.json")
+ .SetApiKey(FeedzApiKey));
+ }
});
@@ -222,8 +232,11 @@ from runtime in Runtimes
.SetProperty("DebugType", "None")
.SetPublishReadyToRun(true)
.EnableSelfContained()
+ .SetAssemblyVersion(MinVer.AssemblyVersion)
+ .SetFileVersion(MinVer.FileVersion)
+
.SetOutput(BuildDirectory)
- .SetFramework("net8.0")
+ .SetFramework("net8.0")
.SetRuntime(Runtime));
@@ -308,8 +321,4 @@ from runtime in Runtimes
});
- private static async Task UploadReleaseAssetToGithub(Release release, string asset)
- {
-
- }
}
diff --git a/docs/CustomPlugin.md b/docs/CustomPlugin.md
new file mode 100644
index 00000000..2998fb2b
--- /dev/null
+++ b/docs/CustomPlugin.md
@@ -0,0 +1,5 @@
+# Как создать плагин для стресс-теста
+
+
+
+Документация в разработке
diff --git a/docs/RunStressTest.md b/docs/RunStressTest.md
deleted file mode 100644
index 9b00d0b3..00000000
--- a/docs/RunStressTest.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# Как запустить стресс-тест?
-
-Перед тем как запустить стресс-тест вам нужно будет написать плагин для него:
-
-1) Скачайте и установите .NET SDK 8 (или вы можете скачать Visual Studio предварительной версии)
-2) Создайте проект типа Библиотека классов(`dotnet new classlib --framework "net8.0" -o MyTopBehavior`
-3) Добавьте в проект ссылку на NuGet пакет HolyClient.SDK(`dotnet add package HolyClient.SDK --version 1.0.0-preview.221`)
-4) Создайте класс и наследуйтесь от интерфейса `HolyClient.Abstractions.StressTest.IStressTestBehavior` например:
-```
-[PluginAuthor("Title")]
-[PluginDescription("My TOP STRESS TEST")]
-public class Class2 : IStressTestBehavior
-{
- public async Task Activate(CompositeDisposable disposables, IEnumerable bots, CancellationToken cancellationToken)
- {
- //TODO
- }
-}
-```
-5) Соберите библиотеку (`dotnet build`)
-6) Перейдите в раздел "Менеджер расширений" -> "Сборки" и добавьте сборку, которая должна быть в папке bin вашего проекта.
-7) Перейдите во вкладку "Стресс тест" -> "Прокси" и импортирйте свои прокси. Формат "ip:port". Логин и пароль пока не поддерживаются.
-8) Перейдите во вкладку "Поведения". Вы там увидите список всех классов из подключеных сборок, которые наследуются от IStressTestBehavior. Выберите нужный и нажмите кнопку "Установить" справа.
-9) Запустите стресс-тест!
diff --git a/src/CoreLibs/HolyClient.StressTest/TestBehavior.cs b/src/CoreLibs/HolyClient.StressTest/DefaultBehavior.cs
similarity index 52%
rename from src/CoreLibs/HolyClient.StressTest/TestBehavior.cs
rename to src/CoreLibs/HolyClient.StressTest/DefaultBehavior.cs
index ebd3eea0..4348a0f4 100644
--- a/src/CoreLibs/HolyClient.StressTest/TestBehavior.cs
+++ b/src/CoreLibs/HolyClient.StressTest/DefaultBehavior.cs
@@ -1,12 +1,21 @@
using HolyClient.Abstractions.StressTest;
using System.Reactive.Disposables;
+using System.Reactive.Linq;
+using System.Reactive.Threading.Tasks;
+using System.Text.RegularExpressions;
namespace HolyClient.StressTest
{
- public class TestBehavior : IStressTestBehavior
+ public class DefaultBehavior : IStressTestBehavior
{
[System.ComponentModel.DisplayName("Spam text")]
- public string SpamText { get; set; } = "Hello";
+ public string SpamText { get; set; } = "!Hello from Minecraft Holy Client";
+
+ [System.ComponentModel.DisplayName("Spam timeout")]
+ public int SpamTimeout { get; set; } = 5000;
+
+
+ private static Regex SayVerifyRegex = new(@"\.say \/verify (\d+)");
public Task Activate(CompositeDisposable disposables, IEnumerable bots, CancellationToken cancellationToken)
{
@@ -47,13 +56,40 @@ public Task Activate(CompositeDisposable disposables, IEnumerable x.Message.Contains("verify"))
+ .Skip(3)
+ .FirstAsync()
+ .ToTask(cts.Token);
+
+ var code = SayVerifyRegex.Match(m.Message).Value;
+
+ await bot.Client.SendChat(code);
+ //}
+ }
+ catch (Exception ex)
+ {
+ //Console.WriteLine(ex);
+ }
+
while (!cts.IsCancellationRequested)
{
await bot.Client.SendChat(SpamText);
- await Task.Delay(1000);
+ if (SpamTimeout <= 0)
+ await Task.Delay(1000);
+ else
+ await Task.Delay(SpamTimeout);
}
}
catch (Exception ex)
diff --git a/src/CoreLibs/HolyClient.StressTest/NickProvider.cs b/src/CoreLibs/HolyClient.StressTest/NickProvider.cs
index 28927ccb..e9746dea 100644
--- a/src/CoreLibs/HolyClient.StressTest/NickProvider.cs
+++ b/src/CoreLibs/HolyClient.StressTest/NickProvider.cs
@@ -6,6 +6,8 @@ class NickProvider : INickProvider
public NickProvider(string baseNick)
{
+ if (string.IsNullOrWhiteSpace(baseNick))
+ baseNick = "";
if (baseNick.Length > 16)
throw new ArgumentException("Nick long");
_baseNick = baseNick;
diff --git a/src/CoreLibs/HolyClient.StressTest/StressTest.cs b/src/CoreLibs/HolyClient.StressTest/StressTest.cs
index 73b44c39..a9c6fbfa 100644
--- a/src/CoreLibs/HolyClient.StressTest/StressTest.cs
+++ b/src/CoreLibs/HolyClient.StressTest/StressTest.cs
@@ -251,7 +251,7 @@ public async Task Start(Serilog.ILogger logger)
}
else
{
- TestBehavior testBehavior = new();
+ DefaultBehavior testBehavior = new();
await testBehavior.Activate(disposables, stressTestBots, cancellationTokenSource.Token);
}
CurrentState = StressTestServiceState.Running;
diff --git a/src/HolyClient/Localization/Tr.cs b/src/HolyClient/Localization/Tr.cs
index c1219af2..f43e5fac 100644
--- a/src/HolyClient/Localization/Tr.cs
+++ b/src/HolyClient/Localization/Tr.cs
@@ -240,6 +240,7 @@ public object ProvideValue(IServiceProvider serviceProvider, bool InMultiTr)
if (IsDynamic)
{
+
Binding binding = new(nameof(TrData.TranslatedText))
{
Source = trData
diff --git a/src/HolyClient/Services/PluginProvider.cs b/src/HolyClient/Services/PluginProvider.cs
index 1e500fb9..268a1693 100644
--- a/src/HolyClient/Services/PluginProvider.cs
+++ b/src/HolyClient/Services/PluginProvider.cs
@@ -65,7 +65,7 @@ public class DefaultPluginSource : IPluginSource
public T CreateInstance() where T : IStressTestBehavior
{
- IStressTestBehavior beh = new TestBehavior();
+ IStressTestBehavior beh = new DefaultBehavior();
return (T)beh;
}
}
diff --git a/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/Contents/FileImportProxyDialogViewModel.cs b/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/Contents/FileImportProxyDialogViewModel.cs
index ad08e047..d0de59bd 100644
--- a/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/Contents/FileImportProxyDialogViewModel.cs
+++ b/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/Contents/FileImportProxyDialogViewModel.cs
@@ -20,7 +20,7 @@ public string FilePath
- public FileImportProxyDialogViewModel()
+ public FileImportProxyDialogViewModel(string title): base(title)
{
}
diff --git a/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/Contents/ImportProxyViewModel.cs b/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/Contents/ImportProxyViewModel.cs
index 086c8a0c..b2ca7eae 100644
--- a/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/Contents/ImportProxyViewModel.cs
+++ b/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/Contents/ImportProxyViewModel.cs
@@ -8,10 +8,15 @@ namespace HolyClient.ViewModels;
public abstract class ImportProxyViewModel
{
-
+ public string Title { get; set; }
public ProxyType Type { get; set; }
public ProxyType[] AvailableTypes { get; } = Enum.GetValues();
public abstract bool IsValid();
+
+ protected ImportProxyViewModel(string title)
+ {
+ Title = title;
+ }
}
diff --git a/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/Contents/InMemoryImportProxyDialogViewModel.cs b/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/Contents/InMemoryImportProxyDialogViewModel.cs
index 844d08bf..b0746290 100644
--- a/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/Contents/InMemoryImportProxyDialogViewModel.cs
+++ b/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/Contents/InMemoryImportProxyDialogViewModel.cs
@@ -18,7 +18,7 @@ public sealed class InMemoryImportProxyDialogViewModel : ImportProxyViewModel
- public InMemoryImportProxyDialogViewModel()
+ public InMemoryImportProxyDialogViewModel(string title) : base(title)
{
diff --git a/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/Contents/UrlImportProxyDialogViewModel.cs b/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/Contents/UrlImportProxyDialogViewModel.cs
index 572a7579..c282387d 100644
--- a/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/Contents/UrlImportProxyDialogViewModel.cs
+++ b/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/Contents/UrlImportProxyDialogViewModel.cs
@@ -8,7 +8,10 @@
namespace HolyClient.ViewModels;
public sealed class UrlImportProxyDialogViewModel : ImportProxyViewModel
{
-
+ public UrlImportProxyDialogViewModel(string title) : base(title)
+ {
+ }
+
public string URL { get; set; }
public override bool IsValid()
diff --git a/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/ImportSourceViewModel.cs b/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/ImportSourceViewModel.cs
index 3475140e..04bdb641 100644
--- a/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/ImportSourceViewModel.cs
+++ b/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/ImportSourceViewModel.cs
@@ -4,15 +4,19 @@ namespace HolyClient.ViewModels.Pages.StressTest.Dialogs
{
public class ImportSourceViewModel
{
- public Symbol Icon { get; }
+ public string Icon { get; }
+ public string Description { get; }
public string Name { get; }
public ImportSource SourceType { get; }
- public ImportSourceViewModel(Symbol icon, string name, ImportSource sourceType)
+ public ImportSourceViewModel(string icon, ImportSource sourceType)
{
- Name = name;
+
SourceType = sourceType;
Icon = icon;
+ string baseTr = $"StressTest.Configuration.Proxy.Dialog.SelectSource.{icon}";
+ Description = $"{baseTr}.Description";
+ Name = baseTr;
}
}
}
diff --git a/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/SelectImportSourceProxyViewModel.cs b/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/SelectImportSourceProxyViewModel.cs
index fc29c9fa..e6884629 100644
--- a/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/SelectImportSourceProxyViewModel.cs
+++ b/src/HolyClient/ViewModels/Pages/StressTest/Dialogs/SelectImportSourceProxyViewModel.cs
@@ -10,9 +10,9 @@ public sealed class SelectImportSourceProxyViewModel : ReactiveObject
public ImportSourceViewModel[] Sources { get; } = new ImportSourceViewModel[]
{
- new ImportSourceViewModel(Symbol.Clipboard,"Буфер обмена", ImportSource.InMemory),
- new ImportSourceViewModel(Symbol.OpenFile,"Файл", ImportSource.File),
- new ImportSourceViewModel(Symbol.Link,"URL", ImportSource.Url)
+ new ImportSourceViewModel("ManualEntry", ImportSource.InMemory),
+ new ImportSourceViewModel("File", ImportSource.File),
+ new ImportSourceViewModel("Url", ImportSource.Url)
};
[Reactive]
public ImportSourceViewModel? SelectedSource { get; set; }
diff --git a/src/HolyClient/ViewModels/Pages/StressTest/ProxySourceViewModel.cs b/src/HolyClient/ViewModels/Pages/StressTest/ProxySourceViewModel.cs
new file mode 100644
index 00000000..49c29e90
--- /dev/null
+++ b/src/HolyClient/ViewModels/Pages/StressTest/ProxySourceViewModel.cs
@@ -0,0 +1,34 @@
+using HolyClient.StressTest;
+using QuickProxyNet;
+using ReactiveUI;
+using System;
+
+namespace HolyClient.ViewModels;
+
+public class ProxySourceViewModel : ReactiveObject
+{
+ public Guid Id { get; private set; }
+ //public int AveragePing => Random.Shared.Next(100, 500);
+
+ public string Name { get; set; }
+
+ public string Icon { get; private set; }
+
+ public ProxyType Type { get; set; }
+ public ProxySourceViewModel(IProxySource proxySource)
+ {
+ Id = proxySource.Id;
+
+ Name = proxySource.Name;
+
+ Type = proxySource.Type;
+
+ Icon = proxySource switch
+ {
+ UrlProxySource => "UrlProxy",
+ FileProxySource => "FileProxy",
+ InMemoryProxySource => "InMemoryProxy"
+ };
+
+ }
+}
\ No newline at end of file
diff --git a/src/HolyClient/ViewModels/Pages/StressTest/StressTestConfigurationViewModel.cs b/src/HolyClient/ViewModels/Pages/StressTest/StressTestConfigurationViewModel.cs
index bcc98e71..b502d8bc 100644
--- a/src/HolyClient/ViewModels/Pages/StressTest/StressTestConfigurationViewModel.cs
+++ b/src/HolyClient/ViewModels/Pages/StressTest/StressTestConfigurationViewModel.cs
@@ -7,7 +7,6 @@
using HolyClient.ViewModels.Pages.StressTest.Dialogs;
using McProtoNet;
using NuGet.Configuration;
-using QuickProxyNet;
using ReactiveUI;
using ReactiveUI.Fody.Helpers;
using ReactiveUI.Validation.Extensions;
@@ -143,18 +142,24 @@ public StressTestConfigurationViewModel(IScreen hostScreen, IStressTest state)
this.ValidationRule(
viewModel => viewModel.Server,
name => !string.IsNullOrWhiteSpace(name),
- GetTr("Address"));
+ GetTr("Address")).DisposeWith(d);
IObservable botsNicknameValid =
this.WhenAnyValue(x => x.BotsNickname)
- .Select(name => string.IsNullOrEmpty(name)
- ? new ValidationState(false, GetTr("BotsNickname"))
-
- : (name.Length <= 14
- ? ValidationState.Valid :
- new ValidationState(false, GetTr("BotsNickname.Long"))));
+ .Select(name =>
+ {
+ if (string.IsNullOrWhiteSpace(name))
+ {
+ return ValidationState.Valid;
+ }
+ if(name.Length >= 14)
+ {
+ return new ValidationState(false, GetTr("BotsNickname.Long"));
+ }
+ return ValidationState.Valid;
+ });
this.ValidationRule(vm => vm.BotsNickname, botsNicknameValid).DisposeWith(d);
@@ -199,7 +204,7 @@ public StressTestConfigurationViewModel(IScreen hostScreen, IStressTest state)
if (source == ImportSource.InMemory)
{
- InMemoryImportProxyDialogViewModel vm = new();
+ InMemoryImportProxyDialogViewModel vm = new("ManualEntry");
ok = await ImportProxyDialog.Handle(vm);
@@ -209,7 +214,7 @@ public StressTestConfigurationViewModel(IScreen hostScreen, IStressTest state)
}
else if (source == ImportSource.File)
{
- FileImportProxyDialogViewModel vm = new();
+ FileImportProxyDialogViewModel vm = new("File");
ok = await ImportProxyDialog.Handle(vm);
@@ -218,7 +223,7 @@ public StressTestConfigurationViewModel(IScreen hostScreen, IStressTest state)
}
else if (source == ImportSource.Url)
{
- UrlImportProxyDialogViewModel vm = new();
+ UrlImportProxyDialogViewModel vm = new("Url");
ok = await ImportProxyDialog.Handle(vm);
@@ -306,30 +311,3 @@ public StressTestConfigurationViewModel(IScreen hostScreen, IStressTest state)
}
-public class ProxySourceViewModel : ReactiveObject
-{
- public Guid Id { get; private set; }
- //public int AveragePing => Random.Shared.Next(100, 500);
-
- public string Name { get; set; }
-
- public string Icon { get; private set; }
-
- public ProxyType Type { get; set; }
- public ProxySourceViewModel(IProxySource proxySource)
- {
- Id = proxySource.Id;
-
- Name = proxySource.Name;
-
- Type = proxySource.Type;
-
- Icon = proxySource switch
- {
- UrlProxySource => "UrlProxy",
- FileProxySource => "FileProxy",
- InMemoryProxySource => "InMemoryProxy"
- };
-
- }
-}
\ No newline at end of file
diff --git a/src/HolyClient/ViewModels/Pages/StressTest/StressTestProcessViewModel.cs b/src/HolyClient/ViewModels/Pages/StressTest/StressTestProcessViewModel.cs
index b96de963..ab6247e0 100644
--- a/src/HolyClient/ViewModels/Pages/StressTest/StressTestProcessViewModel.cs
+++ b/src/HolyClient/ViewModels/Pages/StressTest/StressTestProcessViewModel.cs
@@ -104,7 +104,7 @@ public StressTestProcessViewModel(IScreen hostScreen, IStressTest stressTest, Lo
CPS = x.CPS;
PeakCPS = Math.Max(CPS, PeakCPS);
- ProxyQuality = Random.Shared.Next(0, 70) + "%";
+ //ProxyQuality = Random.Shared.Next(0, 70) + "%";
}).DisposeWith(d);
diff --git a/src/HolyClient/Views/Pages/StressTest/Dialogs/FileImportProxyDialogContent.axaml b/src/HolyClient/Views/Pages/StressTest/Dialogs/FileImportProxyDialogContent.axaml
index ab31c951..b8ae40a6 100644
--- a/src/HolyClient/Views/Pages/StressTest/Dialogs/FileImportProxyDialogContent.axaml
+++ b/src/HolyClient/Views/Pages/StressTest/Dialogs/FileImportProxyDialogContent.axaml
@@ -9,7 +9,7 @@
xmlns:ui="using:FluentAvalonia.UI.Controls"
x:Class="HolyClient.Views.FileImportProxyDialogContent">
-
+