diff --git a/Deploy/Nuget/pack.ps1 b/Deploy/Nuget/pack.ps1 index dcb264b78f..f1c75556a6 100644 --- a/Deploy/Nuget/pack.ps1 +++ b/Deploy/Nuget/pack.ps1 @@ -8,6 +8,6 @@ Write-Host "Setting .nuspec version tag to $versionStr" $content = (Get-Content $root\Deploy\NuGet\wox.plugin.nuspec) $content = $content -replace '\$version\$',$versionStr -$content | Out-File $root\wox.plugin.nuspec +$content | Out-File $root\deploy\nuget\wox.plugin.nuspec & $root\.nuget\NuGet.exe pack $root\deploy\nuget\wox.plugin.nuspec diff --git a/Deploy/Nuget/wox.plugin.nuspec b/Deploy/Nuget/wox.plugin.nuspec index 49cc8ef0e1..c55e4ded35 100644 Binary files a/Deploy/Nuget/wox.plugin.nuspec and b/Deploy/Nuget/wox.plugin.nuspec differ diff --git a/Plugins/Wox.Plugin.PluginManagement/Main.cs b/Plugins/Wox.Plugin.PluginManagement/Main.cs index 432d6a7362..960a2c328c 100644 --- a/Plugins/Wox.Plugin.PluginManagement/Main.cs +++ b/Plugins/Wox.Plugin.PluginManagement/Main.cs @@ -10,30 +10,21 @@ using Newtonsoft.Json; namespace Wox.Plugin.PluginManagement { - public class WoxPlugin - { - public int apiVersion { get; set; } - public List result { get; set; } - } - public class WoxPluginResult { - public string actionkeyword; - public string download; - public string author; + public string plugin_file; public string description; - public string id; - public int star; + public int liked_count; public string name; public string version; - public string website; } public class Main : IPlugin { + private static string APIBASE = "https://api.getwox.com"; private static string PluginPath = AppDomain.CurrentDomain.BaseDirectory + "Plugins"; private static string PluginConfigName = "plugin.json"; - private static string pluginSearchUrl = "http://www.getwox.com/api/plugin/search/"; + private static string pluginSearchUrl = APIBASE +"/plugin/search/"; private PluginInitContext context; public List Query(Query query) @@ -142,8 +133,18 @@ namespace Wox.Plugin.PluginManagement { StreamReader reader = new StreamReader(s, Encoding.UTF8); string json = reader.ReadToEnd(); - WoxPlugin o = JsonConvert.DeserializeObject(json); - foreach (WoxPluginResult r in o.result) + List searchedPlugins = null; + try + { + searchedPlugins = JsonConvert.DeserializeObject>(json); + } + catch + { + context.API.ShowMsg("Coundn't parse api search results", "Please update your Wox!",string.Empty); + return results; + } + + foreach (WoxPluginResult r in searchedPlugins) { WoxPluginResult r1 = r; results.Add(new Result() @@ -169,7 +170,8 @@ namespace Wox.Plugin.PluginManagement { try { - Client.DownloadFile(r1.download, filePath); + string pluginUrl = APIBASE + "/media/" + r1.plugin_file; + Client.DownloadFile(pluginUrl, filePath); context.API.InstallPlugin(filePath); context.API.ReloadPlugins(); } diff --git a/Wox.Infrastructure/HttpRequest.cs b/Wox.Infrastructure/HttpRequest.cs index e082d07525..c5592e87df 100644 --- a/Wox.Infrastructure/HttpRequest.cs +++ b/Wox.Infrastructure/HttpRequest.cs @@ -9,6 +9,8 @@ using System.Security.Cryptography.X509Certificates; using System.Text; //From:http://blog.csdn.net/zhoufoxcn/article/details/6404236 +using Wox.Plugin; + namespace Wox.Infrastructure { public class HttpRequest @@ -16,6 +18,30 @@ namespace Wox.Infrastructure private static readonly string DefaultUserAgent = "Wox/" + Assembly.GetEntryAssembly().GetName().Version.ToString() + " (+https://github.com/qianlifeng/Wox)"; + public static HttpWebResponse CreateGetHttpResponse(string url, IHttpProxy proxy) + { + if (string.IsNullOrEmpty(url)) + { + throw new ArgumentNullException("url"); + } + HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; + if (proxy != null && proxy.Enabled && !string.IsNullOrEmpty(proxy.Server)) + { + if (string.IsNullOrEmpty(proxy.UserName) || string.IsNullOrEmpty(proxy.Password)) + { + request.Proxy = new WebProxy(proxy.Server, proxy.Port); + } + else + { + request.Proxy = new WebProxy(proxy.Server, proxy.Port); + request.Proxy.Credentials = new NetworkCredential(proxy.UserName, proxy.Password); + } + } + request.Method = "GET"; + request.UserAgent = DefaultUserAgent; + return request.GetResponse() as HttpWebResponse; + } + public static HttpWebResponse CreateGetHttpResponse(string url, int? timeout, string userAgent, CookieCollection cookies) { if (string.IsNullOrEmpty(url)) diff --git a/Wox.Infrastructure/Storage/UserSettings/UserSettingStorage.cs b/Wox.Infrastructure/Storage/UserSettings/UserSettingStorage.cs index ec3b96813f..dbef1b084f 100644 --- a/Wox.Infrastructure/Storage/UserSettings/UserSettingStorage.cs +++ b/Wox.Infrastructure/Storage/UserSettings/UserSettingStorage.cs @@ -8,6 +8,9 @@ namespace Wox.Infrastructure.Storage.UserSettings { public class UserSettingStorage : BaseStorage { + [JsonProperty] + public bool DontPromptUpdateMsg { get; set; } + [JsonProperty] public string Hotkey { get; set; } @@ -145,6 +148,7 @@ namespace Wox.Infrastructure.Storage.UserSettings protected override UserSettingStorage LoadDefaultConfig() { + DontPromptUpdateMsg = false; Theme = "Dark"; ReplaceWinR = true; WebSearches = LoadDefaultWebSearches(); diff --git a/Wox/MainWindow.xaml.cs b/Wox/MainWindow.xaml.cs index 11339f431c..38c71fc5da 100644 --- a/Wox/MainWindow.xaml.cs +++ b/Wox/MainWindow.xaml.cs @@ -21,6 +21,7 @@ using Wox.Infrastructure.Storage; using Wox.Infrastructure.Storage.UserSettings; using Wox.Plugin; using Wox.PluginLoader; +using Wox.Update; using Application = System.Windows.Application; using Brushes = System.Windows.Media.Brushes; using Color = System.Windows.Media.Color; @@ -188,6 +189,8 @@ namespace Wox //since MainWIndow implement IPublicAPI, so we need to finish ctor MainWindow object before //PublicAPI invoke in plugin init methods. E.g FolderPlugin ThreadPool.QueueUserWorkItem(o => Plugins.Init()); + + ThreadPool.QueueUserWorkItem(o => checkUpdate()); } void pnlResult_RightMouseClickEvent(Result result) @@ -195,6 +198,15 @@ namespace Wox ShowContextMenu(result); } + void checkUpdate() + { + Release release = new UpdateChecker().CheckUpgrade(); + if (release != null && !UserSettingStorage.Instance.DontPromptUpdateMsg) + { + ShowMsg(string.Format("New version {0} available!",release.version),string.Empty,string.Empty); + } + } + void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) { UserSettingStorage.Instance.WindowLeft = Left; diff --git a/Wox/SettingWindow.xaml b/Wox/SettingWindow.xaml index b547e57896..21e8fc252c 100644 --- a/Wox/SettingWindow.xaml +++ b/Wox/SettingWindow.xaml @@ -28,6 +28,9 @@ Hide Wox when loses focus + + Don't show upgrade msg if new version available + diff --git a/Wox/SettingWindow.xaml.cs b/Wox/SettingWindow.xaml.cs index 5e76e7dc24..adefc2c006 100644 --- a/Wox/SettingWindow.xaml.cs +++ b/Wox/SettingWindow.xaml.cs @@ -38,8 +38,7 @@ namespace Wox private void Setting_Loaded(object sender, RoutedEventArgs ev) { - ctlHotkey.OnHotkeyChanged += ctlHotkey_OnHotkeyChanged; - ctlHotkey.SetHotkey(UserSettingStorage.Instance.Hotkey, false); + #region General cbHideWhenDeactive.Checked += (o, e) => { @@ -53,11 +52,25 @@ namespace Wox UserSettingStorage.Instance.Save(); }; - lvCustomHotkey.ItemsSource = UserSettingStorage.Instance.CustomPluginHotkeys; + cbDontPromptUpdateMsg.Checked += (o, e) => + { + UserSettingStorage.Instance.DontPromptUpdateMsg = true; + UserSettingStorage.Instance.Save(); + }; + + cbDontPromptUpdateMsg.Unchecked += (o, e) => + { + UserSettingStorage.Instance.DontPromptUpdateMsg = false; + UserSettingStorage.Instance.Save(); + }; + cbStartWithWindows.IsChecked = File.Exists(woxLinkPath); cbHideWhenDeactive.IsChecked = UserSettingStorage.Instance.HideWhenDeactive; + cbDontPromptUpdateMsg.IsChecked = UserSettingStorage.Instance.DontPromptUpdateMsg; - #region Load Theme + #endregion + + #region Theme if (!string.IsNullOrEmpty(UserSettingStorage.Instance.QueryBoxFont) && Fonts.SystemFontFamilies.Count(o => o.FamilyNames.Values.Contains(UserSettingStorage.Instance.QueryBoxFont)) > 0) @@ -155,9 +168,17 @@ namespace Wox var wallpaperColor = WallpaperPathRetrieval.GetWallpaperColor(); PreviewPanel.Background = new SolidColorBrush(wallpaperColor); } + + //PreviewPanel + App.Window.SetTheme(UserSettingStorage.Instance.Theme); + #endregion - #region Load Plugin + #region Plugin + + ctlHotkey.OnHotkeyChanged += ctlHotkey_OnHotkeyChanged; + ctlHotkey.SetHotkey(UserSettingStorage.Instance.Hotkey, false); + lvCustomHotkey.ItemsSource = UserSettingStorage.Instance.CustomPluginHotkeys; var plugins = new CompositeCollection { @@ -200,9 +221,7 @@ namespace Wox #endregion - //PreviewPanel settingsLoaded = true; - App.Window.SetTheme(UserSettingStorage.Instance.Theme); } private void EnableProxy() diff --git a/Wox/Update/Release.cs b/Wox/Update/Release.cs new file mode 100644 index 0000000000..3664f5f2fa --- /dev/null +++ b/Wox/Update/Release.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Wox.Update +{ + public class Release + { + public string version { get; set; } + public string download_link { get; set; } + public string download_link1 { get; set; } + public string download_link2 { get; set; } + public string description { get; set; } + } +} diff --git a/Wox/Update/UpdateChecker.cs b/Wox/Update/UpdateChecker.cs new file mode 100644 index 0000000000..a66c6e50e1 --- /dev/null +++ b/Wox/Update/UpdateChecker.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using Newtonsoft.Json; +using Wox.Helper; +using Wox.Infrastructure; + +namespace Wox.Update +{ + public class UpdateChecker + { + private string updateURL = "https://api.getwox.com/release/latest/"; + + /// + /// If new release is available, then return the new release + /// otherwise, return null + /// + /// + public Release CheckUpgrade() + { + Release release = null; + HttpWebResponse response = HttpRequest.CreateGetHttpResponse(updateURL, HttpProxy.Instance); + Stream s = response.GetResponseStream(); + if (s != null) + { + StreamReader reader = new StreamReader(s, Encoding.UTF8); + string json = reader.ReadToEnd(); + try + { + release = JsonConvert.DeserializeObject(json); + } + catch + { + return null; + } + } + + if (!IsNewerThanCurrent(release)) + { + return null; + } + + return release; + } + + private bool IsNewerThanCurrent(Release release) + { + if (release == null) return false; + + string currentVersion = ConfigurationManager.AppSettings["version"]; + return CompareVersion(release.version, currentVersion) > 0; + } + + /// + /// if version1 > version2 return 1 + /// else -1 + /// + /// + /// + /// + private int CompareVersion(string version1, string version2) + { + if (version1 == version2) return 0; + if (string.IsNullOrEmpty(version1) || string.IsNullOrEmpty(version2)) return 0; + + //semantic version, e.g. 1.1.0 + List version1List = version1.Split('.').Select(int.Parse).ToList(); + List version2List = version2.Split('.').Select(int.Parse).ToList(); + + if (version1List[0] > version2List[0]) + { + return 1; + } + else if (version1List[0] == version2List[0]) + { + if (version1List[1] > version2List[1]) + { + return 1; + } + else if (version1List[1] == version2List[1]) + { + if (version1List[2] > version2List[2]) + { + return 1; + } + } + } + + return -1; + } + } +} diff --git a/Wox/Wox.csproj b/Wox/Wox.csproj index 0686453fea..c4f5faca5e 100644 --- a/Wox/Wox.csproj +++ b/Wox/Wox.csproj @@ -82,6 +82,7 @@ + @@ -103,6 +104,8 @@ + + MSBuild:Compile Designer diff --git a/appveyor.yml b/appveyor.yml index d6ea33bfec..a9b1ca6113 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -20,4 +20,13 @@ deploy: provider: NuGet api_key: secure: yybUOFgBuGVpbmOVZxsurC8OpkClzt9dR+/54WpMWcq6b6oyMatciaelRPnXsjRn - artifact: /.*\.nupkg/ + artifact: nugetpackage + on: + branch: master + +artifacts: + - path: Output\Release + name: release-binary + + - path: '*.nupkg' + name: nugetpackage