about summary refs log tree commit diff stats
path: root/src/command
diff options
context:
space:
mode:
Diffstat (limited to 'src/command')
-rw-r--r--src/command/cmd_ac.c59
-rw-r--r--src/command/cmd_defs.c35
-rw-r--r--src/command/cmd_funcs.c79
-rw-r--r--src/command/cmd_funcs.h4
4 files changed, 174 insertions, 3 deletions
diff --git a/src/command/cmd_ac.c b/src/command/cmd_ac.c
index 5b61da6a..386e8939 100644
--- a/src/command/cmd_ac.c
+++ b/src/command/cmd_ac.c
@@ -113,6 +113,8 @@ static char* _status_autocomplete(ProfWin *window, const char *const input, gboo
 static char* _logging_autocomplete(ProfWin *window, const char *const input, gboolean previous);
 static char* _color_autocomplete(ProfWin *window, const char *const input, gboolean previous);
 static char* _avatar_autocomplete(ProfWin *window, const char *const input, gboolean previous);
+static char* _correction_autocomplete(ProfWin *window, const char *const input, gboolean previous);
+static char* _correct_autocomplete(ProfWin *window, const char *const input, gboolean previous);
 
 static char* _script_autocomplete_func(const char *const prefix, gboolean previous, void *context);
 
@@ -234,6 +236,7 @@ static Autocomplete status_ac;
 static Autocomplete status_state_ac;
 static Autocomplete logging_ac;
 static Autocomplete color_ac;
+static Autocomplete correction_ac;
 
 void
 cmd_ac_init(void)
@@ -928,6 +931,11 @@ cmd_ac_init(void)
     autocomplete_add(color_ac, "off");
     autocomplete_add(color_ac, "redgreen");
     autocomplete_add(color_ac, "blue");
+
+    correction_ac = autocomplete_new();
+    autocomplete_add(correction_ac, "on");
+    autocomplete_add(correction_ac, "off");
+    autocomplete_add(correction_ac, "char");
 }
 
 void
@@ -1233,6 +1241,7 @@ cmd_ac_reset(ProfWin *window)
     autocomplete_reset(status_state_ac);
     autocomplete_reset(logging_ac);
     autocomplete_reset(color_ac);
+    autocomplete_reset(correction_ac);
 
     autocomplete_reset(script_ac);
     if (script_show_ac) {
@@ -1380,6 +1389,7 @@ cmd_ac_uninit(void)
     autocomplete_free(status_state_ac);
     autocomplete_free(logging_ac);
     autocomplete_free(color_ac);
+    autocomplete_free(correction_ac);
 }
 
 static void
@@ -1630,6 +1640,8 @@ _cmd_ac_complete_params(ProfWin *window, const char *const input, gboolean previ
     g_hash_table_insert(ac_funcs, "/logging",       _logging_autocomplete);
     g_hash_table_insert(ac_funcs, "/color",         _color_autocomplete);
     g_hash_table_insert(ac_funcs, "/avatar",        _avatar_autocomplete);
+    g_hash_table_insert(ac_funcs, "/correction",    _correction_autocomplete);
+    g_hash_table_insert(ac_funcs, "/correct",       _correct_autocomplete);
 
     int len = strlen(input);
     char parsed[len+1];
@@ -3713,3 +3725,50 @@ _avatar_autocomplete(ProfWin *window, const char *const input, gboolean previous
 
     return NULL;
 }
+
+static char*
+_correction_autocomplete(ProfWin *window, const char *const input, gboolean previous)
+{
+    char *result = NULL;
+
+    result = autocomplete_param_with_ac(input, "/correction", correction_ac, TRUE, previous);
+    if (result) {
+        return result;
+    }
+
+    return NULL;
+}
+
+static char*
+_correct_autocomplete(ProfWin *window, const char *const input, gboolean previous)
+{
+	char *last_message = NULL;
+	switch(window->type) {
+	case WIN_CHAT:
+	{
+		ProfChatWin *chatwin = (ProfChatWin*)window;
+		assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK);
+		last_message = chatwin->last_message;
+		break;
+	}
+	case WIN_MUC:
+	{
+		ProfMucWin *mucwin = (ProfMucWin*)window;
+		assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK);
+		last_message = mucwin->last_message;
+	}
+	default:
+		break;
+	}
+
+	if (last_message == NULL) {
+		return NULL;
+	}
+
+	GString *result_str = g_string_new("/correct ");
+	g_string_append(result_str, last_message);
+	char *result = result_str->str;
+	g_string_free(result_str, FALSE);
+
+	return result;
+}
diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c
index b583a06b..cc8f0a7a 100644
--- a/src/command/cmd_defs.c
+++ b/src/command/cmd_defs.c
@@ -2361,6 +2361,41 @@ static struct cmd_t command_defs[] =
             { "on|off", ""})
         CMD_NOEXAMPLES
     },
+
+    { "/correction",
+        parse_args, 1, 2, &cons_correction_setting,
+        CMD_NOSUBFUNCS
+        CMD_MAINFUNC(cmd_correction)
+        CMD_TAGS(
+            CMD_TAG_UI,
+            CMD_TAG_CHAT,
+            CMD_TAG_GROUPCHAT)
+        CMD_SYN(
+            "/correction <on>|<off>",
+            "/correction char <char>")
+        CMD_DESC(
+            "Settings regarding Last Message Correction (XEP-0308). Caution: We do not yet check the 'from' field. So it could happen that someone else is overwriting the actual message.")
+        CMD_ARGS(
+            { "on|off", "Enable/Disable support for last message correction."},
+            { "char",    "Set character that will prefix corrected messages. Default: +"})
+        CMD_NOEXAMPLES
+    },
+
+    { "/correct",
+        parse_args, 1, -1, NULL,
+        CMD_NOSUBFUNCS
+        CMD_MAINFUNC(cmd_correct)
+        CMD_TAGS(
+            CMD_TAG_CHAT,
+            CMD_TAG_GROUPCHAT)
+        CMD_SYN(
+            "/correct <message>")
+        CMD_DESC(
+            "Correct and resend the last message (XEP-0308).")
+        CMD_ARGS(
+            { "message",    "The corrected message."})
+        CMD_NOEXAMPLES
+    },
 };
 
 static GHashTable *search_index;
diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c
index 930004b3..40f5d8f4 100644
--- a/src/command/cmd_funcs.c
+++ b/src/command/cmd_funcs.c
@@ -7529,7 +7529,7 @@ cmd_otr_start(ProfWin *window, const char *const command, gchar **args)
 
         if (!otr_is_secure(barejid)) {
             char *otr_query_message = otr_start_query();
-            char *id = message_send_chat_otr(barejid, otr_query_message, FALSE);
+            char *id = message_send_chat_otr(barejid, otr_query_message, FALSE, NULL);
             free(id);
             return TRUE;
         }
@@ -7562,7 +7562,8 @@ cmd_otr_start(ProfWin *window, const char *const command, gchar **args)
         }
 
         char *otr_query_message = otr_start_query();
-        char *id = message_send_chat_otr(chatwin->barejid, otr_query_message, FALSE);
+        char *id = message_send_chat_otr(chatwin->barejid, otr_query_message, FALSE, NULL);
+
         free(id);
         return TRUE;
     }
@@ -8651,3 +8652,77 @@ cmd_os(ProfWin *window, const char *const command, gchar **args)
 
     return TRUE;
 }
+
+gboolean
+cmd_correction(ProfWin *window, const char *const command, gchar **args)
+{
+    // enable/disable
+    if (g_strcmp0(args[0], "on") == 0) {
+        _cmd_set_boolean_preference(args[0], command, "Last Message Correction", PREF_CORRECTION_ALLOW);
+        caps_add_feature(XMPP_FEATURE_LAST_MESSAGE_CORRECTION);
+        return TRUE;
+    } else if (g_strcmp0(args[0], "off") == 0) {
+        _cmd_set_boolean_preference(args[0], command, "Last Message Correction", PREF_CORRECTION_ALLOW);
+        caps_remove_feature(XMPP_FEATURE_LAST_MESSAGE_CORRECTION);
+        return TRUE;
+    }
+
+    // char
+    if (g_strcmp0(args[0], "char") == 0) {
+        if (args[1] == NULL) {
+            cons_bad_cmd_usage(command);
+        } else if (strlen(args[1]) != 1) {
+            cons_bad_cmd_usage(command);
+        } else {
+            prefs_set_correction_char(args[1][0]);
+            cons_show("LMC char set to %c.", args[1][0]);
+        }
+    }
+
+    return TRUE;
+}
+
+gboolean
+cmd_correct(ProfWin *window, const char *const command, gchar **args)
+{
+    jabber_conn_status_t conn_status = connection_get_status();
+    if (conn_status != JABBER_CONNECTED) {
+        cons_show("You are currently not connected.");
+        return TRUE;
+    }
+
+    if (window->type == WIN_CHAT) {
+        ProfChatWin *chatwin = (ProfChatWin*)window;
+        assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK);
+
+        if (chatwin->last_msg_id == NULL || chatwin->last_message == NULL) {
+            win_println(window, THEME_DEFAULT, '!', "No last message to correct.");
+            return TRUE;
+        }
+
+        // send message again, with replace flag
+        gchar *message = g_strjoinv(" ", args);
+        cl_ev_send_msg_correct(chatwin, message, FALSE, TRUE);
+
+        free(message);
+        return TRUE;
+    } else if (window->type == WIN_MUC) {
+        ProfMucWin *mucwin = (ProfMucWin*)window;
+        assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK);
+
+        if (mucwin->last_msg_id == NULL || mucwin->last_message == NULL) {
+            win_println(window, THEME_DEFAULT, '!', "No last message to correct.");
+            return TRUE;
+        }
+
+        // send message again, with replace flag
+        gchar *message = g_strjoinv(" ", args);
+        cl_ev_send_muc_msg_corrected(mucwin, message, FALSE, TRUE);
+
+        free(message);
+        return TRUE;
+    }
+
+    win_println(window, THEME_DEFAULT, '!', "Command /correct only valid in regular chat windows.");
+    return TRUE;
+}
diff --git a/src/command/cmd_funcs.h b/src/command/cmd_funcs.h
index a743951f..f283c910 100644
--- a/src/command/cmd_funcs.h
+++ b/src/command/cmd_funcs.h
@@ -54,7 +54,7 @@ typedef struct cmd_help_t {
  * cmd - The command string including leading '/'
  * parser - The function used to parse arguments
  * min_args - Minimum number of arguments
- * max_args - Maximum number of arguments
+ * max_args - Maximum number of arguments, -1 for infinite
  * setting_func - Function to display current settings to the console
  * sub_funcs - Optional list of functions mapped to the first argument
  * func - Main function to call when no arguments, or sub_funcs not implemented
@@ -227,4 +227,6 @@ gboolean cmd_paste(ProfWin *window, const char *const command, gchar **args);
 gboolean cmd_color(ProfWin *window, const char *const command, gchar **args);
 gboolean cmd_avatar(ProfWin *window, const char *const command, gchar **args);
 gboolean cmd_os(ProfWin *window, const char *const command, gchar **args);
+gboolean cmd_correction(ProfWin *window, const char *const command, gchar **args);
+gboolean cmd_correct(ProfWin *window, const char *const command, gchar **args);
 #endif