about summary refs log tree commit diff stats
path: root/src/command
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2017-02-05 22:37:48 +0000
committerJames Booth <boothj5@gmail.com>2017-02-05 22:37:48 +0000
commit5f1ba08f5500646fb92df8d4b9920eac987bc11a (patch)
treefb4a4eeba4b5d4dd28ae10c7f3d2a4953d59f44f /src/command
parent286fecf38d218d10366f025faf7cffcb425e19f4 (diff)
downloadprofani-tty-5f1ba08f5500646fb92df8d4b9920eac987bc11a.tar.gz
Add plugins sourcepath property
Diffstat (limited to 'src/command')
-rw-r--r--src/command/cmd_ac.c18
-rw-r--r--src/command/cmd_defs.c21
-rw-r--r--src/command/cmd_funcs.c65
-rw-r--r--src/command/cmd_funcs.h1
4 files changed, 92 insertions, 13 deletions
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 <path>",
+            "/plugins sourcepath set <path>",
+            "/plugins sourcepath clear",
+            "/plugins install [<path>]",
             "/plugins unload [<plugin>]",
             "/plugins load [<plugin>]",
             "/plugins reload [<plugin>]",
@@ -2065,12 +2068,16 @@ static struct cmd_t command_defs[] =
         CMD_DESC(
             "Manage plugins. Passing no arguments lists currently loaded plugins.")
         CMD_ARGS(
-            { "install <file>",      "Install file to plugins directory, and load or reload the plugin." },
-            { "load [<plugin>]",       "Load a plugin that already exists in the plugin directory, passing no argument loads all found plugins." },
-            { "unload [<plugin>]",   "Unload a loaded plugin, passing no argument will unload all plugins." },
-            { "reload [<plugin>]",   "Reload a plugin, passing no argument will reload all plugins." },
-            { "python_version",      "Show the Python interpreter version." })
+            { "sourcepath set <path>",  "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 [<path>]",       "Install a plugin, or all plugins found in a directory (recursive). Passing no argument will use the sourcepath if one is set." },
+            { "load [<plugin>]",        "Load a plugin that already exists in the plugin directory, passing no argument loads all found plugins." },
+            { "unload [<plugin>]",      "Unload a loaded plugin, passing no argument will unload all plugins." },
+            { "reload [<plugin>]",      "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);