public static bool NeedsUpdate(string latest, string current, ref BuildNumber latestBuildNumber, ref BuildNumber currentBuildNumber) { var latestSplit = latest.Split('.'); var currentSplit = current.Split('.'); try { latestBuildNumber.Major = Int32.Parse(latestSplit[0]); latestBuildNumber.Minor = Int32.Parse(latestSplit[1]); latestBuildNumber.Build = Int32.Parse(latestSplit[2]); latestBuildNumber.Revision = Int32.Parse(latestSplit[3]); currentBuildNumber.Major = Int32.Parse(currentSplit[0]); currentBuildNumber.Minor = Int32.Parse(currentSplit[1]); currentBuildNumber.Build = Int32.Parse(currentSplit[2]); currentBuildNumber.Revision = Int32.Parse(currentSplit[3]); } catch (Exception ex) { return false; } if (latestBuildNumber.Major <= currentBuildNumber.Major) { if (latestBuildNumber.Minor <= currentBuildNumber.Minor) { if (latestBuildNumber.Build == currentBuildNumber.Build) { return latestBuildNumber.Revision > currentBuildNumber.Revision; } return latestBuildNumber.Build > currentBuildNumber.Build; } return true; } return true; }
/// <summary> /// </summary> public static void CheckUpdates() { try { var updaters = Process.GetProcessesByName("FFXIVAPP.Updater"); foreach (var updater in updaters) { updater.Kill(); } if (File.Exists("FFXIVAPP.Updater.exe")) { File.Delete("FFXIVAPP.Updater.Backup.exe"); } else { if (File.Exists("FFXIVAPP.Updater.Backup.exe")) { File.Move("FFXIVAPP.Updater.Backup.exe", "FFXIVAPP.Updater.exe"); } } } catch (Exception ex) { } Func<bool> updateCheck = delegate { var current = Assembly.GetExecutingAssembly() .GetName() .Version.ToString(); AppViewModel.Instance.CurrentVersion = current; var httpWebRequest = (HttpWebRequest) WebRequest.Create(String.Format("http://ffxiv-app.com/Json/CurrentVersion/")); httpWebRequest.UserAgent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.70 Safari/533.4"; httpWebRequest.Headers.Add("Accept-Language", "en;q=0.8"); httpWebRequest.ContentType = "application/json; charset=utf-8"; httpWebRequest.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore); using (var httpResponse = (HttpWebResponse) httpWebRequest.GetResponse()) { using (var response = httpResponse.GetResponseStream()) { var responseText = ""; if (response != null) { using (var streamReader = new StreamReader(response)) { responseText = streamReader.ReadToEnd(); } } var latestBuild = new BuildNumber(); var currentBuild = new BuildNumber(); if (httpResponse.StatusCode != HttpStatusCode.OK || String.IsNullOrWhiteSpace(responseText)) { AppViewModel.Instance.HasNewVersion = false; AppViewModel.Instance.LatestVersion = "Unknown"; } else { var jsonResult = JObject.Parse(responseText); var latest = jsonResult["Version"].ToString(); var updateNotes = jsonResult["Notes"].ToList(); //var enabledFeatures = jsonResult["Features"]; //try //{ // foreach (var feature in enabledFeatures) // { // var key = feature["Hash"].ToString(); // var enabled = (bool) feature["Enabled"]; // } //} //catch (Exception ex) //{ //} try { foreach (var note in updateNotes.Select(updateNote => updateNote.Value<string>())) { AppViewModel.Instance.UpdateNotes.Add(note); } } catch (Exception ex) { MessageBoxHelper.ShowMessage("Error", ex.Message); } AppViewModel.Instance.DownloadUri = jsonResult["DownloadUri"].ToString(); latest = (latest == "Unknown") ? "Unknown" : String.Format("3{0}", latest.Substring(1)); AppViewModel.Instance.LatestVersion = latest; switch (latest) { case "Unknown": AppViewModel.Instance.HasNewVersion = false; break; default: AppViewModel.Instance.HasNewVersion = BuildUtilities.NeedsUpdate(latest, current, ref latestBuild, ref currentBuild); break; } if (AppViewModel.Instance.HasNewVersion) { var title = String.Format("{0} {1}", AppViewModel.Instance.Locale["app_DownloadNoticeHeader"], AppViewModel.Instance.Locale["app_DownloadNoticeMessage"]); var message = new StringBuilder(); try { var latestBuildDateTime = new DateTime(2000, 1, 1).Add(new TimeSpan(TimeSpan.TicksPerDay * latestBuild.Build + TimeSpan.TicksPerSecond * 2 * latestBuild.Revision)); var currentBuildDateTime = new DateTime(2000, 1, 1).Add(new TimeSpan(TimeSpan.TicksPerDay * currentBuild.Build + TimeSpan.TicksPerSecond * 2 * currentBuild.Revision)); var timeSpan = latestBuildDateTime - currentBuildDateTime; if (timeSpan.TotalSeconds > 0) { message.AppendLine(String.Format("Missing {0} days, {1} hours and {2} seconds of updates.{3}", timeSpan.Days, timeSpan.Hours, timeSpan.Seconds)); } } catch (Exception ex) { } finally { message.AppendLine(AppViewModel.Instance.Locale["app_AlwaysReadUpdatesMessage"]); } MessageBoxHelper.ShowMessageAsync(title, message.ToString(), () => ShellView.CloseApplication(true), delegate { }); } var uri = "http://ffxiv-app.com/Analytics/Google/?eCategory=Application Launch&eAction=Version Check&eLabel=FFXIVAPP"; DispatcherHelper.Invoke(() => MainView.View.GoogleAnalytics.Navigate(uri)); } } } return true; }; updateCheck.BeginInvoke(null, null); }
public static void LoadAvailablePlugins() { UpdateView.View.AvailableLoadingInformation.Visibility = Visibility.Visible; UpdateViewModel.Instance.AvailablePlugins.Clear(); Func<bool> updateCheck = delegate { var pluginSourceList = new List<PluginSourceItem>(); try { var httpWebRequest = (HttpWebRequest) WebRequest.Create("https://github.com/Icehunter/ffxivapp/raw/master/PACKAGES.json"); httpWebRequest.UserAgent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.70 Safari/533.4"; httpWebRequest.Headers.Add("Accept-Language", "en;q=0.8"); httpWebRequest.ContentType = "application/text; charset=utf-8"; httpWebRequest.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore); using (var httpResponse = (HttpWebResponse) httpWebRequest.GetResponse()) { using (var response = httpResponse.GetResponseStream()) { var responseText = ""; if (response != null) { using (var streamReader = new StreamReader(response)) { responseText = streamReader.ReadToEnd(); } } if (httpResponse.StatusCode == HttpStatusCode.OK || !String.IsNullOrWhiteSpace(responseText)) { var jsonResult = JArray.Parse(responseText); pluginSourceList.AddRange(from item in jsonResult let name = item["Name"].ToString() let enabled = Boolean.Parse(item["Enabled"].ToString()) let sourceURI = item["SourceURI"].ToString() where enabled select new PluginSourceItem { Enabled = enabled, Key = Guid.NewGuid(), SourceURI = sourceURI }); } } } } catch (Exception ex) { } foreach (var pluginSourceItem in UpdateViewModel.Instance.AvailableSources) { if (pluginSourceList.Any(p => String.Equals(p.SourceURI, pluginSourceItem.SourceURI, Constants.InvariantComparer))) { continue; } pluginSourceList.Add(pluginSourceItem); } foreach (var item in pluginSourceList) { if (item.Enabled) { try { var httpWebRequest = (HttpWebRequest) WebRequest.Create(item.SourceURI); httpWebRequest.UserAgent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.70 Safari/533.4"; httpWebRequest.Headers.Add("Accept-Language", "en;q=0.8"); httpWebRequest.ContentType = "application/text; charset=utf-8"; httpWebRequest.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore); using (var httpResponse = (HttpWebResponse) httpWebRequest.GetResponse()) { using (var response = httpResponse.GetResponseStream()) { var responseText = ""; if (response != null) { using (var streamReader = new StreamReader(response)) { responseText = streamReader.ReadToEnd(); } } if (httpResponse.StatusCode == HttpStatusCode.OK || !String.IsNullOrWhiteSpace(responseText)) { var jsonResult = JObject.Parse(responseText); var pluginInfo = jsonResult["PluginInfo"]; var pluginFiles = pluginInfo["Files"].ToArray(); var pluginDownload = new PluginDownloadItem { Files = new List<PluginFile>(pluginFiles.Select(pluginFile => new PluginFile { Location = pluginFile["Location"].ToString(), Name = pluginFile["Name"].ToString(), Checksum = pluginFile["Checksum"] == null ? "" : pluginFile["Checksum"].ToString() })), Name = pluginInfo["Name"].ToString(), FriendlyName = pluginInfo["FriendlyName"] == null ? pluginInfo["Name"].ToString() : pluginInfo["FriendlyName"].ToString(), Description = pluginInfo["Description"] == null ? "" : pluginInfo["Description"].ToString(), SourceURI = pluginInfo["SourceURI"].ToString(), LatestVersion = pluginInfo["Version"].ToString() }; var found = App.Plugins.Loaded.Find(pluginDownload.Name); if (found != null) { var latest = pluginDownload.LatestVersion; var current = found.Instance.Version; pluginDownload.CurrentVersion = current; pluginDownload.Status = PluginStatus.Installed; var latestBuild = new BuildNumber(); var currentBuild = new BuildNumber(); if (BuildUtilities.NeedsUpdate(latest, current, ref latestBuild, ref currentBuild)) { pluginDownload.Status = PluginStatus.UpdateAvailable; AppViewModel.Instance.HasNewPluginUpdate = true; } else { if (!found.Loaded) { pluginDownload.Status = PluginStatus.OutOfDate; } } } DispatcherHelper.Invoke(() => UpdateViewModel.Instance.AvailablePlugins.Add(pluginDownload)); } } } } catch (Exception ex) { } DispatcherHelper.Invoke(delegate { if (UpdateView.View.AvailableDG.Items.Count == UpdateViewModel.Instance.AvailablePlugins.Count) { UpdateView.View.AvailableLoadingInformation.Visibility = Visibility.Collapsed; } UpdateView.View.AvailableDG.Items.Refresh(); UpdateViewModel.Instance.SetupGrouping(); }); } } return true; }; updateCheck.BeginInvoke(null, null); }