about summary refs log tree commit diff stats
path: root/src/command/cmd_defs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/command/cmd_defs.c')
-rw-r--r--src/command/cmd_defs.c124
1 files changed, 22 insertions, 102 deletions
diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c
index aa041c6a..100f044e 100644
--- a/src/command/cmd_defs.c
+++ b/src/command/cmd_defs.c
@@ -103,8 +103,6 @@
 #define CMD_NOEXAMPLES      { NULL } }
 #define CMD_EXAMPLES(...)   { __VA_ARGS__, NULL } }
 
-static gboolean _cmd_execute(ProfWin *window, const char *const command, const char *const inp);
-
 GHashTable *commands = NULL;
 
 /*
@@ -2241,116 +2239,38 @@ cmd_has_tag(Command *pcmd, const char *const tag)
     return FALSE;
 }
 
-/*
- * Take a line of input and process it, return TRUE if profanity is to
- * continue, FALSE otherwise
- */
-gboolean
-cmd_process_input(ProfWin *window, char *inp)
+Command*
+cmd_get(const char *const command)
 {
-    log_debug("Input received: %s", inp);
-    gboolean result = FALSE;
-    g_strchomp(inp);
-
-    // just carry on if no input
-    if (strlen(inp) == 0) {
-        result = TRUE;
-
-    // handle command if input starts with a '/'
-    } else if (inp[0] == '/') {
-        char *inp_cpy = strdup(inp);
-        char *command = strtok(inp_cpy, " ");
-        char *question_mark = strchr(command, '?');
-        if (question_mark) {
-            *question_mark = '\0';
-            char *fakeinp;
-            if (asprintf(&fakeinp, "/help %s", command+1)) {
-                result = _cmd_execute(window, "/help", fakeinp);
-                free(fakeinp);
-            }
-        } else {
-            result = _cmd_execute(window, command, inp);
-        }
-        free(inp_cpy);
-
-    // call a default handler if input didn't start with '/'
+    if (commands) {
+        return g_hash_table_lookup(commands, command);
     } else {
-        result = cmd_execute_default(window, inp);
+        return NULL;
     }
-
-    return result;
 }
 
-// Command execution
-
-void
-cmd_execute_connect(ProfWin *window, const char *const account)
+GList*
+cmd_get_ordered(const char *const tag)
 {
-    GString *command = g_string_new("/connect ");
-    g_string_append(command, account);
-    cmd_process_input(window, command->str);
-    g_string_free(command, TRUE);
-}
-
-static gboolean
-_cmd_execute(ProfWin *window, const char *const command, const char *const inp)
-{
-    if (g_str_has_prefix(command, "/field") && window->type == WIN_MUC_CONFIG) {
-        gboolean result = FALSE;
-        gchar **args = parse_args_with_freetext(inp, 1, 2, &result);
-        if (!result) {
-            ui_current_print_formatted_line('!', 0, "Invalid command, see /form help");
-            result = TRUE;
-        } else {
-            gchar **tokens = g_strsplit(inp, " ", 2);
-            char *field = tokens[0] + 1;
-            result = cmd_form_field(window, field, args);
-            g_strfreev(tokens);
-        }
-
-        g_strfreev(args);
-        return result;
-    }
-
-    Command *cmd = g_hash_table_lookup(commands, command);
-    gboolean result = FALSE;
-
-    if (cmd) {
-        gchar **args = cmd->parser(inp, cmd->min_args, cmd->max_args, &result);
-        if (result == FALSE) {
-            ui_invalid_command_usage(cmd->cmd, cmd->setting_func);
-            return TRUE;
-        }
-        if (args[0] && cmd->sub_funcs[0][0]) {
-            int i = 0;
-            while (cmd->sub_funcs[i][0]) {
-                if (g_strcmp0(args[0], (char*)cmd->sub_funcs[i][0]) == 0) {
-                    gboolean (*func)(ProfWin *window, const char *const command, gchar **args) = cmd->sub_funcs[i][1];
-                    gboolean result = func(window, command, args);
-                    g_strfreev(args);
-                    return result;
-                }
-                i++;
+    GList *ordered_commands = NULL;
+
+    GHashTableIter iter;
+    gpointer key;
+    gpointer value;
+
+    g_hash_table_iter_init(&iter, commands);
+    while (g_hash_table_iter_next(&iter, &key, &value)) {
+        Command *pcmd = (Command *)value;
+        if (tag) {
+            if (cmd_has_tag(pcmd, tag)) {
+                ordered_commands = g_list_insert_sorted(ordered_commands, pcmd->cmd, (GCompareFunc)g_strcmp0);
             }
-        }
-        if (!cmd->func) {
-            ui_invalid_command_usage(cmd->cmd, cmd->setting_func);
-            return TRUE;
-        }
-        gboolean result = cmd->func(window, command, args);
-        g_strfreev(args);
-        return result;
-    } else if (plugins_run_command(inp)) {
-        return TRUE;
-    } else {
-        gboolean ran_alias = FALSE;
-        gboolean alias_result = cmd_execute_alias(window, inp, &ran_alias);
-        if (!ran_alias) {
-            return cmd_execute_default(window, inp);
         } else {
-            return alias_result;
+            ordered_commands = g_list_insert_sorted(ordered_commands, pcmd->cmd, (GCompareFunc)g_strcmp0);
         }
     }
+
+    return ordered_commands;
 }
 
 static int