From da748fc653a4d35cc24a7b9dd1c25a4a3b07f4ee Mon Sep 17 00:00:00 2001 From: Sebastien Helleu Date: Sat, 15 Nov 2008 16:33:31 +0100 Subject: [PATCH] Reintroduce option "irc.network.send_unknown_commands", save extra data for buffers with /upgrade (title, input data, text search) --- src/core/wee-input.c | 57 +++++++++++++++++++++------------ src/core/wee-upgrade.c | 45 ++++++++++++++++++++++++-- src/gui/gui-buffer.c | 43 ++++++++++++++++++++++++- src/gui/gui-buffer.h | 2 ++ src/plugins/irc/irc-channel.c | 3 ++ src/plugins/irc/irc-config.c | 60 ++++++++++++++++++++++++++++++++++- src/plugins/irc/irc-input.c | 17 ++++++++-- 7 files changed, 200 insertions(+), 27 deletions(-) diff --git a/src/core/wee-input.c b/src/core/wee-input.c index e92a283f6..10fe0ea1e 100644 --- a/src/core/wee-input.c +++ b/src/core/wee-input.c @@ -57,8 +57,27 @@ input_is_command (const char *line) } /* - * input_exec_command: executes a command (WeeChat internal or a - * plugin command) + * input_exec_data: send data to buffer input callbackr + */ + +void +input_exec_data (struct t_gui_buffer *buffer, const char *data) +{ + if (buffer->input_callback) + { + (void)(buffer->input_callback) (buffer->input_callback_data, + buffer, + data); + } + else + gui_chat_printf (buffer, + _("%sYou can not write text in this " + "buffer"), + gui_chat_prefix[GUI_CHAT_PREFIX_ERROR]); +} + +/* + * input_exec_command: execute a command (WeeChat internal or a plugin command) * if only_builtin == 1, then try only * WeeChat commands (not plugins neither aliases) * returns: 1 if command was executed succesfully @@ -120,11 +139,20 @@ input_exec_command (struct t_gui_buffer *buffer, command + 1); break; default: /* no command hooked */ - gui_chat_printf (NULL, - _("%sError: unknown command \"%s\" (type /help " - "for help)"), - gui_chat_prefix[GUI_CHAT_PREFIX_ERROR], - command + 1); + /* if unknown commands are accepted by this buffer, just send + input text as data to buffer, otherwise display error */ + if (buffer->input_get_unknown_commands) + { + input_exec_data (buffer, string); + } + else + { + gui_chat_printf (NULL, + _("%sError: unknown command \"%s\" (type /help " + "for help)"), + gui_chat_prefix[GUI_CHAT_PREFIX_ERROR], + command + 1); + } break; } free (command); @@ -175,20 +203,7 @@ input_data (struct t_gui_buffer *buffer, const char *data) } else { - if ((ptr_data[0] == '/') && (ptr_data[1] == '/')) - ptr_data++; - - if (buffer->input_callback) - { - (void)(buffer->input_callback) (buffer->input_callback_data, - buffer, - ptr_data); - } - else - gui_chat_printf (buffer, - _("%sYou can not write text in this " - "buffer"), - gui_chat_prefix[GUI_CHAT_PREFIX_ERROR]); + input_exec_data (buffer, ptr_data); } if (pos) diff --git a/src/core/wee-upgrade.c b/src/core/wee-upgrade.c index bf4c47870..27b1c96b2 100644 --- a/src/core/wee-upgrade.c +++ b/src/core/wee-upgrade.c @@ -325,16 +325,57 @@ upgrade_weechat_read_cb (int object_id, { if (infolist_integer (infolist, "current_buffer")) upgrade_set_current_buffer = upgrade_current_buffer; + upgrade_current_buffer->plugin_name_for_upgrade = + strdup (infolist_string (infolist, "plugin_name")); upgrade_current_buffer->short_name = (infolist_string (infolist, "short_name")) ? strdup (infolist_string (infolist, "short_name")) : strdup (infolist_string (infolist, "name")); - upgrade_current_buffer->plugin_name_for_upgrade = - strdup (infolist_string (infolist, "plugin_name")); + upgrade_current_buffer->type = + infolist_integer (infolist, "type"); + upgrade_current_buffer->notify = + infolist_integer (infolist, "notify"); upgrade_current_buffer->nicklist_case_sensitive = infolist_integer (infolist, "nicklist_case_sensitive"); upgrade_current_buffer->nicklist_display_groups = infolist_integer (infolist, "nicklist_display_groups"); + upgrade_current_buffer->title = + (infolist_string (infolist, "title")) ? + strdup (infolist_string (infolist, "title")) : NULL; + upgrade_current_buffer->input = + infolist_integer (infolist, "input"); + upgrade_current_buffer->input_get_unknown_commands = + infolist_integer (infolist, "input_get_unknown_commands"); + if (infolist_integer (infolist, "input_buffer_alloc") > 0) + { + upgrade_current_buffer->input_buffer = + malloc (infolist_integer (infolist, "input_buffer_alloc")); + if (upgrade_current_buffer->input_buffer) + { + upgrade_current_buffer->input_buffer_size = + infolist_integer (infolist, "input_buffer_size"); + upgrade_current_buffer->input_buffer_length = + infolist_integer (infolist, "input_buffer_length"); + upgrade_current_buffer->input_buffer_pos = + infolist_integer (infolist, "input_buffer_pos"); + upgrade_current_buffer->input_buffer_1st_display = + infolist_integer (infolist, "input_buffer_1st_display"); + if (infolist_string (infolist, "input_buffer")) + strcpy (upgrade_current_buffer->input_buffer, + infolist_string (infolist, "input_buffer")); + else + upgrade_current_buffer->input_buffer[0] = '\0'; + } + } + upgrade_current_buffer->text_search = + infolist_integer (infolist, "text_search"); + upgrade_current_buffer->text_search_exact = + infolist_integer (infolist, "text_search_exact"); + upgrade_current_buffer->text_search_found = + infolist_integer (infolist, "text_search_found"); + if (infolist_string (infolist, "text_search_input")) + upgrade_current_buffer->text_search_input = + strdup (infolist_string (infolist, "text_search_input")); gui_buffer_set_highlight_words (upgrade_current_buffer, infolist_string (infolist, "highlight_words")); gui_buffer_set_highlight_tags (upgrade_current_buffer, diff --git a/src/gui/gui-buffer.c b/src/gui/gui-buffer.c index 9778ab38c..6ebb44ea8 100644 --- a/src/gui/gui-buffer.c +++ b/src/gui/gui-buffer.c @@ -316,6 +316,7 @@ gui_buffer_new (struct t_weechat_plugin *plugin, new_buffer->input = 1; new_buffer->input_callback = input_callback; new_buffer->input_callback_data = input_callback_data; + new_buffer->input_get_unknown_commands = 0; new_buffer->input_buffer_alloc = GUI_BUFFER_INPUT_BLOCK_SIZE; new_buffer->input_buffer = malloc (GUI_BUFFER_INPUT_BLOCK_SIZE); new_buffer->input_buffer[0] = '\0'; @@ -749,6 +750,18 @@ gui_buffer_set_highlight_tags (struct t_gui_buffer *buffer, } } +/* + * gui_buffer_set_input_get_unknown_commands: set "input_get_unknown_commands" + * flag for a buffer + */ + +void +gui_buffer_set_input_get_unknown_commands (struct t_gui_buffer *buffer, + int input_get_unknown_commands) +{ + buffer->input_get_unknown_commands = (input_get_unknown_commands) ? 1 : 0; +} + /* * gui_buffer_set_unread: set unread marker for a buffer */ @@ -892,6 +905,13 @@ gui_buffer_set (struct t_gui_buffer *buffer, const char *property, gui_input_text_changed_signal (); gui_buffer_ask_input_refresh (buffer, 1); } + else if (string_strcasecmp (property, "input_get_unknown_commands") == 0) + { + error = NULL; + number = strtol (value, &error, 10); + if (error && !error[0]) + gui_buffer_set_input_get_unknown_commands (buffer, number); + } else if (string_strncasecmp (property, "localvar_set_", 13) == 0) { if (value) @@ -1483,7 +1503,27 @@ gui_buffer_add_to_infolist (struct t_infolist *infolist, return 0; if (!infolist_new_var_integer (ptr_item, "input", buffer->input)) return 0; - if (!infolist_new_var_string (ptr_item, "input_string", buffer->input_buffer)) + if (!infolist_new_var_integer (ptr_item, "input_get_unknown_commands", buffer->input_get_unknown_commands)) + return 0; + if (!infolist_new_var_string (ptr_item, "input_buffer", buffer->input_buffer)) + return 0; + if (!infolist_new_var_integer (ptr_item, "input_buffer_alloc", buffer->input_buffer_alloc)) + return 0; + if (!infolist_new_var_integer (ptr_item, "input_buffer_size", buffer->input_buffer_size)) + return 0; + if (!infolist_new_var_integer (ptr_item, "input_buffer_length", buffer->input_buffer_length)) + return 0; + if (!infolist_new_var_integer (ptr_item, "input_buffer_pos", buffer->input_buffer_pos)) + return 0; + if (!infolist_new_var_integer (ptr_item, "input_buffer_1st_display", buffer->input_buffer_1st_display)) + return 0; + if (!infolist_new_var_integer (ptr_item, "text_search", buffer->text_search)) + return 0; + if (!infolist_new_var_integer (ptr_item, "text_search_exact", buffer->text_search_exact)) + return 0; + if (!infolist_new_var_integer (ptr_item, "text_search_found", buffer->text_search_found)) + return 0; + if (!infolist_new_var_string (ptr_item, "text_search_input", buffer->text_search_input)) return 0; if (!infolist_new_var_string (ptr_item, "highlight_words", buffer->highlight_words)) return 0; @@ -1700,6 +1740,7 @@ gui_buffer_print_log () log_printf (" input. . . . . . . . . : %d", ptr_buffer->input); log_printf (" input_callback . . . . : 0x%lx", ptr_buffer->input_callback); log_printf (" input_callback_data. . : 0x%lx", ptr_buffer->input_callback_data); + log_printf (" input_get_unknown_cmd. : %d", ptr_buffer->input_get_unknown_commands); log_printf (" input_buffer . . . . . : '%s'", ptr_buffer->input_buffer); log_printf (" input_buffer_alloc . . : %d", ptr_buffer->input_buffer_alloc); log_printf (" input_buffer_size. . . : %d", ptr_buffer->input_buffer_size); diff --git a/src/gui/gui-buffer.h b/src/gui/gui-buffer.h index 050f463e6..756fd1181 100644 --- a/src/gui/gui-buffer.h +++ b/src/gui/gui-buffer.h @@ -128,6 +128,8 @@ struct t_gui_buffer const char *input_data); void *input_callback_data; /* data for callback */ /* to this buffer */ + int input_get_unknown_commands; /* 1 if unknown commands are sent to */ + /* input_callback */ char *input_buffer; /* input buffer */ int input_buffer_alloc; /* input buffer: allocated size */ int input_buffer_size; /* buffer size in bytes */ diff --git a/src/plugins/irc/irc-channel.c b/src/plugins/irc/irc-channel.c index 79dbe1ace..79b697c31 100644 --- a/src/plugins/irc/irc-channel.c +++ b/src/plugins/irc/irc-channel.c @@ -105,6 +105,9 @@ irc_channel_new (struct t_irc_server *server, int channel_type, weechat_hook_signal_send ("logger_backlog", WEECHAT_HOOK_SIGNAL_POINTER, new_buffer); + + if (weechat_config_boolean (irc_config_network_send_unknown_commands)) + weechat_buffer_set (new_buffer, "input_get_unknown_commands", "1"); } if (channel_type == IRC_CHANNEL_TYPE_CHANNEL) diff --git a/src/plugins/irc/irc-config.c b/src/plugins/irc/irc-config.c index 75b3974d3..a1dd9b88a 100644 --- a/src/plugins/irc/irc-config.c +++ b/src/plugins/irc/irc-config.c @@ -238,6 +238,63 @@ irc_config_change_network_away_check (void *data, } } +/* + * irc_config_change_network_send_unknown_commands: called when "send_unknown_commands" + * is changed + */ + +void +irc_config_change_network_send_unknown_commands (void *data, + struct t_config_option *option) +{ + char value[2]; + struct t_irc_server *ptr_server; + struct t_irc_channel *ptr_channel; + + /* make C compiler happy */ + (void) data; + (void) option; + + strcpy (value, + (weechat_config_boolean (irc_config_network_send_unknown_commands)) ? + "1" : "0"); + + if (weechat_config_boolean (irc_config_look_one_server_buffer)) + { + if (irc_buffer_servers) + { + weechat_buffer_set (irc_buffer_servers, + "input_get_unknown_commands", value); + } + } + else + { + for (ptr_server = irc_servers; ptr_server; + ptr_server = ptr_server->next_server) + { + if (ptr_server->buffer) + { + weechat_buffer_set (ptr_server->buffer, + "input_get_unknown_commands", value); + } + } + } + + for (ptr_server = irc_servers; ptr_server; + ptr_server = ptr_server->next_server) + { + for (ptr_channel = ptr_server->channels; ptr_channel; + ptr_channel = ptr_channel->next_channel) + { + if (ptr_channel->buffer) + { + weechat_buffer_set (ptr_channel->buffer, + "input_get_unknown_commands", value); + } + } + } +} + /* * irc_config_server_default_change_cb: callback called when a default server * option is modified @@ -1129,7 +1186,8 @@ irc_config_init () irc_config_file, ptr_section, "send_unknown_commands", "boolean", N_("send unknown commands to IRC server"), - NULL, 0, 0, "off", NULL, NULL, NULL, NULL, NULL, NULL, NULL); + NULL, 0, 0, "off", NULL, NULL, NULL, + &irc_config_change_network_send_unknown_commands, NULL, NULL, NULL); /* filters */ ptr_section = weechat_config_new_section (irc_config_file, "ignore", diff --git a/src/plugins/irc/irc-input.c b/src/plugins/irc/irc-input.c index daab383f7..41ef3d5b7 100644 --- a/src/plugins/irc/irc-input.c +++ b/src/plugins/irc/irc-input.c @@ -143,6 +143,7 @@ int irc_input_data_cb (void *data, struct t_gui_buffer *buffer, const char *input_data) { + const char *ptr_data; char *data_with_colors, *msg; /* make C compiler happy */ @@ -150,12 +151,24 @@ irc_input_data_cb (void *data, struct t_gui_buffer *buffer, IRC_GET_SERVER_CHANNEL(buffer); + /* if send unknown commands is enabled and that input data is a command, + then send this command to IRC server */ + if (weechat_config_boolean (irc_config_network_send_unknown_commands) + && (input_data[0] == '/') && (input_data[1] != '/')) + { + if (ptr_server) + irc_server_sendf (ptr_server, input_data + 1); + return WEECHAT_RC_OK; + } + if (ptr_channel) { - data_with_colors = irc_color_encode (input_data, + ptr_data = ((input_data[0] == '/') && (input_data[1] == '/')) ? + input_data + 1 : input_data; + data_with_colors = irc_color_encode (ptr_data, weechat_config_boolean (irc_config_network_colors_send)); - msg = strdup ((data_with_colors) ? data_with_colors : input_data); + msg = strdup ((data_with_colors) ? data_with_colors : ptr_data); if (msg) { irc_input_send_user_message (buffer, msg);