diff --git a/FloatTool/Common/Utils.cs b/FloatTool/Common/Utils.cs index 12d3ab0..7b1dcb5 100644 --- a/FloatTool/Common/Utils.cs +++ b/FloatTool/Common/Utils.cs @@ -24,6 +24,7 @@ using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; +using System.Windows; namespace FloatTool { @@ -151,6 +152,21 @@ public static string ShortCpuName(string cpu) return cpu.Trim(); } + + public static string EscapeLocalization(string input) + { + string regex = @"%(m_[^%]{1,})%"; + var matches = Regex.Matches(input, regex); + + foreach (Match m in matches.Cast()) + { + string key = m.Groups[1].Value; + string localization = Application.Current.Resources[key] as string; + input = input.Replace(m.Value, localization); + } + + return input; + } } public class UpdateResult @@ -210,4 +226,39 @@ public bool IsOverlapped(FloatRange other) public float Min { get { return min; } } public float Max { get { return max; } } } + + /// + /// Used to store current Discord Presense and update language if needed + /// + public class RPCSettingsPersist + { + public string Details { get; set; } + public string State { get; set; } + + public DiscordRPC.Timestamps Timestamp { get; set; } + public bool ShowTime { get; set; } + + public DiscordRPC.RichPresence GetPresense() + { + string details = Utils.EscapeLocalization(Details); + string state = Utils.EscapeLocalization(State); + + var rpc = new DiscordRPC.RichPresence() + { + Details = details, + State = state, + Assets = new DiscordRPC.Assets() + { + LargeImageKey = "icon_new", + LargeImageText = $"FloatTool {AppHelpers.VersionCode}", + }, + }; + + if (ShowTime) + rpc.Timestamps = Timestamp; + + return rpc; + } + } + } diff --git a/FloatTool/Views/MainWindow.xaml.cs b/FloatTool/Views/MainWindow.xaml.cs index 51749aa..e8ef4ff 100644 --- a/FloatTool/Views/MainWindow.xaml.cs +++ b/FloatTool/Views/MainWindow.xaml.cs @@ -40,25 +40,26 @@ public partial class MainWindow : Window { public MainViewModel ViewModel; public Settings Settings; + private RPCSettingsPersist RPCSettings = new(); + private static long PassedCombinations; private static List ThreadPool; private static CancellationTokenSource TokenSource = new(); public CancellationToken CancellationToken; private static SoundPlayer CombinationFoundSound; - public void UpdateRichPresence() + public void UpdateRichPresence(bool clear=false) { + if (clear) + { + RPCSettings.Details = "%m_SettingUpSearch%"; + RPCSettings.State = ""; + RPCSettings.ShowTime = false; + } + if (Settings.DiscordRPC) { - AppHelpers.DiscordClient.SetPresence(new DiscordRPC.RichPresence() - { - Details = Application.Current.Resources["m_SettingUpSearch"] as string, - Assets = new DiscordRPC.Assets() - { - LargeImageKey = "icon_new", - LargeImageText = $"FloatTool {AppHelpers.VersionCode}", - } - }); + AppHelpers.DiscordClient.SetPresence(RPCSettings.GetPresense()); } } @@ -85,7 +86,7 @@ public MainWindow() MaxHeight = SystemParameters.WorkArea.Height + 12; MaxWidth = SystemParameters.WorkArea.Width + 12; - UpdateRichPresence(); + UpdateRichPresence(true); DataContext = ViewModel; Logger.Log.Info("Main window started"); @@ -167,7 +168,7 @@ private void WindowButton_Click(object sender, RoutedEventArgs e) break; } - // Update RPC after closing any window + // This will return rich presense to last state and update the language UpdateRichPresence(); } @@ -262,17 +263,12 @@ private void StartSearchButton_Click(object sender, RoutedEventArgs e) if (Settings.DiscordRPC) { - AppHelpers.DiscordClient.SetPresence(new DiscordRPC.RichPresence() - { - Details = $"{Application.Current.Resources["m_Searching"] as string} {ViewModel.FullSkinName}", - State = $"{Application.Current.Resources["m_DesiredFloat"] as string} {ViewModel.SearchFilter}", - Assets = new DiscordRPC.Assets() - { - LargeImageKey = "icon_new", - LargeImageText = $"FloatTool {AppHelpers.VersionCode}", - }, - Timestamps = DiscordRPC.Timestamps.Now, - }); + RPCSettings.Details = $"%m_Searching% {ViewModel.FullSkinName}"; + RPCSettings.Details = $"%m_DesiredFloat% {ViewModel.SearchFilter}"; + RPCSettings.Timestamp = DiscordRPC.Timestamps.Now; + RPCSettings.ShowTime = true; + + UpdateRichPresence(); } new Thread(() => @@ -396,6 +392,10 @@ private void StartSearchButton_Click(object sender, RoutedEventArgs e) } List inputSkinList = inputSkinBag.ToList(); + + // sort skins by price in ascending order + inputSkinList.Sort((a, b) => a.Price.CompareTo(b.Price)); + if (ViewModel.Sort) { if (ViewModel.SortDescending) @@ -487,6 +487,7 @@ private void StartSearchButton_Click(object sender, RoutedEventArgs e) Thread.Sleep(100); } + UpdateRichPresence(true); Logger.Log.Info("Finished searching"); Dispatcher.Invoke( new Action(() => @@ -503,6 +504,7 @@ private void StartSearchButton_Click(object sender, RoutedEventArgs e) { Logger.Log.Info("Canceling task"); TokenSource.Cancel(); + UpdateRichPresence(true); } } }