using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using Microsoft.Win32; using System.IO; using MessageBox = System.Windows.MessageBox; using System.Net; using System.Globalization; using ModernWpf.Controls; using System.Windows.Forms; namespace EZPPClient_Installer { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { [DllImport("kernel32.dll")] private static extern bool CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, SymbolicLink dwFlags); private static double VERSION = 1.6; public MainWindow() { InitializeComponent(); DownloadUtil.FilesToDownload("yeet"); Init(); } private async void Init() { UpdateInstallButton(false); UpdateState status = await CheckForInstallerUpdates(); switch (status) { case UpdateState.UpdateFound: ShowInstallerUpdateDialog(); return; case UpdateState.Error: return; } string versionString = "v" + VERSION; InstallerWindow.Title = "EZPPClient Installer " + versionString.Replace(",", "."); string osuPath = ""; bool isValidFolder = await isValidOsuFolder(osuPath); UpdateInstallButton(!string.IsNullOrEmpty(osuPath)); if(!string.IsNullOrEmpty(osuPath) && isValidFolder) { bool foundInstall = await isEZPPClientInstallationFound(osuPath); if (foundInstall) { Uninstall_Button.Visibility = Visibility.Visible; UpdateInstallButton(false); } folderTextbox.Text = osuPath; } else await new ContentDialog() { Title = "Hmmm..", Content = "We failed to locate your osu! Installation path, please define it manually qwq", PrimaryButtonText = "Okay qwq" }.ShowAsync(); } private async Task CheckForInstallerUpdates() { #if !DEBUG try { using (WebClient client = new WebClient()) { string newVersionString = client.DownloadString("https://ez-pp.farm/static/client/installer.ver"); double ver = 0; try { ver = double.Parse(newVersionString, CultureInfo.InvariantCulture); } catch (FormatException) { } if (ver > VERSION) return UpdateState.UpdateFound; } } catch (WebException e) { ShowErrorDialog(e.Message); return UpdateState.Error; } #endif return UpdateState.UpToDate; } private async void ShowErrorDialog(string error) { var dialog = new ContentDialog() { Title = "Oops...", Content = "Failed to connect to the EZPPFarm Website.\n" + error, PrimaryButtonText = "Exit" }; await dialog.ShowAsync(); this.Close(); } private async void ShowInstallerUpdateDialog() { UpdateInstallButton(false); var dialog = new ContentDialog() { Title = "New version available.", Content = "Please download the latest version.", PrimaryButtonText = "Download" }; var result = await dialog.ShowAsync(); if (result == ContentDialogResult.Primary) { System.Diagnostics.Process.Start("https://ez-pp.farm/download"); ShowInstallerUpdateDialog(); } } private void UpdateInstallButton(bool enable) { InstallButton.IsEnabled = enable; linkFoldersCheckbox.IsEnabled = enable; } private async void Install_Click(object sender, RoutedEventArgs e) { string osuFolder = folderTextbox.Text; bool isValid = await isValidOsuFolder(osuFolder); if (!isValid) { await new ContentDialog() { Title = "Hmmm..", Content = "It seems like the selected folder is not a osu! installation.", PrimaryButtonText = "Okay qwq" }.ShowAsync(); return; } } private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e) { System.Diagnostics.Process.Start("https://ez-pp.farm/"); e.Handled = true; } private async void Browse_Click(object sender, RoutedEventArgs e) { using (var fbd = new FolderBrowserDialog()) { DialogResult result = fbd.ShowDialog(); if (result == System.Windows.Forms.DialogResult.OK && !string.IsNullOrWhiteSpace(fbd.SelectedPath)) { bool isValid = await isValidOsuFolder(fbd.SelectedPath); if (!isValid) { await new ContentDialog() { Title = "Hmmm..", Content = "It seems like this location is not an osu! installation.", PrimaryButtonText = "Okay qwq" }.ShowAsync(); } else { bool foundInstall = await isEZPPClientInstallationFound(fbd.SelectedPath); folderTextbox.Text = fbd.SelectedPath; if (foundInstall) { Uninstall_Button.Visibility = Visibility.Visible; UpdateInstallButton(false); string osuEZPPPath = folderTextbox.Text + @"\EZPPClient"; List outdatedFiles = DownloadUtil.FilesToDownload(osuEZPPPath); if (!IsEmpty(outdatedFiles)) { InstallButton.Content = "Update"; UpdateInstallButton(true); } }else UpdateInstallButton(true); } } } } private async Task isEZPPClientInstallationFound(string folder) { string[] subDirs = Directory.GetDirectories(folder, "*"); bool doesExist = false; foreach (string dir in subDirs) { if(dir.Contains("EZPPClient")) { doesExist = true; break; } } return doesExist; } private async Task isValidOsuFolder(string folder) { if(string.IsNullOrEmpty(folder) || string.IsNullOrWhiteSpace(folder)) return false; string[] files = Directory.GetFiles(folder, "*"); string[] subDirs = Directory.GetDirectories(folder, "*"); bool hasSongsFolder = false; bool hasSkinsFolder = false; bool hasOsuExecutable = false; foreach(string file in files) { if (file.Contains("osu!.exe")) { hasOsuExecutable = true; break; } } foreach (string dir in subDirs) { if (dir.Contains("Songs") && !hasSongsFolder) hasSongsFolder = true; if (dir.Contains("Skins") && !hasSkinsFolder) hasSkinsFolder = true; if (hasSkinsFolder && hasSongsFolder) break; } return hasOsuExecutable && hasSkinsFolder && hasSongsFolder; } public static bool IsEmpty(List list) { if (list == null) { return true; } return !list.Any(); } private enum SymbolicLink { File, Directory } } }