diff options
Diffstat (limited to 'src/command')
-rw-r--r-- | src/command/cmd_ac.c | 59 | ||||
-rw-r--r-- | src/command/cmd_defs.c | 35 | ||||
-rw-r--r-- | src/command/cmd_funcs.c | 79 | ||||
-rw-r--r-- | src/command/cmd_funcs.h | 4 |
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 |