diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json deleted file mode 100644 index f1e9d9e..0000000 --- a/.vs/VSWorkspaceState.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "ExpandedNodes": [ - "" - ], - "SelectedNode": "\\Sideloader.cs", - "PreviewInSolutionExplorer": false -} \ No newline at end of file diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite deleted file mode 100644 index f12efe3..0000000 Binary files a/.vs/slnx.sqlite and /dev/null differ diff --git a/AndroidSideloader.csproj b/AndroidSideloader.csproj index 9a73d8f..788c131 100644 --- a/AndroidSideloader.csproj +++ b/AndroidSideloader.csproj @@ -169,6 +169,13 @@ DonorsListView.cs + + Form + + + Splash.cs + + Form @@ -235,6 +242,9 @@ DonorsListView.cs + + Splash.cs + NewApps.cs @@ -285,6 +295,9 @@ Settings.settings True + + PreserveNewest + @@ -294,6 +307,7 @@ + diff --git a/AndroidSideloader.csproj.user b/AndroidSideloader.csproj.user deleted file mode 100644 index 76bb7f9..0000000 --- a/AndroidSideloader.csproj.user +++ /dev/null @@ -1,14 +0,0 @@ - - - - ShowAllFiles - publish\ - - - - - - en-US - false - - \ No newline at end of file diff --git a/ChangelogHistory.txt b/ChangelogHistory.txt index 35ef8a9..7689aad 100644 --- a/ChangelogHistory.txt +++ b/ChangelogHistory.txt @@ -1,4 +1,13 @@ -RSL 2.12 +RSL 2.13 + +- Added new config mode for use with http mirror +- Removed previous http mirror workarounds +- Added Offline Mode launcher to package fetch. +- Add splash screen on startup + +~SytheZN + +RSL 2.12 - updated auto-update source - update status text diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs index 8843418..23a4aa8 100644 --- a/MainForm.Designer.cs +++ b/MainForm.Designer.cs @@ -93,7 +93,7 @@ namespace AndroidSideloader this.label5 = new System.Windows.Forms.Label(); this.label6 = new System.Windows.Forms.Label(); this.label7 = new System.Windows.Forms.Label(); - this.label8 = new System.Windows.Forms.Label(); + this.lblMirror = new System.Windows.Forms.Label(); this.EnterInstallBox = new System.Windows.Forms.CheckBox(); this.ADBcommandbox = new System.Windows.Forms.TextBox(); this.label11 = new System.Windows.Forms.Label(); @@ -329,7 +329,7 @@ namespace AndroidSideloader // // progressBar // - this.progressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + this.progressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.progressBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); this.progressBar.ForeColor = System.Drawing.Color.Purple; @@ -879,8 +879,8 @@ namespace AndroidSideloader // // freeDisclaimer // - this.freeDisclaimer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) + this.freeDisclaimer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.freeDisclaimer.AutoSize = true; this.freeDisclaimer.DataBindings.Add(new System.Windows.Forms.Binding("ForeColor", global::AndroidSideloader.Properties.Settings.Default, "FontColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)); @@ -897,7 +897,7 @@ namespace AndroidSideloader // gamesQueListBox // this.gamesQueListBox.AllowDrop = true; - this.gamesQueListBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + this.gamesQueListBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.gamesQueListBox.BackColor = global::AndroidSideloader.Properties.Settings.Default.BackColor; this.gamesQueListBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; @@ -954,8 +954,8 @@ namespace AndroidSideloader // // gamesListView // - this.gamesListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) + this.gamesListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.gamesListView.BackColor = global::AndroidSideloader.Properties.Settings.Default.ComboBoxColor; this.gamesListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { @@ -1015,8 +1015,8 @@ namespace AndroidSideloader // // searchTextBox // - this.searchTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) + this.searchTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.searchTextBox.BackColor = global::AndroidSideloader.Properties.Settings.Default.TextBoxColor; this.searchTextBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; @@ -1087,7 +1087,7 @@ namespace AndroidSideloader // // notesRichTextBox // - this.notesRichTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + this.notesRichTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.notesRichTextBox.BackColor = global::AndroidSideloader.Properties.Settings.Default.BackColor; this.notesRichTextBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; @@ -1134,8 +1134,8 @@ namespace AndroidSideloader // // pictureBox1 // - this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) + this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.pictureBox1.BackColor = System.Drawing.Color.Transparent; this.pictureBox1.DataBindings.Add(new System.Windows.Forms.Binding("ImageLocation", global::AndroidSideloader.Properties.Settings.Default, "BackPicturePath", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)); @@ -1161,8 +1161,8 @@ namespace AndroidSideloader // // label3 // - this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) + this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.label3.AutoSize = true; this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold); @@ -1177,8 +1177,8 @@ namespace AndroidSideloader // // label4 // - this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) + this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.label4.AutoSize = true; this.label4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(45)))), ((int)(((byte)(45)))), ((int)(((byte)(45))))); @@ -1231,17 +1231,17 @@ namespace AndroidSideloader this.label7.Text = "= Up to date"; this.label7.TextAlign = System.Drawing.ContentAlignment.TopCenter; // - // label8 + // lblMirror // - this.label8.AutoSize = true; - this.label8.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold); - this.label8.ForeColor = System.Drawing.SystemColors.ControlLightLight; - this.label8.Location = new System.Drawing.Point(459, 42); - this.label8.Name = "label8"; - this.label8.Size = new System.Drawing.Size(65, 17); - this.label8.TabIndex = 90; - this.label8.Text = "Mirror #"; - this.label8.TextAlign = System.Drawing.ContentAlignment.TopCenter; + this.lblMirror.AutoSize = true; + this.lblMirror.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold); + this.lblMirror.ForeColor = System.Drawing.SystemColors.ControlLightLight; + this.lblMirror.Location = new System.Drawing.Point(459, 42); + this.lblMirror.Name = "lblMirror"; + this.lblMirror.Size = new System.Drawing.Size(65, 17); + this.lblMirror.TabIndex = 90; + this.lblMirror.Text = "Mirror #"; + this.lblMirror.TextAlign = System.Drawing.ContentAlignment.TopCenter; // // EnterInstallBox // @@ -1264,8 +1264,8 @@ namespace AndroidSideloader // // ADBcommandbox // - this.ADBcommandbox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) + this.ADBcommandbox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.ADBcommandbox.BackColor = global::AndroidSideloader.Properties.Settings.Default.TextBoxColor; this.ADBcommandbox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; @@ -1288,8 +1288,8 @@ namespace AndroidSideloader // // label11 // - this.label11.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) + this.label11.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.label11.AutoSize = true; this.label11.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(45)))), ((int)(((byte)(45)))), ((int)(((byte)(45))))); @@ -1305,8 +1305,8 @@ namespace AndroidSideloader // // label9 // - this.label9.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) + this.label9.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.label9.AutoSize = true; this.label9.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(45)))), ((int)(((byte)(45)))), ((int)(((byte)(45))))); @@ -1322,8 +1322,8 @@ namespace AndroidSideloader // // pictureBox7 // - this.pictureBox7.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) + this.pictureBox7.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.pictureBox7.BackColor = System.Drawing.Color.Transparent; this.pictureBox7.DataBindings.Add(new System.Windows.Forms.Binding("ImageLocation", global::AndroidSideloader.Properties.Settings.Default, "BackPicturePath", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)); @@ -1419,7 +1419,7 @@ namespace AndroidSideloader this.Controls.Add(this.label10); this.Controls.Add(this.label7); this.Controls.Add(this.label6); - this.Controls.Add(this.label8); + this.Controls.Add(this.lblMirror); this.Controls.Add(this.label5); this.Controls.Add(this.label11); this.Controls.Add(this.ADBcommandbox); @@ -1531,7 +1531,7 @@ namespace AndroidSideloader private System.Windows.Forms.PictureBox pictureBox4; private System.Windows.Forms.Label label6; private System.Windows.Forms.Label label7; - private System.Windows.Forms.Label label8; + private System.Windows.Forms.Label lblMirror; private System.Windows.Forms.CheckBox EnterInstallBox; private System.Windows.Forms.TextBox ADBcommandbox; private System.Windows.Forms.Label label11; diff --git a/MainForm.cs b/MainForm.cs index 71a927b..e93ba4c 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -10,10 +10,13 @@ using System.IO; using System.Linq; using System.Net.Http; using System.Net.NetworkInformation; +using System.Security.Cryptography; +using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; +using AndroidSideloader.Models; namespace AndroidSideloader @@ -50,6 +53,9 @@ namespace AndroidSideloader private bool isLoading = true; public static bool isOffline = false; + public static bool hasPublicConfig = false; + public static PublicConfig PublicConfigFile; + public MainForm() { @@ -66,6 +72,24 @@ namespace AndroidSideloader { FlexibleMessageBox.Show("Offline mode activated. You can't download games in this mode, only do local stuff."); } + else + { + if (File.Exists($"{Environment.CurrentDirectory}\\vrp-public.json")) + { + try + { + var configFileData = + File.ReadAllText($"{Environment.CurrentDirectory}\\vrp-public.json"); + var config = JsonConvert.DeserializeObject(configFileData); + PublicConfigFile = config; + hasPublicConfig = true; + } + catch + { + hasPublicConfig = false; + } + } + } InitializeComponent(); //Time between asking for new apps if user clicks No. 96,0,0 DEFAULT @@ -74,9 +98,9 @@ namespace AndroidSideloader TimeSpan newDayReference2 = new TimeSpan(72, 0, 0); TimeSpan comparison; TimeSpan comparison2; - - //These two variables set to show difference. - DateTime A = Properties.Settings.Default.LastLaunch; + + //These two variables set to show difference. + DateTime A = Properties.Settings.Default.LastLaunch; DateTime B = DateTime.Now; DateTime C = Properties.Settings.Default.LastLaunch2; comparison = B - A; @@ -151,6 +175,9 @@ namespace AndroidSideloader private async void Form1_Load(object sender, EventArgs e) { + var splash = new Splash(); + splash.Show(); + if (File.Exists("C:\\RSL\\platform-tools\\adb.exe")) { ADB.RunAdbCommandToString("kill-server"); @@ -181,7 +208,7 @@ namespace AndroidSideloader if (!isOffline) { RCLONE.Init(); - } + } try { Spoofer.spoofer.Init(); } catch { } if (Properties.Settings.Default.CallUpgrade) @@ -233,6 +260,19 @@ namespace AndroidSideloader File.Delete($"{Environment.CurrentDirectory}\\crashlog.txt"); } } + + if (hasPublicConfig) + { + lblMirror.Text = " Public Mirror"; + remotesList.Size = Size.Empty; + } + if (isOffline) + { + lblMirror.Text = " Offline Mode"; + remotesList.Size = Size.Empty; + } + + splash.Close(); } @@ -261,15 +301,17 @@ namespace AndroidSideloader { ChangeTitle("Initializing Servers..."); initMirrors(true); - if (Properties.Settings.Default.autoUpdateConfig) { + if (Properties.Settings.Default.autoUpdateConfig) + { ChangeTitle("Checking for a new Configuration File..."); SideloaderRCLONE.updateConfig(currentRemote); } - ChangeTitle("Grabbing the Games List..."); - SideloaderRCLONE.initGames(currentRemote); - //ChangeTitle("Syncing Game Photos"); - //ChangeTitle("Updating list of needed clean apps..."); - //ChangeTitle("Checking for Updates on server..."); + + if (!hasPublicConfig) + { + ChangeTitle("Grabbing the Games List..."); + SideloaderRCLONE.initGames(currentRemote); + } } else { @@ -279,10 +321,12 @@ namespace AndroidSideloader }); t1.SetApartmentState(ApartmentState.STA); t1.IsBackground = true; + if (HasInternet) t1.Start(); while (t1.IsAlive) await Task.Delay(100); + Thread t5 = new Thread(() => { if (!String.IsNullOrEmpty(Properties.Settings.Default.IPAddress)) @@ -331,62 +375,91 @@ namespace AndroidSideloader t5.Start(); while (t5.IsAlive) await Task.Delay(100); - Thread t2 = new Thread(() => - { - ChangeTitle("Updating Game Notes..."); - SideloaderRCLONE.UpdateGameNotes(currentRemote); - }); - Thread t3 = new Thread(() => + if (hasPublicConfig) { - ChangeTitle("Updating Game Thumbnails (This may take a minute or two)..."); - SideloaderRCLONE.UpdateGamePhotos(currentRemote); - }); - - Thread t4 = new Thread(() => - { - SideloaderRCLONE.UpdateNouns(currentRemote); - if (!Directory.Exists(SideloaderRCLONE.ThumbnailsFolder) || !Directory.Exists(SideloaderRCLONE.NotesFolder)) + var t2 = new Thread((() => { - FlexibleMessageBox.Show("It seems you are missing the thumbnails and/or notes database, the first start of the sideloader takes a bit more time, so dont worry if it looks stuck!"); + ChangeTitle("Updating Metadata..."); + SideloaderRCLONE.UpdateMetadataFromPublic(); + + ChangeTitle("Processing Metadata..."); + SideloaderRCLONE.ProcessMetadataFromPublic(); + })); + + t2.IsBackground = true; + if (HasInternet) + { + t2.Start(); } - }); - t2.IsBackground = true; - t3.IsBackground = true; - t4.IsBackground = true; - - if (HasInternet) - { - t2.Start(); - } - while (t2.IsAlive) - await Task.Delay(50); - - if (HasInternet) - { - t3.Start(); - } - while (t3.IsAlive) - await Task.Delay(50); - if (HasInternet) - { - t4.Start(); + while (t2.IsAlive) + await Task.Delay(50); } - while (t4.IsAlive) - await Task.Delay(50); + else + { + Thread t2 = new Thread(() => + { + ChangeTitle("Updating Game Notes..."); + SideloaderRCLONE.UpdateGameNotes(currentRemote); + }); + + Thread t3 = new Thread(() => + { + ChangeTitle("Updating Game Thumbnails (This may take a minute or two)..."); + SideloaderRCLONE.UpdateGamePhotos(currentRemote); + }); + + Thread t4 = new Thread(() => + { + SideloaderRCLONE.UpdateNouns(currentRemote); + if (!Directory.Exists(SideloaderRCLONE.ThumbnailsFolder) || + !Directory.Exists(SideloaderRCLONE.NotesFolder)) + { + FlexibleMessageBox.Show( + "It seems you are missing the thumbnails and/or notes database, the first start of the sideloader takes a bit more time, so dont worry if it looks stuck!"); + } + }); + t2.IsBackground = true; + t3.IsBackground = true; + t4.IsBackground = true; + + if (HasInternet) + { + t2.Start(); + } + + while (t2.IsAlive) + await Task.Delay(50); + + if (HasInternet) + { + t3.Start(); + } + + while (t3.IsAlive) + await Task.Delay(50); + + if (HasInternet) + { + t4.Start(); + } + + while (t4.IsAlive) + await Task.Delay(50); + } progressBar.Style = ProgressBarStyle.Marquee; ChangeTitle("Populating Game Update List, Almost There!"); - + await CheckForDevice(); if (ADB.DeviceID.Length < 5) { nodeviceonstart = true; } - listappsbtn(); + listappsbtn(); showAvailableSpace(); downloadInstallGameButton.Enabled = true; isLoading = false; @@ -579,7 +652,8 @@ namespace AndroidSideloader public static void notify(string message) { if (Properties.Settings.Default.enableMessageBoxes == true) - FlexibleMessageBox.Show(new Form { + FlexibleMessageBox.Show(new Form + { TopMost = true, StartPosition = FormStartPosition.CenterScreen }, message); @@ -859,7 +933,7 @@ namespace AndroidSideloader ChangeTitle("Extracting APK...."); Directory.CreateDirectory($"{Properties.Settings.Default.MainDir}\\{packageName}"); - + Thread t1 = new Thread(() => { output = Sideloader.getApk(GameName); @@ -906,7 +980,7 @@ namespace AndroidSideloader ChangeTitle("Uploading to shared drive, you can continue to use Rookie while it uploads in the background."); RCLONE.runRcloneCommand($"copy \"{Properties.Settings.Default.MainDir}\\{GameName} v{VersionInt} {packageName}.zip\" RSL-gameuploads:"); File.Delete($"{Properties.Settings.Default.MainDir}\\{GameName} v{VersionInt} {packageName}.zip"); - FlexibleMessageBox.Show($"Upload of {currentlyuploading} is complete! Thank you for your contribution!"); + this.Invoke(() => FlexibleMessageBox.Show($"Upload of {currentlyuploading} is complete! Thank you for your contribution!")); Directory.Delete($"{Properties.Settings.Default.MainDir}\\{packageName}", true); }); t3.IsBackground = true; @@ -917,7 +991,7 @@ namespace AndroidSideloader { await Task.Delay(100); } - + ChangeTitle(" \n\n"); isuploading = false; ULGif.Visible = false; @@ -1442,12 +1516,12 @@ namespace AndroidSideloader while (t1.IsAlive) await Task.Delay(100); } - else if(!isOffline) + else if (!isOffline) { SwitchMirrors(); initListView(); } - + if (blacklistItems.Count == 0 && GameList.Count == 0 && !Properties.Settings.Default.nodevicemode && !isOffline) { @@ -1659,7 +1733,7 @@ namespace AndroidSideloader public static async void newpackageupload() { - if (!String.IsNullOrEmpty(Properties.Settings.Default.NonAppPackages) && !Properties.Settings.Default.ListUpped) + if (!String.IsNullOrEmpty(Properties.Settings.Default.NonAppPackages) && !Properties.Settings.Default.ListUpped) { Random r = new Random(); int x = r.Next(9999); @@ -1744,7 +1818,7 @@ namespace AndroidSideloader if (itemsCount > 0) { - + var rand = new Random(); // Code that implements a randomized mirror. The rotation logic (the rotation) is reported as being bugged so I just disabled as a workaround ~pmow // if (random == true && index < itemsCount) @@ -1759,10 +1833,10 @@ namespace AndroidSideloader remotesList.Invoke(() => { remotesList.SelectedIndex = 0; //set mirror to first - currentRemote = "VRP-mirror" + remotesList.SelectedItem.ToString(); + currentRemote = "VRP-mirror" + remotesList.SelectedItem.ToString(); }); - - + + }; } @@ -1905,20 +1979,21 @@ without him none of this would be possible ShowError_QuotaExceeded(); DialogResult om = MessageBox.Show("Relaunch Rookie in Offline Mode?", "Offline Mode?", MessageBoxButtons.YesNo); - if (om == DialogResult.Yes) { + if (om == DialogResult.Yes) + { Process pr = new Process(); - pr.StartInfo.WorkingDirectory = Application.StartupPath; - pr.StartInfo.FileName = System.AppDomain.CurrentDomain.FriendlyName; - pr.StartInfo.Arguments = "--offline"; - pr.Start(); - Process.GetCurrentProcess().Kill(); + pr.StartInfo.WorkingDirectory = Application.StartupPath; + pr.StartInfo.FileName = System.AppDomain.CurrentDomain.FriendlyName; + pr.StartInfo.Arguments = "--offline"; + pr.Start(); + Process.GetCurrentProcess().Kill(); } - if (System.Windows.Forms.Application.MessageLoop) + if (System.Windows.Forms.Application.MessageLoop) { Process.GetCurrentProcess().Kill(); } - + } if (remotesList.SelectedIndex + 1 == remotesList.Items.Count) { @@ -1969,10 +2044,11 @@ Things you can try: showAvailableSpace(); ChangeTitle("Device now detected... refreshing update list."); listappsbtn(); - initListView(); + initListView(); } progressBar.Style = ProgressBarStyle.Marquee; - if (gamesListView.SelectedItems.Count == 0) { + if (gamesListView.SelectedItems.Count == 0) + { progressBar.Style = ProgressBarStyle.Continuous; ChangeTitle("You must select a game from the Game List!"); return; @@ -2032,16 +2108,71 @@ Things you can try: string dir = Path.GetDirectoryName(gameName); string gameDirectory = Environment.CurrentDirectory + "\\" + gameName; string path = gameDirectory; - Directory.CreateDirectory(gameDirectory); + + var gameNameHash = string.Empty; + using (var md5 = MD5.Create()) + { + var bytes = Encoding.UTF8.GetBytes(gameName + "\n"); + var hash = md5.ComputeHash(bytes); + var sb = new StringBuilder(); + foreach (var b in hash) + { + sb.Append(b.ToString("x2")); + } + + gameNameHash = sb.ToString(); + } + ProcessOutput gameDownloadOutput = new ProcessOutput("", ""); Logger.Log($"Starting Game Download"); - Logger.Log($"rclone copy \"{currentRemote}:{SideloaderRCLONE.RcloneGamesFolder}/{gameName}\""); - Thread t1 = new Thread(() => + Thread t1; + if (hasPublicConfig) { - gameDownloadOutput = RCLONE.runRcloneCommand($"copy \"{currentRemote}:{SideloaderRCLONE.RcloneGamesFolder}/{gameName}\" \"{Environment.CurrentDirectory}\\{gameName}\" --progress --rc --transfers 1 --multi-thread-streams 1 --checkers 1", Properties.Settings.Default.BandwithLimit); - }); + bool doDownload = true; + if (Directory.Exists(gameDirectory)) + { + var res = FlexibleMessageBox.Show( + $"{gameName} exists in destination directory.\r\nWould you like to overwrite it?", + "Download again?", MessageBoxButtons.YesNo); + + doDownload = res == DialogResult.Yes; + + if (doDownload) + { + // only delete after extraction; allows for resume if the fetch fails midway. + if (Directory.Exists($"{Environment.CurrentDirectory}\\{gameName}")) + Directory.Delete($"{Environment.CurrentDirectory}\\{gameName}", true); + } + } + + if (doDownload) + { + Logger.Log($"rclone copy \"Public:{SideloaderRCLONE.RcloneGamesFolder}/{gameName}\""); + t1 = new Thread(() => + { + var rclonecommand = + $"copy --progress --rc --http-url {PublicConfigFile.BaseUri} \":http:/{gameNameHash}/\" \"{Environment.CurrentDirectory}\\{gameNameHash}\""; + gameDownloadOutput = RCLONE.runRcloneCommand(rclonecommand, + Properties.Settings.Default.BandwithLimit, true); + }); + } + else + { + t1 = new Thread(() => { gameDownloadOutput = new ProcessOutput("Download skipped."); }); + } + } + else + { + Directory.CreateDirectory(gameDirectory); + Logger.Log($"rclone copy \"{currentRemote}:{SideloaderRCLONE.RcloneGamesFolder}/{gameName}\""); + t1 = new Thread(() => + { + gameDownloadOutput = RCLONE.runRcloneCommand($"copy \"{currentRemote}:{SideloaderRCLONE.RcloneGamesFolder}/{gameName}\" \"{Environment.CurrentDirectory}\\{gameName}\" --progress --rc", Properties.Settings.Default.BandwithLimit); + }); + } + t1.IsBackground = true; t1.Start(); @@ -2104,14 +2235,26 @@ Things you can try: } + if (removedownloading) - { + { ChangeTitle("Deleting game files", false); try { - Directory.Delete(Environment.CurrentDirectory + "\\" + gameName, true); + if (hasPublicConfig) + { + if (Directory.Exists($"{Environment.CurrentDirectory}\\{gameNameHash}")) + Directory.Delete($"{Environment.CurrentDirectory}\\{gameNameHash}", true); + if (Directory.Exists($"{Environment.CurrentDirectory}\\{gameName}")) + Directory.Delete($"{Environment.CurrentDirectory}\\{gameName}", true); + } + else + { + Directory.Delete(Environment.CurrentDirectory + "\\" + gameName, true); + } } - catch (Exception ex) { + catch (Exception ex) + { FlexibleMessageBox.Show($"Error deleting game files: {ex.Message}"); } ChangeTitle(""); @@ -2121,6 +2264,7 @@ Things you can try: //Quota Errors bool isinstalltxt = false; bool quotaError = false; + bool otherError = false; if (gameDownloadOutput.Error.Length > 0 && !isOffline) { string err = gameDownloadOutput.Error.ToLower(); @@ -2135,9 +2279,39 @@ Things you can try: gamesQueListBox.DataSource = null; gamesQueListBox.DataSource = gamesQueueList; } - else if (!gameDownloadOutput.Error.Contains("localhost")) FlexibleMessageBox.Show($"Rclone error: {gameDownloadOutput.Error}"); + else if (!gameDownloadOutput.Error.Contains("localhost")) + { + otherError = true; + + //Remove current game + gamesQueueList.RemoveAt(0); + gamesQueListBox.DataSource = null; + gamesQueListBox.DataSource = gamesQueueList; + + FlexibleMessageBox.Show($"Rclone error: {gameDownloadOutput.Error}"); + output += new ProcessOutput("", "Download Failed"); + } } - if (quotaError == false) + + if (hasPublicConfig && otherError == false && gameDownloadOutput.Output != "Download skipped.") + { + try + { + ChangeTitle("Extracting " + gameName, false); + Zip.ExtractFile($"{Environment.CurrentDirectory}\\{gameNameHash}\\{gameNameHash}.7z.001", $"{Environment.CurrentDirectory}", PublicConfigFile.Password); + if (Directory.Exists($"{Environment.CurrentDirectory}\\{gameNameHash}")) + Directory.Delete($"{Environment.CurrentDirectory}\\{gameNameHash}", true); + + } + catch (Exception ex) + { + otherError = true; + FlexibleMessageBox.Show($"7zip error: {ex.Message}"); + output += new ProcessOutput("", "Extract Failed"); + } + } + + if (quotaError == false && otherError == false) { ADB.WakeDevice(); ADB.DeviceID = GetDeviceID(); @@ -2238,17 +2412,17 @@ Things you can try: isinstalling = false; return; } - ChangeTitle("Refreshing games list, please wait... \n"); - showAvailableSpace(); - listappsbtn(); - initListView(); - ShowPrcOutput(output); - progressBar.Style = ProgressBarStyle.Continuous; - etaLabel.Text = "ETA: Finished Queue"; - speedLabel.Text = "DLS: Finished Queue"; - ProgressText.Text = ""; - gamesAreDownloading = false; - isinstalling = false; + ChangeTitle("Refreshing games list, please wait... \n"); + showAvailableSpace(); + listappsbtn(); + initListView(); + ShowPrcOutput(output); + progressBar.Style = ProgressBarStyle.Continuous; + etaLabel.Text = "ETA: Finished Queue"; + speedLabel.Text = "DLS: Finished Queue"; + ProgressText.Text = ""; + gamesAreDownloading = false; + isinstalling = false; ChangeTitle(" \n\n"); } diff --git a/MainForm.resx b/MainForm.resx index 29dcb1b..b3852cf 100644 --- a/MainForm.resx +++ b/MainForm.resx @@ -117,4 +117,76 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + + + 752, 113 + + + 498, 113 + + + 256, 113 + + + 17, 113 + + + 2205, 65 + + + 1921, 65 + + + 1614, 65 + + + 1322, 65 + + + 963, 65 + + + 761, 65 + + + 515, 65 + + + 290, 65 + + + 17, 65 + + + 2122, 17 + + + 1827, 17 + + + 1537, 17 + + + 1252, 17 + + + 955, 17 + + + 718, 17 + + + 499, 17 + + + 304, 17 + + + 994, 113 + + + 1231, 113 + \ No newline at end of file diff --git a/Models/PublicConfig.cs b/Models/PublicConfig.cs new file mode 100644 index 0000000..41f8af5 --- /dev/null +++ b/Models/PublicConfig.cs @@ -0,0 +1,25 @@ +using Newtonsoft.Json; +using System; +using System.Text; + +namespace AndroidSideloader.Models +{ + [JsonObject(MemberSerialization.OptIn)] + public class PublicConfig + { + [JsonProperty("baseUri")] + public string BaseUri { get; set; } + + private string password; + + [JsonProperty("password")] + public string Password + { + get => password; + set + { + password = Encoding.UTF8.GetString(Convert.FromBase64String(value)); + } + } + } +} diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index d4fa283..16e0036 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace AndroidSideloader.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class Resources { @@ -160,6 +160,16 @@ namespace AndroidSideloader.Properties { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap splash { + get { + object obj = ResourceManager.GetObject("splash", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/Properties/Resources.resx b/Properties/Resources.resx index 7045aff..fb867d3 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -151,4 +151,7 @@ ..\Resources\UpdatesKey.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\splash.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/RCLONE.cs b/RCLONE.cs index d7487bf..1aac57a 100644 --- a/RCLONE.cs +++ b/RCLONE.cs @@ -27,14 +27,15 @@ namespace AndroidSideloader } //Change if you want to use a config - public static string configPath = ""; // ".\\a" + public static string configPath = "vrp.download.config"; public static string rclonepw = ""; private static Process rclone = new Process(); //Run rclone command - public static ProcessOutput runRcloneCommand(string command, string bandwithLimit = "") + // noconfig suppresses the config directive for using with a command specified mirror + public static ProcessOutput runRcloneCommand(string command, string bandwithLimit = "", bool noConfig = false) { if (!MainForm.HasInternet || MainForm.isOffline) { @@ -53,7 +54,7 @@ namespace AndroidSideloader } //set configpath if there is any - if (configPath.Length > 0) + if (configPath.Length > 0 && !noConfig) { command += $" --config {configPath}"; } @@ -91,6 +92,9 @@ namespace AndroidSideloader //if there is one of these errors, we switch the mirrors if (error.Contains("400 Bad Request") || error.Contains("cannot fetch token") || error.Contains("authError") || error.Contains("quota") || error.Contains("exceeded") || error.Contains("directory not found") || error.Contains("Failed to")) { + if (MainForm.hasPublicConfig) + return new ProcessOutput("Failed to fetch from public mirror.", "Failed to fetch from public mirror."); + string oldRemote = MainForm.currentRemote; try { diff --git a/Resources/splash.jpg b/Resources/splash.jpg new file mode 100644 index 0000000..be020d3 Binary files /dev/null and b/Resources/splash.jpg differ diff --git a/Rookie Offline.cmd b/Rookie Offline.cmd new file mode 100644 index 0000000..134aa0e --- /dev/null +++ b/Rookie Offline.cmd @@ -0,0 +1,10 @@ + + + +@echo off + +for /f "tokens=* usebackq" %%f in (`dir /b AndroidSideloader*.exe`) do (set "sideloader=%%f" & goto :next) +:next + +echo %sideloader% +start "" "%sideloader%" "--offline" \ No newline at end of file diff --git a/Sideloader.cs b/Sideloader.cs index bb4613e..15cd797 100644 --- a/Sideloader.cs +++ b/Sideloader.cs @@ -247,6 +247,10 @@ And all of them added to PATH, without ANY of them, the spoofer won't work!"; { if (!File.Exists("Sideloader Launcher.exe")) client.DownloadFile("https://github.com/nerdunit/androidsideloader/raw/master/Sideloader%20Launcher.exe", "Sideloader Launcher.exe"); + + if (!File.Exists("Rookie Offline.cmd")) + client.DownloadFile("https://github.com/nerdunit/androidsideloader/raw/master/Rookie%20Offline.cmd", "Rookie Offline.cmd"); + if (!File.Exists("C:\\RSL\\platform-tools\\aug2021.txt") || !File.Exists("C:\\RSL\\platform-tools\\adb.exe")) //if adb is not updated, download and auto extract { if (Directory.Exists($"C:\\RSL\\2.8.2")) diff --git a/Sideloader/RCLONE.cs b/Sideloader/RCLONE.cs index 5d2a500..4299b67 100644 --- a/Sideloader/RCLONE.cs +++ b/Sideloader/RCLONE.cs @@ -4,6 +4,7 @@ using System.Net; using System.IO; using System.Linq; using System.Security.Cryptography; +using AndroidSideloader.Utilities; namespace AndroidSideloader { @@ -48,19 +49,68 @@ namespace AndroidSideloader public static void UpdateNouns(string remote) { Logger.Log($"Updating Nouns"); - RCLONE.runRcloneCommand($"sync \"{remote}:{RcloneGamesFolder}/.meta/nouns\" \"{Nouns}\" --http-no-head --transfers 2 --multi-thread-streams 1"); + RCLONE.runRcloneCommand($"sync \"{remote}:{RcloneGamesFolder}/.meta/nouns\" \"{Nouns}\""); } public static void UpdateGamePhotos(string remote) { Logger.Log($"Updating Thumbnails"); - RCLONE.runRcloneCommand($"sync \"{remote}:{RcloneGamesFolder}/.meta/thumbnails\" \"{ThumbnailsFolder}\" --http-no-head --transfers 2 --multi-thread-streams 1"); + RCLONE.runRcloneCommand($"sync \"{remote}:{RcloneGamesFolder}/.meta/thumbnails\" \"{ThumbnailsFolder}\""); } public static void UpdateGameNotes(string remote) { Logger.Log($"Updating Game Notes"); - RCLONE.runRcloneCommand($"sync \"{remote}:{RcloneGamesFolder}/.meta/notes\" \"{NotesFolder}\" --http-no-head --transfers 2 --multi-thread-streams 1"); + RCLONE.runRcloneCommand($"sync \"{remote}:{RcloneGamesFolder}/.meta/notes\" \"{NotesFolder}\""); + } + + public static void UpdateMetadataFromPublic() + { + Logger.Log($"Downloading Metadata"); + var rclonecommand = + $"sync --http-url {MainForm.PublicConfigFile.BaseUri} \":http:/meta.7z\" \"{Environment.CurrentDirectory}\""; + RCLONE.runRcloneCommand(rclonecommand); + } + + public static void ProcessMetadataFromPublic() + { + try + { + Logger.Log($"Extracting Metadata"); + Zip.ExtractFile($"{Environment.CurrentDirectory}\\meta.7z", $"{Environment.CurrentDirectory}\\meta", + MainForm.PublicConfigFile.Password); + + Logger.Log($"Updating Metadata"); + + if (Directory.Exists(Nouns)) Directory.Delete(Nouns, true); + if (Directory.Exists(ThumbnailsFolder)) Directory.Delete(ThumbnailsFolder, true); + if (Directory.Exists(NotesFolder)) Directory.Delete(NotesFolder, true); + + Directory.Move($"{Environment.CurrentDirectory}\\meta\\.meta\\nouns", Nouns); + Directory.Move($"{Environment.CurrentDirectory}\\meta\\.meta\\thumbnails", ThumbnailsFolder); + Directory.Move($"{Environment.CurrentDirectory}\\meta\\.meta\\notes", NotesFolder); + + Logger.Log($"Initializing Games List"); + var gameList = File.ReadAllText($"{Environment.CurrentDirectory}\\meta\\VRP-GameList.txt"); + + string[] splitList = gameList.Split('\n'); + splitList = splitList.Skip(1).ToArray(); + foreach (string game in splitList) + { + if (game.Length > 1) + { + string[] splitGame = game.Split(';'); + games.Add(splitGame); + } + } + + Directory.Delete($"{Environment.CurrentDirectory}\\meta", true); + } + catch (Exception e) + { + Logger.Log(e.Message); + Logger.Log(e.StackTrace); + } } public static void RefreshRemotes() diff --git a/Splash.Designer.cs b/Splash.Designer.cs new file mode 100644 index 0000000..e15a82d --- /dev/null +++ b/Splash.Designer.cs @@ -0,0 +1,55 @@ +namespace AndroidSideloader +{ + partial class Splash + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // Splash + // + this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackgroundImage = global::AndroidSideloader.Properties.Resources.splash; + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.CausesValidation = false; + this.ClientSize = new System.Drawing.Size(640, 384); + this.ControlBox = false; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "Splash"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Splash"; + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/Splash.cs b/Splash.cs new file mode 100644 index 0000000..702ada5 --- /dev/null +++ b/Splash.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace AndroidSideloader +{ + public partial class Splash : Form + { + public Splash() + { + InitializeComponent(); + } + } +} diff --git a/Splash.resx b/Splash.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Splash.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Updater.cs b/Updater.cs index f797b2b..97b1481 100644 --- a/Updater.cs +++ b/Updater.cs @@ -17,7 +17,7 @@ namespace AndroidSideloader private static string RawGitHubUrl; private static string GitHubUrl; - static readonly public string LocalVersion = "2.12"; + static readonly public string LocalVersion = "2.13"; public static string currentVersion = string.Empty; public static string changelog = string.Empty; diff --git a/Utilities/GeneralUtilities.cs b/Utilities/GeneralUtilities.cs index 050f746..3f9a657 100644 --- a/Utilities/GeneralUtilities.cs +++ b/Utilities/GeneralUtilities.cs @@ -104,6 +104,18 @@ namespace AndroidSideloader.Utilities class Zip { public static void ExtractFile(string sourceArchive, string destination) + { + var args = $"x \"{sourceArchive}\" -y -o\"{destination}\""; + DoExtract(args); + } + + public static void ExtractFile(string sourceArchive, string destination, string password) + { + var args = $"x \"{sourceArchive}\" -y -o\"{destination}\" -p\"{password}\""; + DoExtract(args); + } + + private static void DoExtract(string args) { if (!File.Exists(Environment.CurrentDirectory + "\\7z.exe") || !File.Exists(Environment.CurrentDirectory + "\\7z.dll")) { @@ -114,9 +126,11 @@ namespace AndroidSideloader.Utilities ProcessStartInfo pro = new ProcessStartInfo(); pro.WindowStyle = ProcessWindowStyle.Hidden; pro.FileName = "7z.exe"; - pro.Arguments = string.Format("x \"{0}\" -y -o\"{1}\"", sourceArchive, destination); + pro.Arguments = args; Process x = Process.Start(pro); x.WaitForExit(); + if (x.ExitCode != 0) + throw new ApplicationException($"Extracting failed, status code {x.ExitCode}"); } } diff --git a/changelog.txt b/changelog.txt index 2a2b7fd..0a8092b 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,11 +1,8 @@ -RSL 2.12 +RSL 2.13 -- fixed issue with configuration always updating -- fixed github version vs app version comparison -- fixed github download url -- restored "auto update config" checkbox -- fixed tooltips; added additional tooltips to all menu items -- gui fixes and updates to game donation menu -- additional logging and on-screen notifications +- Added new config mode for use with http mirror +- Removed previous http mirror workarounds +- Added Offline Mode launcher to package fetch. +- Add splash screen on startup -~fenopy \ No newline at end of file +~SytheZN \ No newline at end of file diff --git a/version b/version index a202097..cb94c17 100644 --- a/version +++ b/version @@ -1 +1 @@ -2.12 \ No newline at end of file +2.13 \ No newline at end of file