diff --git a/.gitignore b/.gitignore index fba682c..4b82ccd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ .vs/ bin/ -FloatTool/obj/ +obj/ diff --git a/FloatTool/Assets/Found.wav b/FloatTool/Assets/Found.wav new file mode 100644 index 0000000..d8c3b6c Binary files /dev/null and b/FloatTool/Assets/Found.wav differ diff --git a/FloatTool/Common/Logger.cs b/FloatTool/Common/Logger.cs index 631078d..158106c 100644 --- a/FloatTool/Common/Logger.cs +++ b/FloatTool/Common/Logger.cs @@ -15,13 +15,12 @@ - along with this program. If not, see . */ -using System; -using System.Reflection; using log4net; -using log4net.Repository.Hierarchy; -using log4net.Core; using log4net.Appender; +using log4net.Core; using log4net.Layout; +using log4net.Repository.Hierarchy; +using System.Reflection; namespace FloatTool { @@ -33,7 +32,8 @@ public static void Initialize() { Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository(); - PatternLayout patternLayout = new() { + PatternLayout patternLayout = new() + { ConversionPattern = "%date [%thread] %-5level - %message%newline" }; patternLayout.ActivateOptions(); diff --git a/FloatTool/Common/Settings.cs b/FloatTool/Common/Settings.cs index 1f494df..576b564 100644 --- a/FloatTool/Common/Settings.cs +++ b/FloatTool/Common/Settings.cs @@ -117,9 +117,10 @@ public void Save() public void MigrateFromOldVersion() { // This method cleans up old settings and data - List oldFiles = new() { - "debug.log", - "FloatCore.dll", + List oldFiles = new() + { + "debug.log", + "FloatCore.dll", "FloatTool.exe.config", "FloatTool.pdb", "itemData.json", @@ -127,10 +128,10 @@ public void MigrateFromOldVersion() "Updater.exe" }; - foreach(var file in oldFiles) + foreach (var file in oldFiles) { if (File.Exists(file)) - File.Delete(file); + File.Delete(file); } App.CleanOldFiles(); @@ -138,8 +139,8 @@ public void MigrateFromOldVersion() // Finally save that we migrated to not do this every time Migrated = true; Save(); - } - + } + public override string ToString() { return $"{{LanguageCode: {LanguageCode}, Currency: {Currency}, ThemeURI: {ThemeURI}, Sound: {Sound}, CheckForUpdates: {CheckForUpdates}, DiscordRPC: {DiscordRPC}, ThreadCount: {ThreadCount}, HaveUpdated: {Migrated}}}"; diff --git a/FloatTool/Common/Skin.cs b/FloatTool/Common/Skin.cs index 825674b..5528fbb 100644 --- a/FloatTool/Common/Skin.cs +++ b/FloatTool/Common/Skin.cs @@ -158,7 +158,7 @@ public RelayCommand CopyCommand { return copyCommand ??= new RelayCommand(obj => { - Clipboard.SetText(WearValue.ToString(CultureInfo.InvariantCulture)); + Clipboard.SetText(WearValue.ToString("0.00000000000000", CultureInfo.InvariantCulture)); }); } } diff --git a/FloatTool/Common/Utils.cs b/FloatTool/Common/Utils.cs index df0594c..23fa2f7 100644 --- a/FloatTool/Common/Utils.cs +++ b/FloatTool/Common/Utils.cs @@ -60,7 +60,7 @@ public static async Task CheckForUpdates() string response = await result.Content.ReadAsStringAsync(); return JsonConvert.DeserializeObject(response); } - catch(Exception ex) + catch (Exception ex) { Logger.Log.Error("Failed to get latest version", ex); return null; @@ -95,7 +95,7 @@ public static string ShortCpuName(string cpu) } } - #pragma warning disable IDE1006 // Naming Styles +#pragma warning disable IDE1006 // Naming Styles public class UpdateResult { public class Asset @@ -108,8 +108,8 @@ public class Asset public List assets { get; set; } public string body { get; set; } } - #pragma warning restore IDE1006 // Naming Styles - +#pragma warning restore IDE1006 // Naming Styles + public class CraftSearchSetup { public decimal SearchTarget { get; set; } diff --git a/FloatTool/FloatTool.csproj b/FloatTool/FloatTool.csproj index 9ba5b39..2a6c05d 100644 --- a/FloatTool/FloatTool.csproj +++ b/FloatTool/FloatTool.csproj @@ -14,10 +14,10 @@ Assets\Icon.ico embedded False - $(SolutionDir)bin + @@ -26,6 +26,7 @@ + diff --git a/FloatTool/ViewModels/MainViewModel.cs b/FloatTool/ViewModels/MainViewModel.cs index fb492d7..b3576f7 100644 --- a/FloatTool/ViewModels/MainViewModel.cs +++ b/FloatTool/ViewModels/MainViewModel.cs @@ -136,7 +136,7 @@ public string CombinationsLabel get { return $"{ParsedCombinations}/{TotalCombinations}"; } set { OnPropertyChanged(); } } - + public string CurrentSpeedLabel { get { return currentSpeed; } @@ -146,27 +146,30 @@ public string CurrentSpeedLabel public string SearchFilter { get { return searchFilter; } - set { + set + { searchFilter = value; - OnPropertyChanged(); + OnPropertyChanged(); } } public int SkinCount { get { return skinCount; } - set { - skinCount = value; - OnPropertyChanged(); + set + { + skinCount = value; + OnPropertyChanged(); } } public int SkinSkipCount { get { return skinSkipCount; } - set { - skinSkipCount = value; - OnPropertyChanged(); + set + { + skinSkipCount = value; + OnPropertyChanged(); } } @@ -287,7 +290,8 @@ public Visibility IsError set { isError = value; OnPropertyChanged(); } } - public float ProgressPercentage { + public float ProgressPercentage + { get { return progressPercentage; } set { progressPercentage = value; OnPropertyChanged(); } } @@ -448,7 +452,7 @@ public MainViewModel(string weapon, string skin, string quality, string filter, FoundCombinations = new(); Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("FloatTool.Assets.SkinList.json")!; - if (stream is null) + if (stream is null) throw new NullReferenceException("Could not find SkinList.json"); using (StreamReader reader = new(stream)) diff --git a/FloatTool/ViewModels/SettingsViewModel.cs b/FloatTool/ViewModels/SettingsViewModel.cs index 74fadaa..75b6636 100644 --- a/FloatTool/ViewModels/SettingsViewModel.cs +++ b/FloatTool/ViewModels/SettingsViewModel.cs @@ -63,8 +63,9 @@ public bool CheckUpdates public bool DiscordRPC { get { return Settings.DiscordRPC; } - set { - Settings.DiscordRPC = value; + set + { + Settings.DiscordRPC = value; OnPropertyChanged(); // Re-enabling does not work. Probably bug in the library @@ -151,16 +152,26 @@ public int CurrentLanguage public static List Languages { get; private set; } public static List LanguageCodes = new() { - "cs", "da", - "de", "en", - "es", "fi", - "fr", "ga", - "he", "hr", - "it", "ja", - "ka", "lt", - "lv", "pl", - "pt", "uk", - "tr", "ru", + "cs", + "da", + "de", + "en", + "es", + "fi", + "fr", + "ga", + "he", + "hr", + "it", + "ja", + "ka", + "lt", + "lv", + "pl", + "pt", + "uk", + "tr", + "ru", "zh", }; @@ -168,7 +179,7 @@ public SettingsViewModel(Settings settings) { Settings = settings; Languages = new List(); - + foreach (var lang in LanguageCodes) { var locale = new System.Globalization.CultureInfo(lang); diff --git a/FloatTool/Views/MainWindow.xaml b/FloatTool/Views/MainWindow.xaml index dce2463..5dcf8fe 100644 --- a/FloatTool/Views/MainWindow.xaml +++ b/FloatTool/Views/MainWindow.xaml @@ -20,10 +20,9 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:draw="clr-namespace:System.Drawing;assembly=System.Drawing" xmlns:local="clr-namespace:FloatTool" xmlns:theme="clr-namespace:FloatTool.Theme" - mc:Ignorable="d" + mc:Ignorable="d" KeyUp="Window_KeyUp" MinWidth="875" MinHeight="420" Width="875" Height="420" WindowStartupLocation="CenterScreen" @@ -303,7 +302,7 @@ - + @@ -313,7 +312,7 @@ - + @@ -323,7 +322,7 @@ - + @@ -333,7 +332,7 @@ - + @@ -343,7 +342,7 @@ - + @@ -353,7 +352,7 @@ - + @@ -363,7 +362,7 @@ - + @@ -373,7 +372,7 @@ - + @@ -383,7 +382,7 @@ - + @@ -393,7 +392,7 @@ - + diff --git a/FloatTool/Views/MainWindow.xaml.cs b/FloatTool/Views/MainWindow.xaml.cs index 97a224f..8e70cee 100644 --- a/FloatTool/Views/MainWindow.xaml.cs +++ b/FloatTool/Views/MainWindow.xaml.cs @@ -21,8 +21,11 @@ using System.Collections.Generic; using System.Diagnostics; using System.Globalization; +using System.IO; using System.Linq; +using System.Media; using System.Net.Http; +using System.Reflection; using System.Threading; using System.Threading.Tasks; using System.Windows; @@ -41,6 +44,7 @@ public partial class MainWindow : Window public static List ThreadPool; public static CancellationTokenSource TokenSource = new(); public CancellationToken CancellationToken; + public static SoundPlayer CombinationFoundSound; public void UpdateRichPresence() { @@ -60,12 +64,18 @@ public void UpdateRichPresence() public MainWindow() { + using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("FloatTool.Assets.Found.wav")) + { + CombinationFoundSound = new SoundPlayer(stream); + CombinationFoundSound.Load(); + } + Settings = new Settings(); Settings.TryLoad(); if (!Settings.Migrated) Settings.MigrateFromOldVersion(); - + App.SelectCulture(Settings.LanguageCode); App.SelectTheme(Settings.ThemeURI); @@ -105,6 +115,19 @@ protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) if (e.GetPosition(this).Y < 40) DragMove(); } + private void Window_KeyUp(object sender, KeyEventArgs e) + { + switch (e.Key) + { + case Key.F1: + Process.Start(new ProcessStartInfo { FileName = "https://prevter.github.io/FloatTool/table.html", UseShellExecute = true }); + break; + case Key.F2: + Process.Start(new ProcessStartInfo { FileName = "https://prevter.github.io/FloatTool/utils.html", UseShellExecute = true }); + break; + } + } + private void WindowButton_Click(object sender, RoutedEventArgs e) { switch (((Button)sender).Name) @@ -182,7 +205,7 @@ private void FloatCraftWorkerThread(CraftSearchSetup options) } ieeesum /= 10; float ieee = ((float)options.Outcomes[i].MaxFloat - (float)options.Outcomes[i].MinFloat) * ieeesum + (float)options.Outcomes[i].MinFloat; - + Dispatcher.Invoke(new Action(() => { ViewModel.FoundCombinations.Add(new Combination @@ -194,6 +217,8 @@ private void FloatCraftWorkerThread(CraftSearchSetup options) Price = price, IEEE754 = ((double)ieee).ToString("0.000000000000000", CultureInfo.InvariantCulture) }); + if (Settings.Sound) + CombinationFoundSound.Play(); }), DispatcherPriority.ContextIdle); } } @@ -218,7 +243,7 @@ private void StartSearchButton_Click(object sender, RoutedEventArgs e) TokenSource.Dispose(); TokenSource = new CancellationTokenSource(); CancellationToken = TokenSource.Token; - + if (Settings.DiscordRPC) { App.DiscordClient.SetPresence(new DiscordRPC.RichPresence() @@ -233,7 +258,7 @@ private void StartSearchButton_Click(object sender, RoutedEventArgs e) Timestamps = DiscordRPC.Timestamps.Now, }); } - + new Thread(() => { Logger.Log.Info("Starting up search"); @@ -274,13 +299,13 @@ private void StartSearchButton_Click(object sender, RoutedEventArgs e) response.EnsureSuccessStatusCode(); string responseBody = response.Content.ReadAsStringAsync().Result; dynamic r = JsonConvert.DeserializeObject(responseBody); - + if (r["success"] == false) { Logger.Log.Error($"Steam haven't returned a success code\n{r.ToString()}"); throw new ValueUnavailableException("Steam server returned error."); } - + SetStatus("m_GettingFloats"); Dictionary, float> floatTasks = new(); diff --git a/FloatTool/Views/SettingsWindow.xaml.cs b/FloatTool/Views/SettingsWindow.xaml.cs index d218996..99522e7 100644 --- a/FloatTool/Views/SettingsWindow.xaml.cs +++ b/FloatTool/Views/SettingsWindow.xaml.cs @@ -60,7 +60,7 @@ private void OpenThemesFolder_Click(object sender, RoutedEventArgs e) private void GetThemes_Click(object sender, RoutedEventArgs e) { - Process.Start(new ProcessStartInfo { FileName = "https://prevter.github.io/FloatTool-GUI/themes.html", UseShellExecute = true }); + Process.Start(new ProcessStartInfo { FileName = "https://prevter.github.io/FloatTool/themes.html", UseShellExecute = true }); } } } diff --git a/FloatTool/Views/UpdateWindow.xaml.cs b/FloatTool/Views/UpdateWindow.xaml.cs index a3b2741..93cd489 100644 --- a/FloatTool/Views/UpdateWindow.xaml.cs +++ b/FloatTool/Views/UpdateWindow.xaml.cs @@ -97,7 +97,7 @@ private void UpdateButtonClick(object sender, RoutedEventArgs e) File.Delete("update.zip"); ProcessStartInfo startInfo = new() - { + { FileName = "FloatTool.exe", Arguments = "--clean-update" }; diff --git a/README.md b/README.md index 9dc2fda..c4435f6 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ [![Build status](https://ci.appveyor.com/api/projects/status/pbudy8wm35ybxpuf?svg=true)](https://ci.appveyor.com/project/Prevter/floattool) [![Discord](https://img.shields.io/discord/852481556019019786?label=discord&logo=discord)](https://discord.gg/RM9VrzMfhP) -[![CodeQL](https://github.com/Prevter/FloatTool-GUI/workflows/CodeQL/badge.svg)](https://github.com/Prevter/FloatTool-GUI/actions/workflows/codeql-analysis.yml) -![GitHub all releases](https://img.shields.io/github/downloads/Prevter/FloatTool-GUI/total) -![GitHub](https://img.shields.io/github/license/Prevter/FloatTool-GUI) +[![CodeQL](https://github.com/Prevter/FloatTool/workflows/CodeQL/badge.svg)](https://github.com/Prevter/FloatTool/actions/workflows/codeql-analysis.yml) +![GitHub all releases](https://img.shields.io/github/downloads/Prevter/FloatTool/total) +![GitHub](https://img.shields.io/github/license/Prevter/FloatTool) +[![POEditor](https://img.shields.io/badge/translation-join-yellow)](https://poeditor.com/join/project/7ewXWFXF0h)
## Description -![Program Working](https://github.com/Prevter/FloatTool-GUI/blob/master/doc/program.png?raw=true) +![Program Working](https://github.com/Prevter/FloatTool/blob/master/doc/program.png?raw=true) This app allows you to quickly search combinations to craft skins in CS:GO with (almost) any float you want. All you have to do is set some search settings, wait a bit and all you have to do next is to buy skins from marketplace, that the app found to be needed. This is probably the fastest app you can find, as it can achieve more than 10,000,000 combinations per second on a i9-9900K.