PowerToys/Wox.Core/Updater.cs

128 lines
4.0 KiB
C#
Raw Normal View History

using System;
using System.Diagnostics;
using System.Net;
2016-05-11 02:24:15 +08:00
using System.Net.Http;
using System.Net.Sockets;
using System.Threading.Tasks;
2017-03-06 09:30:47 +08:00
using System.Windows;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Squirrel;
2017-03-06 09:30:47 +08:00
using Wox.Core.Resource;
using Wox.Infrastructure;
using Wox.Infrastructure.Http;
using Wox.Infrastructure.Logger;
namespace Wox.Core
{
public static class Updater
{
public static async Task UpdateApp()
{
2016-05-10 06:51:10 +08:00
2017-03-06 08:05:03 +08:00
var c = new WebClient { Proxy = Http.WebProxy() };
var d = new FileDownloader(c);
2016-05-10 06:51:10 +08:00
try
{
2017-03-06 09:30:47 +08:00
const string url = Constant.Github;
// UpdateApp() will return value only if the app is squirrel installed
2017-03-06 08:05:03 +08:00
using (var m = await UpdateManager.GitHubUpdateManager(url, urlDownloader: d))
{
2017-03-06 09:30:47 +08:00
var e = await m.CheckForUpdate().NonNull();
var fe = e.FutureReleaseEntry;
var ce = e.CurrentlyInstalledVersion;
if (fe.Version > ce.Version)
{
var t = NewVersinoTips(fe.Version.ToString());
MessageBox.Show(t);
await m.DownloadReleases(e.ReleasesToApply);
await m.ApplyReleases(e);
await m.CreateUninstallerRegistryEntry();
Log.Info($"|Updater.UpdateApp|Future Release <{fe.Formatted()}>");
}
}
}
2017-03-06 08:05:03 +08:00
catch (Exception e) when (e is HttpRequestException || e is WebException || e is SocketException)
{
2017-03-06 08:05:03 +08:00
Log.Exception("|Updater.UpdateApp|Network error", e);
}
2017-03-06 08:05:03 +08:00
catch (Exception e)
{
const string info = "Update.exe not found, not a Squirrel-installed app?";
2017-03-06 08:05:03 +08:00
if (e.Message == info)
{
2017-03-06 08:05:03 +08:00
Log.Error($"|Updater.UpdateApp|{info}");
}
else
{
throw;
}
}
}
public static async Task<string> NewVersion()
{
const string githubAPI = @"https://api.github.com/repos/wox-launcher/wox/releases/latest";
string response;
try
{
2016-06-19 23:18:43 +08:00
response = await Http.Get(githubAPI);
}
catch (WebException e)
{
2017-01-24 08:24:20 +08:00
Log.Exception("|Updater.NewVersion|Can't connect to github api to check new version", e);
return string.Empty;
}
if (!string.IsNullOrEmpty(response))
{
JContainer json;
try
{
json = (JContainer)JsonConvert.DeserializeObject(response);
}
catch (JsonSerializationException e)
{
2017-01-24 08:24:20 +08:00
Log.Exception("|Updater.NewVersion|can't parse response", e);
return string.Empty;
}
var version = json?["tag_name"]?.ToString();
if (!string.IsNullOrEmpty(version))
{
return version;
}
else
{
2017-01-24 08:24:20 +08:00
Log.Warn("|Updater.NewVersion|Can't find tag_name from Github API response");
return string.Empty;
}
}
else
{
2017-01-24 08:24:20 +08:00
Log.Warn("|Updater.NewVersion|Can't get response from Github API");
return string.Empty;
}
}
public static int NumericVersion(string version)
{
var newVersion = version.Replace("v", ".").Replace(".", "").Replace("*", "");
return int.Parse(newVersion);
}
2017-03-06 09:30:47 +08:00
public static string NewVersinoTips(string version)
{
var translater = InternationalizationManager.Instance;
var tips = string.Format(translater.GetTranslation("newVersionTips"), version);
return tips;
}
}
}