PowerToys/Plugins/Wox.Plugin.PluginManagement/Main.cs

277 lines
10 KiB
C#
Raw Normal View History

2014-03-11 23:54:37 +08:00
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
2014-03-13 22:31:44 +08:00
using System.Net;
2015-02-07 21:27:48 +08:00
using System.Reflection;
2014-03-13 22:31:44 +08:00
using System.Text;
using System.Threading;
2014-03-11 23:54:37 +08:00
using System.Windows.Forms;
using Newtonsoft.Json;
2014-07-18 20:00:55 +08:00
namespace Wox.Plugin.PluginManagement
{
2015-02-07 21:27:48 +08:00
public class Main : IPlugin,IPluginI18n
2014-07-18 20:00:55 +08:00
{
2014-12-14 22:24:05 +08:00
private static string APIBASE = "https://api.getwox.com";
2014-07-18 20:00:55 +08:00
private static string PluginConfigName = "plugin.json";
private static string pluginSearchUrl = APIBASE + "/plugin/search/";
2014-07-18 20:00:55 +08:00
private PluginInitContext context;
public List<Result> Query(Query query)
{
List<Result> results = new List<Result>();
if (string.IsNullOrEmpty(query.Search))
2014-07-18 20:00:55 +08:00
{
results.Add(new Result("install <pluginName>", "Images\\plugin.png", "search and install wox plugins")
2014-07-18 20:00:55 +08:00
{
Action = e => ChangeToInstallCommand()
2014-07-18 20:00:55 +08:00
});
results.Add(new Result("uninstall <pluginName>", "Images\\plugin.png", "uninstall plugin")
2014-07-18 20:00:55 +08:00
{
Action = e => ChangeToUninstallCommand()
2014-07-18 20:00:55 +08:00
});
results.Add(new Result("list", "Images\\plugin.png", "list plugins installed")
2014-07-18 20:00:55 +08:00
{
Action = e => ChangeToListCommand()
2014-07-18 20:00:55 +08:00
});
return results;
}
if (!string.IsNullOrEmpty(query.FirstSearch))
2014-07-18 20:00:55 +08:00
{
bool hit = false;
switch (query.FirstSearch.ToLower())
2014-07-18 20:00:55 +08:00
{
case "list":
hit = true;
results = ListInstalledPlugins();
break;
case "uninstall":
hit = true;
results = UnInstallPlugins(query);
2014-07-18 20:00:55 +08:00
break;
case "install":
hit = true;
if (!string.IsNullOrEmpty(query.SecondSearch))
2014-07-18 20:00:55 +08:00
{
results = InstallPlugin(query.SecondSearch);
2014-07-18 20:00:55 +08:00
}
break;
}
if (!hit)
{
if ("install".Contains(query.FirstSearch.ToLower()))
2014-07-18 20:00:55 +08:00
{
results.Add(new Result("install <pluginName>", "Images\\plugin.png", "search and install wox plugins")
2014-07-18 20:00:55 +08:00
{
Action = e => ChangeToInstallCommand()
2014-07-18 20:00:55 +08:00
});
}
if ("uninstall".Contains(query.FirstSearch.ToLower()))
2014-07-18 20:00:55 +08:00
{
results.Add(new Result("uninstall <pluginName>", "Images\\plugin.png", "uninstall plugin")
2014-07-18 20:00:55 +08:00
{
Action = e => ChangeToUninstallCommand()
2014-07-18 20:00:55 +08:00
});
}
if ("list".Contains(query.FirstSearch.ToLower()))
2014-07-18 20:00:55 +08:00
{
results.Add(new Result("list", "Images\\plugin.png", "list plugins installed")
2014-07-18 20:00:55 +08:00
{
Action = e => ChangeToListCommand()
2014-07-18 20:00:55 +08:00
});
}
}
}
return results;
}
private bool ChangeToListCommand()
{
if (context.CurrentPluginMetadata.ActionKeyword == "*")
{
context.API.ChangeQuery("list ");
}
else
{
context.API.ChangeQuery(string.Format("{0} list ", context.CurrentPluginMetadata.ActionKeyword));
}
return false;
}
private bool ChangeToUninstallCommand()
{
if (context.CurrentPluginMetadata.ActionKeyword == "*")
{
context.API.ChangeQuery("uninstall ");
}
else
{
context.API.ChangeQuery(string.Format("{0} uninstall ", context.CurrentPluginMetadata.ActionKeyword));
}
return false;
}
private bool ChangeToInstallCommand()
{
if (context.CurrentPluginMetadata.ActionKeyword == "*")
{
context.API.ChangeQuery("install ");
}
else
{
context.API.ChangeQuery(string.Format("{0} install ", context.CurrentPluginMetadata.ActionKeyword));
}
return false;
}
private List<Result> InstallPlugin(string queryPluginName)
2014-07-18 20:00:55 +08:00
{
List<Result> results = new List<Result>();
HttpWebResponse response = HttpRequest.CreateGetHttpResponse(pluginSearchUrl + queryPluginName, context.Proxy);
2014-07-18 20:00:55 +08:00
Stream s = response.GetResponseStream();
if (s != null)
{
StreamReader reader = new StreamReader(s, Encoding.UTF8);
string json = reader.ReadToEnd();
2014-12-14 22:24:05 +08:00
List<WoxPluginResult> searchedPlugins = null;
try
{
searchedPlugins = JsonConvert.DeserializeObject<List<WoxPluginResult>>(json);
}
catch
{
context.API.ShowMsg("Coundn't parse api search results", "Please update your Wox!", string.Empty);
2014-12-14 22:24:05 +08:00
return results;
}
foreach (WoxPluginResult r in searchedPlugins)
2014-07-18 20:00:55 +08:00
{
WoxPluginResult r1 = r;
results.Add(new Result()
{
Title = r.name,
SubTitle = r.description,
IcoPath = "Images\\plugin.png",
Action = e =>
{
DialogResult result = MessageBox.Show("Are your sure to install " + r.name + " plugin",
"Install plugin", MessageBoxButtons.YesNo);
if (result == DialogResult.Yes)
{
string folder = Path.Combine(Path.GetTempPath(), "WoxPluginDownload");
if (!Directory.Exists(folder)) Directory.CreateDirectory(folder);
string filePath = Path.Combine(folder, Guid.NewGuid().ToString() + ".wox");
context.API.StartLoadingBar();
ThreadPool.QueueUserWorkItem(delegate
{
using (WebClient Client = new WebClient())
{
try
{
2014-12-14 22:24:05 +08:00
string pluginUrl = APIBASE + "/media/" + r1.plugin_file;
Client.DownloadFile(pluginUrl, filePath);
2014-07-18 20:00:55 +08:00
context.API.InstallPlugin(filePath);
context.API.ReloadPlugins();
}
catch (Exception exception)
{
MessageBox.Show("download plugin " + r.name + "failed. " + exception.Message);
}
finally
{
2014-07-21 19:48:17 +08:00
context.API.StopLoadingBar();
2014-07-18 20:00:55 +08:00
}
}
});
}
return false;
}
});
}
}
return results;
}
private List<Result> UnInstallPlugins(Query query)
2014-07-18 20:00:55 +08:00
{
List<Result> results = new List<Result>();
List<PluginMetadata> allInstalledPlugins = context.API.GetAllPlugins().Select(o => o.Metadata).ToList();
if (!string.IsNullOrEmpty(query.SecondSearch))
2014-07-18 20:00:55 +08:00
{
allInstalledPlugins =
allInstalledPlugins.Where(o => o.Name.ToLower().Contains(query.SecondSearch.ToLower())).ToList();
2014-07-18 20:00:55 +08:00
}
foreach (PluginMetadata plugin in allInstalledPlugins)
{
var plugin1 = plugin;
2014-07-18 20:00:55 +08:00
results.Add(new Result()
{
Title = plugin.Name,
SubTitle = plugin.Description,
IcoPath = plugin.FullIcoPath,
2014-07-18 20:00:55 +08:00
Action = e =>
{
UnInstallPlugin(plugin1);
2014-07-18 20:00:55 +08:00
return false;
}
});
}
return results;
}
private void UnInstallPlugin(PluginMetadata plugin)
2014-07-18 20:00:55 +08:00
{
string content = string.Format("Do you want to uninstall following plugin?\r\n\r\nName: {0}\r\nVersion: {1}\r\nAuthor: {2}", plugin.Name, plugin.Version, plugin.Author);
if (MessageBox.Show(content, "Wox", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
File.Create(Path.Combine(plugin.PluginDirectory, "NeedDelete.txt")).Close();
MessageBox.Show("This plugin has been removed, restart Wox to take effect");
}
}
private List<Result> ListInstalledPlugins()
{
List<Result> results = new List<Result>();
foreach (PluginMetadata plugin in context.API.GetAllPlugins().Select(o => o.Metadata))
2014-07-18 20:00:55 +08:00
{
results.Add(new Result()
{
Title = plugin.Name + " - " + plugin.ActionKeyword,
SubTitle = plugin.Description,
IcoPath = plugin.FullIcoPath
2014-07-18 20:00:55 +08:00
});
}
return results;
}
public void Init(PluginInitContext context)
{
this.context = context;
}
2015-02-07 21:27:48 +08:00
public string GetLanguagesFolder()
{
return Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Languages");
}
public string GetTranslatedPluginTitle()
{
return context.API.GetTranslation("wox_plugin_plugin_management_plugin_name");
}
public string GetTranslatedPluginDescription()
{
return context.API.GetTranslation("wox_plugin_plugin_management_plugin_description");
}
2014-07-18 20:00:55 +08:00
}
2014-03-11 23:54:37 +08:00
}