From 5f1ba08f5500646fb92df8d4b9920eac987bc11a Mon Sep 17 00:00:00 2001 From: James Booth Date: Sun, 5 Feb 2017 22:37:48 +0000 Subject: Add plugins sourcepath property --- src/command/cmd_ac.c | 18 ++++++++++++++ src/command/cmd_defs.c | 21 ++++++++++------ src/command/cmd_funcs.c | 65 ++++++++++++++++++++++++++++++++++++++++++++----- src/command/cmd_funcs.h | 1 + 4 files changed, 92 insertions(+), 13 deletions(-) (limited to 'src/command') diff --git a/src/command/cmd_ac.c b/src/command/cmd_ac.c index 56baafc8..544719d4 100644 --- a/src/command/cmd_ac.c +++ b/src/command/cmd_ac.c @@ -184,6 +184,7 @@ static Autocomplete console_ac; static Autocomplete console_msg_ac; static Autocomplete autoping_ac; static Autocomplete plugins_ac; +static Autocomplete plugins_sourcepath_ac; static Autocomplete plugins_load_ac; static Autocomplete plugins_unload_ac; static Autocomplete plugins_reload_ac; @@ -714,6 +715,11 @@ cmd_ac_init(void) autocomplete_add(plugins_ac, "unload"); autocomplete_add(plugins_ac, "reload"); autocomplete_add(plugins_ac, "python_version"); + autocomplete_add(plugins_ac, "sourcepath"); + + plugins_sourcepath_ac = autocomplete_new(); + autocomplete_add(plugins_sourcepath_ac, "set"); + autocomplete_add(plugins_sourcepath_ac, "clear"); filepath_ac = autocomplete_new(); @@ -1011,6 +1017,7 @@ cmd_ac_reset(ProfWin *window) autocomplete_reset(console_msg_ac); autocomplete_reset(autoping_ac); autocomplete_reset(plugins_ac); + autocomplete_reset(plugins_sourcepath_ac); autocomplete_reset(blocked_ac); autocomplete_reset(tray_ac); autocomplete_reset(presence_ac); @@ -2025,10 +2032,21 @@ _plugins_autocomplete(ProfWin *window, const char *const input) { char *result = NULL; + if (strncmp(input, "/plugins sourcepath set ", 24) == 0) { + return cmd_ac_complete_filepath(input, "/plugins sourcepath set"); + } + if (strncmp(input, "/plugins install ", 17) == 0) { return cmd_ac_complete_filepath(input, "/plugins install"); } + if (strncmp(input, "/plugins sourcepath ", 20) == 0) { + result = autocomplete_param_with_ac(input, "/plugins sourcepath", plugins_sourcepath_ac, TRUE); + if (result) { + return result; + } + } + if (strncmp(input, "/plugins load ", 14) == 0) { if (plugins_load_ac == NULL) { plugins_load_ac = autocomplete_new(); diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c index 2ca3b967..8f8ced09 100644 --- a/src/command/cmd_defs.c +++ b/src/command/cmd_defs.c @@ -2046,8 +2046,9 @@ static struct cmd_t command_defs[] = }, { "/plugins", - parse_args, 0, 2, NULL, + parse_args, 0, 3, NULL, CMD_SUBFUNCS( + { "sourcepath", cmd_plugins_sourcepath }, { "install", cmd_plugins_install }, { "load", cmd_plugins_load }, { "unload", cmd_plugins_unload }, @@ -2057,7 +2058,9 @@ static struct cmd_t command_defs[] = CMD_NOTAGS CMD_SYN( "/plugins", - "/plugins install ", + "/plugins sourcepath set ", + "/plugins sourcepath clear", + "/plugins install []", "/plugins unload []", "/plugins load []", "/plugins reload []", @@ -2065,12 +2068,16 @@ static struct cmd_t command_defs[] = CMD_DESC( "Manage plugins. Passing no arguments lists currently loaded plugins.") CMD_ARGS( - { "install ", "Install file to plugins directory, and load or reload the plugin." }, - { "load []", "Load a plugin that already exists in the plugin directory, passing no argument loads all found plugins." }, - { "unload []", "Unload a loaded plugin, passing no argument will unload all plugins." }, - { "reload []", "Reload a plugin, passing no argument will reload all plugins." }, - { "python_version", "Show the Python interpreter version." }) + { "sourcepath set ", "Set the default path to install plugins from, will be used if no arg is passed to /plugins install." }, + { "sourcepath clear", "Clear the default plugins source path." }, + { "install []", "Install a plugin, or all plugins found in a directory (recursive). Passing no argument will use the sourcepath if one is set." }, + { "load []", "Load a plugin that already exists in the plugin directory, passing no argument loads all found plugins." }, + { "unload []", "Unload a loaded plugin, passing no argument will unload all plugins." }, + { "reload []", "Reload a plugin, passing no argument will reload all plugins." }, + { "python_version", "Show the Python interpreter version." }) CMD_EXAMPLES( + "/plugins sourcepath set /home/meee/projects/profanity-plugins", + "/plugins install", "/plugins install /home/steveharris/Downloads/metal.py", "/plugins load browser.py", "/plugins unload say.py", diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index d26ff43f..3df17079 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -6212,16 +6212,69 @@ cmd_xa(ProfWin *window, const char *const command, gchar **args) } gboolean -cmd_plugins_install(ProfWin *window, const char *const command, gchar **args) +cmd_plugins_sourcepath(ProfWin *window, const char *const command, gchar **args) { - char *path = args[1]; - if (path == NULL) { - cons_bad_cmd_usage(command); + if (args[1] == NULL) { + char *sourcepath = prefs_get_string(PREF_PLUGINS_SOURCEPATH); + if (sourcepath) { + cons_show("Current plugins sourcepath: %s", sourcepath); + prefs_free_string(sourcepath); + } else { + cons_show("Plugins sourcepath not currently set."); + } return TRUE; } - // expand ~ to $HOME - if (path[0] == '~' && path[1] == '/') { + if (g_strcmp0(args[1], "clear") == 0) { + prefs_set_string(PREF_PLUGINS_SOURCEPATH, NULL); + cons_show("Plugins sourcepath cleared."); + return TRUE; + } + + if (g_strcmp0(args[1], "set") == 0) { + char *path = args[2]; + if (path == NULL) { + cons_bad_cmd_usage(command); + return TRUE; + } + + // expand ~ to $HOME + if (path[0] == '~' && path[1] == '/') { + if (asprintf(&path, "%s/%s", getenv("HOME"), path+2) == -1) { + return TRUE; + } + } else { + path = strdup(path); + } + + if (!is_dir(path)) { + cons_show("Plugins sourcepath must be a directory."); + return TRUE; + } + + cons_show("Setting plugins sourcepath: %s", path); + prefs_set_string(PREF_PLUGINS_SOURCEPATH, path); + return TRUE; + } + + cons_bad_cmd_usage(command); + return TRUE; +} + +gboolean +cmd_plugins_install(ProfWin *window, const char *const command, gchar **args) +{ + char *path = args[1]; + if (path == NULL) { + char* sourcepath = prefs_get_string(PREF_PLUGINS_SOURCEPATH); + if (sourcepath) { + path = strdup(sourcepath); + prefs_free_string(sourcepath); + } else { + cons_show("Either a path must be provided or the sourcepath property must be set, see /help plugins"); + return TRUE; + } + } else if (path[0] == '~' && path[1] == '/') { if (asprintf(&path, "%s/%s", getenv("HOME"), path+2) == -1) { return TRUE; } diff --git a/src/command/cmd_funcs.h b/src/command/cmd_funcs.h index c7a89e43..2f0e0bac 100644 --- a/src/command/cmd_funcs.h +++ b/src/command/cmd_funcs.h @@ -160,6 +160,7 @@ gboolean cmd_charset(ProfWin *window, const char *const command, gchar **args); gboolean cmd_console(ProfWin *window, const char *const command, gchar **args); gboolean cmd_plugins(ProfWin *window, const char *const command, gchar **args); +gboolean cmd_plugins_sourcepath(ProfWin *window, const char *const command, gchar **args); gboolean cmd_plugins_install(ProfWin *window, const char *const command, gchar **args); gboolean cmd_plugins_load(ProfWin *window, const char *const command, gchar **args); gboolean cmd_plugins_unload(ProfWin *window, const char *const command, gchar **args); -- cgit 1.4.1-2-gfad0