mirror of
https://github.com/profanity-im/profanity.git
synced 2024-11-03 19:37:16 -05:00
Replace /urlopen with /url and adapt /executable
/urlopen is replaced by /url with the following sub commands: /url open <url> /url save <url> [<path>] Signed-off-by: Pierre Mazière <pierre.maziere@gmx.com>
This commit is contained in:
parent
7e652f4ca0
commit
c56d530b67
@ -2464,40 +2464,49 @@ static struct cmd_t command_defs[] =
|
|||||||
"/software xmpp.vanaheimr.edda")
|
"/software xmpp.vanaheimr.edda")
|
||||||
},
|
},
|
||||||
|
|
||||||
{ "/urlopen",
|
|
||||||
parse_args, 1, -1, NULL,
|
|
||||||
CMD_NOSUBFUNCS
|
|
||||||
CMD_MAINFUNC(cmd_urlopen)
|
|
||||||
CMD_TAGS(
|
|
||||||
CMD_TAG_CHAT,
|
|
||||||
CMD_TAG_GROUPCHAT)
|
|
||||||
CMD_SYN(
|
|
||||||
"/urlopen <url>")
|
|
||||||
CMD_DESC(
|
|
||||||
"Open the URL")
|
|
||||||
CMD_ARGS(
|
|
||||||
{ "<url>", "URL to open."})
|
|
||||||
CMD_NOEXAMPLES
|
|
||||||
},
|
|
||||||
|
|
||||||
{ "/executable",
|
{ "/executable",
|
||||||
parse_args, 2, 2, &cons_executable_setting,
|
parse_args, 2, 4, &cons_executable_setting,
|
||||||
CMD_NOSUBFUNCS
|
CMD_NOSUBFUNCS
|
||||||
CMD_MAINFUNC(cmd_executable)
|
CMD_MAINFUNC(cmd_executable)
|
||||||
CMD_TAGS(
|
CMD_TAGS(
|
||||||
CMD_TAG_DISCOVERY)
|
CMD_TAG_DISCOVERY)
|
||||||
CMD_SYN(
|
CMD_SYN(
|
||||||
"/executable avatar <cmd>",
|
"/executable avatar <cmd>",
|
||||||
"/executable urlopen <cmd>")
|
"/executable urlopen <fileType> <require_save> <cmd>",
|
||||||
|
"/executable urlsave <protocol> <cmd>")
|
||||||
CMD_DESC(
|
CMD_DESC(
|
||||||
"Configure executable that should be called upon a certain command."
|
"Configure executable that should be called upon a certain command."
|
||||||
"Default is xdg-open.")
|
"Default is xdg-open.")
|
||||||
CMD_ARGS(
|
CMD_ARGS(
|
||||||
{ "avatar", "Set executable that is run in /avatar open. Use your favourite image viewer." },
|
{ "avatar", "Set executable that is run in /avatar open. Use your favourite image viewer." },
|
||||||
{ "urlopen", "Set executable that is run in /urlopen. Use your favourite browser." })
|
{ "urlopen", "Set executable that is run in /url open for a given file type. It may be your favorite browser or a specific viewer." },
|
||||||
|
{ "urlsave", "Set executable that is run in /url save for a given protocol. Use your favourite downloader."})
|
||||||
CMD_EXAMPLES(
|
CMD_EXAMPLES(
|
||||||
"/executable avatar xdg-open",
|
"/executable avatar xdg-open",
|
||||||
"/executable urlopen firefox")
|
"/executable urlopen html firefox %u",
|
||||||
|
"/executable urlsave aesgcm omut -d %u %p")
|
||||||
|
},
|
||||||
|
|
||||||
|
{ "/url",
|
||||||
|
parse_args, 2, 3, NULL,
|
||||||
|
CMD_SUBFUNCS(
|
||||||
|
{ "open", cmd_url_open},
|
||||||
|
{ "save", cmd_url_save })
|
||||||
|
CMD_NOMAINFUNC
|
||||||
|
CMD_TAGS(
|
||||||
|
CMD_TAG_CHAT,
|
||||||
|
CMD_TAG_GROUPCHAT)
|
||||||
|
CMD_SYN(
|
||||||
|
"/url open <url>",
|
||||||
|
"/url save <url> [<path>]")
|
||||||
|
CMD_DESC(
|
||||||
|
"Deal with URLs")
|
||||||
|
CMD_ARGS(
|
||||||
|
{ "open", "Open URL with predefined executable." },
|
||||||
|
{ "save", "Save URL to optional path, default path is current directory"})
|
||||||
|
CMD_EXAMPLES(
|
||||||
|
"/url open https://profanity-im.github.io",
|
||||||
|
"/url save https://profanity-im.github.io/guide/latest/userguide.html /home/user/Download/")
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -44,6 +44,8 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
#include <glib/gstdio.h>
|
||||||
|
#include <gio/gio.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
@ -8937,28 +8939,210 @@ cmd_slashguard(ProfWin *window, const char *const command, gchar **args)
|
|||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
cmd_urlopen(ProfWin *window, const char *const command, gchar **args)
|
cmd_url_open(ProfWin *window, const char *const command, gchar **args)
|
||||||
{
|
{
|
||||||
if (window->type != WIN_CHAT &&
|
if (window->type != WIN_CHAT &&
|
||||||
window->type != WIN_MUC &&
|
window->type != WIN_MUC &&
|
||||||
window->type != WIN_PRIVATE) {
|
window->type != WIN_PRIVATE) {
|
||||||
cons_show("urlopen not supported in this window");
|
cons_show("url open not supported in this window");
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args[0] == NULL) {
|
if (args[1] == NULL) {
|
||||||
cons_bad_cmd_usage(command);
|
cons_bad_cmd_usage(command);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gchar* cmd = prefs_get_string(PREF_URL_OPEN_CMD);
|
gboolean require_save = false;
|
||||||
gchar *argv[] = {cmd, args[0], NULL};
|
|
||||||
|
char *suffix_cmd = NULL;
|
||||||
|
char *suffix = NULL;
|
||||||
|
gchar *fileStart = g_strrstr(args[1], "/");
|
||||||
|
if (fileStart == NULL) {
|
||||||
|
cons_show("URL '%s' is not valid.", args[1]);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
fileStart++;
|
||||||
|
if (((char*)(fileStart - 2))[0] == '/' &&
|
||||||
|
((char*)(fileStart - 3))[0] == ':'
|
||||||
|
){
|
||||||
|
// If the '/' is last character of the '://' string, there will be no suffix
|
||||||
|
// Therefore, it is considered that there is no file name in the URL and
|
||||||
|
// fileStart is set to the end of the URL.
|
||||||
|
fileStart = args[1] + strlen(args[1]);
|
||||||
|
}
|
||||||
|
gchar *suffixStart = g_strrstr(fileStart, ".");
|
||||||
|
if (suffixStart != NULL) {
|
||||||
|
suffixStart++;
|
||||||
|
gchar *suffixEnd = g_strrstr(suffixStart, "#");
|
||||||
|
if(suffixEnd == NULL) {
|
||||||
|
suffix = g_strdup(suffixStart);
|
||||||
|
} else {
|
||||||
|
suffix = g_strndup(suffixStart, suffixEnd - suffixStart);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char **suffix_cmd_pref = prefs_get_string_list_with_option(PREF_URL_OPEN_CMD, NULL);
|
||||||
|
if (suffix != NULL) {
|
||||||
|
gchar *lowercase_suffix = g_ascii_strdown(suffix, -1);
|
||||||
|
g_strfreev(suffix_cmd_pref);
|
||||||
|
suffix_cmd_pref = prefs_get_string_list_with_option(PREF_URL_OPEN_CMD, lowercase_suffix);
|
||||||
|
g_free(lowercase_suffix);
|
||||||
|
lowercase_suffix = NULL;
|
||||||
|
g_free(suffix);
|
||||||
|
suffix = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 == g_strcmp0(suffix_cmd_pref[0], "true")) {
|
||||||
|
require_save = true;
|
||||||
|
}
|
||||||
|
suffix_cmd = g_strdup(suffix_cmd_pref[1]);
|
||||||
|
g_strfreev(suffix_cmd_pref);
|
||||||
|
suffix_cmd_pref = NULL;
|
||||||
|
|
||||||
|
gchar *scheme = g_uri_parse_scheme(args[1]);
|
||||||
|
if( 0 == g_strcmp0(scheme, "aesgcm")) {
|
||||||
|
require_save = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (require_save) {
|
||||||
|
gchar *save_args[] = { "open", args[1], "/tmp/profanity.tmp", NULL};
|
||||||
|
cmd_url_save(window, command, save_args);
|
||||||
|
}
|
||||||
|
|
||||||
|
gchar **argv = g_strsplit(suffix_cmd, " ", 0);
|
||||||
|
guint num_args = 0;
|
||||||
|
while (argv[num_args]) {
|
||||||
|
if (0 == g_strcmp0(argv[num_args], "%u")) {
|
||||||
|
g_free(argv[num_args]);
|
||||||
|
if (require_save) {
|
||||||
|
argv[num_args] = g_strdup("/tmp/profanity.tmp");
|
||||||
|
} else {
|
||||||
|
argv[num_args] = g_strdup(args[1]);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
num_args++;
|
||||||
|
}
|
||||||
|
|
||||||
if (!call_external(argv, NULL, NULL)) {
|
if (!call_external(argv, NULL, NULL)) {
|
||||||
cons_show_error("Unable to open url: check the logs for more information.");
|
cons_show_error("Unable to open url: check the logs for more information.");
|
||||||
}
|
}
|
||||||
|
|
||||||
g_free(cmd);
|
if (require_save) {
|
||||||
|
g_unlink("/tmp/profanity.tmp");
|
||||||
|
}
|
||||||
|
|
||||||
|
g_strfreev(argv);
|
||||||
|
g_free(suffix_cmd);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
cmd_url_save(ProfWin *window, const char *const command, gchar **args)
|
||||||
|
{
|
||||||
|
if (window->type != WIN_CHAT &&
|
||||||
|
window->type != WIN_MUC &&
|
||||||
|
window->type != WIN_PRIVATE) {
|
||||||
|
cons_show("url save not supported in this window");
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args[1] == NULL) {
|
||||||
|
cons_bad_cmd_usage(command);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
gchar *uri = args[1];
|
||||||
|
gchar *target_path = g_strdup(args[2]);
|
||||||
|
|
||||||
|
GFile *file = g_file_new_for_uri(uri);
|
||||||
|
|
||||||
|
gchar *target_dir = NULL;
|
||||||
|
gchar *base_name = NULL;
|
||||||
|
|
||||||
|
if (target_path == NULL) {
|
||||||
|
target_dir = g_strdup("./");
|
||||||
|
base_name = g_file_get_basename(file);
|
||||||
|
if (0 == g_strcmp0(base_name, ".")) {
|
||||||
|
g_free(base_name);
|
||||||
|
base_name = g_strdup("saved_url_content.html");
|
||||||
|
}
|
||||||
|
target_path = g_strconcat(target_dir, base_name, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_file_test(target_path, G_FILE_TEST_EXISTS) &&
|
||||||
|
g_file_test(target_path, G_FILE_TEST_IS_DIR)
|
||||||
|
) {
|
||||||
|
target_dir = g_strdup(target_path);
|
||||||
|
base_name = g_file_get_basename(file);
|
||||||
|
g_free(target_path);
|
||||||
|
target_path = g_strconcat(target_dir, "/", base_name, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_object_unref(file);
|
||||||
|
file = NULL;
|
||||||
|
|
||||||
|
if (base_name == NULL) {
|
||||||
|
base_name = g_path_get_basename(target_path);
|
||||||
|
target_dir = g_path_get_dirname(target_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!g_file_test(target_dir, G_FILE_TEST_EXISTS) ||
|
||||||
|
!g_file_test(target_dir, G_FILE_TEST_IS_DIR)) {
|
||||||
|
cons_show("%s does not exist or is not a directory.", target_dir);
|
||||||
|
g_free(target_path);
|
||||||
|
g_free(target_dir);
|
||||||
|
g_free(base_name);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
gchar *scheme = g_uri_parse_scheme(uri);
|
||||||
|
if (scheme == NULL) {
|
||||||
|
cons_show("URL '%s' is not valid.", uri);
|
||||||
|
g_free(target_path);
|
||||||
|
g_free(target_dir);
|
||||||
|
g_free(base_name);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
gchar *scheme_cmd = NULL;
|
||||||
|
|
||||||
|
if (0 == g_strcmp0(scheme, "http")
|
||||||
|
|| 0 == g_strcmp0(scheme, "https")
|
||||||
|
|| 0 == g_strcmp0(scheme, "aesgcm")
|
||||||
|
) {
|
||||||
|
scheme_cmd = prefs_get_string_with_option(PREF_URL_SAVE_CMD, scheme);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free(scheme);
|
||||||
|
scheme = NULL;
|
||||||
|
|
||||||
|
gchar **argv = g_strsplit(scheme_cmd, " ", 0);
|
||||||
|
g_free(scheme_cmd);
|
||||||
|
scheme_cmd = NULL;
|
||||||
|
|
||||||
|
guint num_args = 0;
|
||||||
|
while (argv[num_args]) {
|
||||||
|
if (0 == g_strcmp0(argv[num_args], "%u")) {
|
||||||
|
g_free(argv[num_args]);
|
||||||
|
argv[num_args] = g_strdup(uri);
|
||||||
|
} else if (0 == g_strcmp0(argv[num_args], "%p")) {
|
||||||
|
g_free(argv[num_args]);
|
||||||
|
argv[num_args] = target_path;
|
||||||
|
}
|
||||||
|
num_args++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!call_external(argv, NULL, NULL)) {
|
||||||
|
cons_show_error("Unable to save url: check the logs for more information.");
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free(target_dir);
|
||||||
|
g_free(base_name);
|
||||||
|
g_strfreev(argv);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -8970,8 +9154,16 @@ cmd_executable(ProfWin *window, const char *const command, gchar **args)
|
|||||||
prefs_set_string(PREF_AVATAR_CMD, args[1]);
|
prefs_set_string(PREF_AVATAR_CMD, args[1]);
|
||||||
cons_show("Avatar command set to: %s", args[1]);
|
cons_show("Avatar command set to: %s", args[1]);
|
||||||
} else if (g_strcmp0(args[0], "urlopen") == 0) {
|
} else if (g_strcmp0(args[0], "urlopen") == 0) {
|
||||||
prefs_set_string(PREF_URL_OPEN_CMD, args[1]);
|
char *str = g_strjoinv(" ", &args[3]);
|
||||||
cons_show("urlopen command set to: %s", args[1]);
|
const gchar* const list[] = {args[2], str, NULL};
|
||||||
|
prefs_set_string_list_with_option(PREF_URL_OPEN_CMD, args[1], list);
|
||||||
|
cons_show("`url open` command set to: %s for %s files", str, args[1]);
|
||||||
|
g_free(str);
|
||||||
|
} else if (g_strcmp0(args[0], "urlsave") == 0) {
|
||||||
|
char *str = g_strjoinv(" ", &args[2]);
|
||||||
|
prefs_set_string_with_option(PREF_URL_SAVE_CMD, args[1], str);
|
||||||
|
cons_show("`url save` command set to: %s for scheme %s", str, args[1]);
|
||||||
|
g_free(str);
|
||||||
} else {
|
} else {
|
||||||
cons_bad_cmd_usage(command);
|
cons_bad_cmd_usage(command);
|
||||||
}
|
}
|
||||||
|
@ -233,7 +233,8 @@ gboolean cmd_correction(ProfWin *window, const char *const command, gchar **args
|
|||||||
gboolean cmd_correct(ProfWin *window, const char *const command, gchar **args);
|
gboolean cmd_correct(ProfWin *window, const char *const command, gchar **args);
|
||||||
gboolean cmd_slashguard(ProfWin *window, const char *const command, gchar **args);
|
gboolean cmd_slashguard(ProfWin *window, const char *const command, gchar **args);
|
||||||
gboolean cmd_serversoftware(ProfWin *window, const char *const command, gchar **args);
|
gboolean cmd_serversoftware(ProfWin *window, const char *const command, gchar **args);
|
||||||
gboolean cmd_urlopen(ProfWin *window, const char *const command, gchar **args);
|
gboolean cmd_url_open(ProfWin *window, const char *const command, gchar **args);
|
||||||
|
gboolean cmd_url_save(ProfWin *window, const char *const command, gchar **args);
|
||||||
gboolean cmd_executable(ProfWin *window, const char *const command, gchar **args);
|
gboolean cmd_executable(ProfWin *window, const char *const command, gchar **args);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -64,6 +64,7 @@
|
|||||||
#define PREF_GROUP_OMEMO "omemo"
|
#define PREF_GROUP_OMEMO "omemo"
|
||||||
#define PREF_GROUP_MUC "muc"
|
#define PREF_GROUP_MUC "muc"
|
||||||
#define PREF_GROUP_PLUGINS "plugins"
|
#define PREF_GROUP_PLUGINS "plugins"
|
||||||
|
#define PREF_GROUP_EXECUTABLES "executables"
|
||||||
|
|
||||||
#define INPBLOCK_DEFAULT 1000
|
#define INPBLOCK_DEFAULT 1000
|
||||||
|
|
||||||
@ -1855,9 +1856,11 @@ _get_group(preference_t pref)
|
|||||||
case PREF_GRLOG:
|
case PREF_GRLOG:
|
||||||
case PREF_LOG_ROTATE:
|
case PREF_LOG_ROTATE:
|
||||||
case PREF_LOG_SHARED:
|
case PREF_LOG_SHARED:
|
||||||
|
return PREF_GROUP_LOGGING;
|
||||||
case PREF_AVATAR_CMD:
|
case PREF_AVATAR_CMD:
|
||||||
case PREF_URL_OPEN_CMD:
|
case PREF_URL_OPEN_CMD:
|
||||||
return PREF_GROUP_LOGGING;
|
case PREF_URL_SAVE_CMD:
|
||||||
|
return PREF_GROUP_EXECUTABLES;
|
||||||
case PREF_AUTOAWAY_CHECK:
|
case PREF_AUTOAWAY_CHECK:
|
||||||
case PREF_AUTOAWAY_MODE:
|
case PREF_AUTOAWAY_MODE:
|
||||||
case PREF_AUTOAWAY_MESSAGE:
|
case PREF_AUTOAWAY_MESSAGE:
|
||||||
@ -2147,7 +2150,9 @@ _get_key(preference_t pref)
|
|||||||
case PREF_MAM:
|
case PREF_MAM:
|
||||||
return "mam";
|
return "mam";
|
||||||
case PREF_URL_OPEN_CMD:
|
case PREF_URL_OPEN_CMD:
|
||||||
return "urlopen.cmd";
|
return "url.open.cmd";
|
||||||
|
case PREF_URL_SAVE_CMD:
|
||||||
|
return "url.save.cmd";
|
||||||
default:
|
default:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -2284,8 +2289,9 @@ _get_default_string(preference_t pref)
|
|||||||
case PREF_COLOR_NICK:
|
case PREF_COLOR_NICK:
|
||||||
return "false";
|
return "false";
|
||||||
case PREF_AVATAR_CMD:
|
case PREF_AVATAR_CMD:
|
||||||
case PREF_URL_OPEN_CMD:
|
|
||||||
return "xdg-open";
|
return "xdg-open";
|
||||||
|
case PREF_URL_SAVE_CMD:
|
||||||
|
return "curl -o %p %u";
|
||||||
default:
|
default:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -2296,8 +2302,15 @@ _get_default_string(preference_t pref)
|
|||||||
static char**
|
static char**
|
||||||
_get_default_string_list(preference_t pref)
|
_get_default_string_list(preference_t pref)
|
||||||
{
|
{
|
||||||
|
char **str_array = NULL;
|
||||||
|
|
||||||
switch (pref)
|
switch (pref)
|
||||||
{
|
{
|
||||||
|
case PREF_URL_OPEN_CMD:
|
||||||
|
str_array = g_malloc0(3);
|
||||||
|
str_array[0] = g_strdup("false");
|
||||||
|
str_array[1] = g_strdup("xdg-open %u");
|
||||||
|
return str_array;
|
||||||
default:
|
default:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -172,6 +172,7 @@ typedef enum {
|
|||||||
PREF_SLASH_GUARD,
|
PREF_SLASH_GUARD,
|
||||||
PREF_MAM,
|
PREF_MAM,
|
||||||
PREF_URL_OPEN_CMD,
|
PREF_URL_OPEN_CMD,
|
||||||
|
PREF_URL_SAVE_CMD,
|
||||||
} preference_t;
|
} preference_t;
|
||||||
|
|
||||||
typedef struct prof_alias_t {
|
typedef struct prof_alias_t {
|
||||||
|
Loading…
Reference in New Issue
Block a user