From d3c79894e79146854c706a42dabff3443e03ae42 Mon Sep 17 00:00:00 2001 From: Simmo Saan Date: Wed, 30 Dec 2015 17:20:58 +0200 Subject: [PATCH 1/4] irc: add support for IRCv3.2 chghost --- src/plugins/irc/irc-protocol.c | 38 ++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/plugins/irc/irc-protocol.c b/src/plugins/irc/irc-protocol.c index 67b0109cd..0c0b59fa1 100644 --- a/src/plugins/irc/irc-protocol.c +++ b/src/plugins/irc/irc-protocol.c @@ -637,6 +637,43 @@ IRC_PROTOCOL_CALLBACK(cap) return WEECHAT_RC_OK; } +/* + * Callback for the IRC message "CHGHOST": user/host change of a nick (with + * capability "chghost"): + * http://ircv3.net/specs/extensions/chghost-3.2.html + * + * Message looks like: + * :nick!user@host CHGHOST user new.host.goes.here + * :nick!user@host CHGHOST newuser host + * :nick!user@host CHGHOST newuser new.host.goes.here + */ + +IRC_PROTOCOL_CALLBACK(chghost) +{ + int length; + struct t_irc_channel *ptr_channel; + struct t_irc_nick *ptr_nick; + + IRC_PROTOCOL_MIN_ARGS(4); + + for (ptr_channel = server->channels; ptr_channel; + ptr_channel = ptr_channel->next_channel) + { + ptr_nick = irc_nick_search (server, ptr_channel, nick); + if (ptr_nick) + { + if (ptr_nick->host) + free (ptr_nick->host); + length = strlen (argv[2]) + 1 + strlen (argv[3]) + 1; + ptr_nick->host = malloc (length); + if (ptr_nick->host) + snprintf (ptr_nick->host, length, "%s@%s", argv[2], argv[3]); + } + } + + return WEECHAT_RC_OK; +} + /* * Callback for the IRC message "ERROR". * @@ -5706,6 +5743,7 @@ irc_protocol_recv_command (struct t_irc_server *server, { "authenticate", /* authenticate */ 1, 0, &irc_protocol_cb_authenticate }, { "away", /* away (cap away-notify) */ 1, 0, &irc_protocol_cb_away }, { "cap", /* client capability */ 1, 0, &irc_protocol_cb_cap }, + { "chghost", /* user/host change (cap chghost) */ 1, 0, &irc_protocol_cb_chghost }, { "error", /* error received from IRC server */ 1, 0, &irc_protocol_cb_error }, { "invite", /* invite a nick on a channel */ 1, 0, &irc_protocol_cb_invite }, { "join", /* join a channel */ 1, 0, &irc_protocol_cb_join }, From bf9932bc1d4ca34e7f35d8bc21c09077170ca03c Mon Sep 17 00:00:00 2001 From: Simmo Saan Date: Thu, 7 Jan 2016 12:43:45 +0200 Subject: [PATCH 2/4] irc: display chghost messages in buffers --- src/plugins/irc/irc-color.h | 1 + src/plugins/irc/irc-config.c | 7 +++++++ src/plugins/irc/irc-config.h | 1 + src/plugins/irc/irc-protocol.c | 31 +++++++++++++++++++++++++++---- 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/plugins/irc/irc-color.h b/src/plugins/irc/irc-color.h index 526c50196..488f110b4 100644 --- a/src/plugins/irc/irc-color.h +++ b/src/plugins/irc/irc-color.h @@ -84,6 +84,7 @@ #define IRC_COLOR_STATUS_NAME weechat_color("status_name") #define IRC_COLOR_STATUS_NAME_SSL weechat_color("status_name_ssl") #define IRC_COLOR_MESSAGE_JOIN weechat_color(weechat_config_string(irc_config_color_message_join)) +#define IRC_COLOR_MESSAGE_CHGHOST weechat_color(weechat_config_string(irc_config_color_message_chghost)) #define IRC_COLOR_MESSAGE_QUIT weechat_color(weechat_config_string(irc_config_color_message_quit)) #define IRC_COLOR_REASON_QUIT weechat_color(weechat_config_string(irc_config_color_reason_quit)) #define IRC_COLOR_TOPIC_CURRENT weechat_color(weechat_config_string(irc_config_color_topic_current)) diff --git a/src/plugins/irc/irc-config.c b/src/plugins/irc/irc-config.c index 1b1c85a98..f6c61d41f 100644 --- a/src/plugins/irc/irc-config.c +++ b/src/plugins/irc/irc-config.c @@ -115,6 +115,7 @@ struct t_config_option *irc_config_color_item_lag_counting; struct t_config_option *irc_config_color_item_lag_finished; struct t_config_option *irc_config_color_item_nick_modes; struct t_config_option *irc_config_color_message_join; +struct t_config_option *irc_config_color_message_chghost; struct t_config_option *irc_config_color_message_quit; struct t_config_option *irc_config_color_mirc_remap; struct t_config_option *irc_config_color_nick_prefixes; @@ -3018,6 +3019,12 @@ irc_config_init () N_("color for text in join messages"), NULL, -1, 0, "green", NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + irc_config_color_message_chghost = weechat_config_new_option ( + irc_config_file, ptr_section, + "message_chghost", "color", + N_("color for text in chghost messages"), + NULL, -1, 0, "brown", NULL, 0, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); irc_config_color_message_quit = weechat_config_new_option ( irc_config_file, ptr_section, "message_quit", "color", diff --git a/src/plugins/irc/irc-config.h b/src/plugins/irc/irc-config.h index 5ebed8362..3982ee94f 100644 --- a/src/plugins/irc/irc-config.h +++ b/src/plugins/irc/irc-config.h @@ -152,6 +152,7 @@ extern struct t_config_option *irc_config_color_item_lag_counting; extern struct t_config_option *irc_config_color_item_lag_finished; extern struct t_config_option *irc_config_color_item_nick_modes; extern struct t_config_option *irc_config_color_message_join; +extern struct t_config_option *irc_config_color_message_chghost; extern struct t_config_option *irc_config_color_message_quit; extern struct t_config_option *irc_config_color_mirc_remap; extern struct t_config_option *irc_config_color_nick_prefixes; diff --git a/src/plugins/irc/irc-protocol.c b/src/plugins/irc/irc-protocol.c index 0c0b59fa1..8624ac373 100644 --- a/src/plugins/irc/irc-protocol.c +++ b/src/plugins/irc/irc-protocol.c @@ -651,26 +651,49 @@ IRC_PROTOCOL_CALLBACK(cap) IRC_PROTOCOL_CALLBACK(chghost) { int length; + char *str_host; struct t_irc_channel *ptr_channel; struct t_irc_nick *ptr_nick; IRC_PROTOCOL_MIN_ARGS(4); + length = strlen (argv[2]) + 1 + strlen (argv[3]) + 1; + str_host = malloc (length); + if (str_host) + snprintf (str_host, length, "%s@%s", argv[2], argv[3]); + for (ptr_channel = server->channels; ptr_channel; ptr_channel = ptr_channel->next_channel) { ptr_nick = irc_nick_search (server, ptr_channel, nick); if (ptr_nick) { + weechat_printf_date_tags ( + irc_msgbuffer_get_target_buffer ( + server, NULL, command, NULL, ptr_channel->buffer), + date, + irc_protocol_tags (command, NULL, nick, address), + _("%s%s%s%s (%s%s%s)%s has changed host to %s%s"), + weechat_prefix ("network"), + irc_nick_color_for_msg (server, 1, ptr_nick, nick), + nick, + IRC_COLOR_CHAT_DELIMITERS, + IRC_COLOR_CHAT_HOST, + address, + IRC_COLOR_CHAT_DELIMITERS, + IRC_COLOR_MESSAGE_CHGHOST, + IRC_COLOR_CHAT_HOST, + str_host); + if (ptr_nick->host) free (ptr_nick->host); - length = strlen (argv[2]) + 1 + strlen (argv[3]) + 1; - ptr_nick->host = malloc (length); - if (ptr_nick->host) - snprintf (ptr_nick->host, length, "%s@%s", argv[2], argv[3]); + ptr_nick->host = strdup (str_host); } } + if (str_host) + free (str_host); + return WEECHAT_RC_OK; } From 227537cbdb814719a6a6e37782ed9abb704f9cfc Mon Sep 17 00:00:00 2001 From: Simmo Saan Date: Thu, 7 Jan 2016 13:01:00 +0200 Subject: [PATCH 3/4] irc: add smart filtering for chghost messages --- src/plugins/irc/irc-channel.c | 8 ++++-- src/plugins/irc/irc-config.c | 8 ++++++ src/plugins/irc/irc-config.h | 1 + src/plugins/irc/irc-protocol.c | 51 ++++++++++++++++++++++------------ 4 files changed, 48 insertions(+), 20 deletions(-) diff --git a/src/plugins/irc/irc-channel.c b/src/plugins/irc/irc-channel.c index 80c182cf0..e34d3a0b8 100644 --- a/src/plugins/irc/irc-channel.c +++ b/src/plugins/irc/irc-channel.c @@ -1084,8 +1084,8 @@ void irc_channel_join_smart_filtered_unmask (struct t_irc_channel *channel, const char *nick) { - int i, unmask_delay, length_tags, nick_found, join, nick_changed; - int smart_filtered, remove_smart_filter; + int i, unmask_delay, length_tags, nick_found, join, chghost; + int nick_changed, smart_filtered, remove_smart_filter; time_t *ptr_time, date_min; struct t_hdata *hdata_line, *hdata_line_data; struct t_gui_line *own_lines; @@ -1174,6 +1174,8 @@ irc_channel_join_smart_filtered_unmask (struct t_irc_channel *channel, } else if (strcmp (tags[i], "irc_join") == 0) join = 1; + else if (strcmp (tags[i], "irc_chghost") == 0) + chghost = 1; else if (strcmp (tags[i], "irc_nick") == 0) nick_changed = 1; else if (strncmp (tags[i], "irc_nick1_", 10) == 0) @@ -1197,7 +1199,7 @@ irc_channel_join_smart_filtered_unmask (struct t_irc_channel *channel, break; remove_smart_filter = 1; } - else if (nick_found && join && smart_filtered) + else if (nick_found && (join || chghost) && smart_filtered) { remove_smart_filter = 1; } diff --git a/src/plugins/irc/irc-config.c b/src/plugins/irc/irc-config.c index f6c61d41f..c84fbc6a9 100644 --- a/src/plugins/irc/irc-config.c +++ b/src/plugins/irc/irc-config.c @@ -98,6 +98,7 @@ struct t_config_option *irc_config_look_pv_tags; struct t_config_option *irc_config_look_raw_messages; struct t_config_option *irc_config_look_server_buffer; struct t_config_option *irc_config_look_smart_filter; +struct t_config_option *irc_config_look_smart_filter_chghost; struct t_config_option *irc_config_look_smart_filter_delay; struct t_config_option *irc_config_look_smart_filter_join; struct t_config_option *irc_config_look_smart_filter_join_unmask; @@ -2892,6 +2893,13 @@ irc_config_init () "\"irc_smart_filter\")"), NULL, 0, 0, "on", NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + irc_config_look_smart_filter_chghost = weechat_config_new_option ( + irc_config_file, ptr_section, + "smart_filter_chghost", "boolean", + /* TRANSLATORS: please do not translate "chghost" */ + N_("enable smart filter for \"chghost\" messages"), + NULL, 0, 0, "on", NULL, 0, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); irc_config_look_smart_filter_delay = weechat_config_new_option ( irc_config_file, ptr_section, "smart_filter_delay", "integer", diff --git a/src/plugins/irc/irc-config.h b/src/plugins/irc/irc-config.h index 3982ee94f..1f8d6f32b 100644 --- a/src/plugins/irc/irc-config.h +++ b/src/plugins/irc/irc-config.h @@ -137,6 +137,7 @@ extern struct t_config_option *irc_config_look_pv_tags; extern struct t_config_option *irc_config_look_raw_messages; extern struct t_config_option *irc_config_look_server_buffer; extern struct t_config_option *irc_config_look_smart_filter; +extern struct t_config_option *irc_config_look_smart_filter_chghost; extern struct t_config_option *irc_config_look_smart_filter_delay; extern struct t_config_option *irc_config_look_smart_filter_join; extern struct t_config_option *irc_config_look_smart_filter_join_unmask; diff --git a/src/plugins/irc/irc-protocol.c b/src/plugins/irc/irc-protocol.c index 8624ac373..c1851fdc3 100644 --- a/src/plugins/irc/irc-protocol.c +++ b/src/plugins/irc/irc-protocol.c @@ -650,12 +650,16 @@ IRC_PROTOCOL_CALLBACK(cap) IRC_PROTOCOL_CALLBACK(chghost) { - int length; + int length, local_chghost, smart_filter; char *str_host; struct t_irc_channel *ptr_channel; struct t_irc_nick *ptr_nick; + struct t_irc_channel_speaking *ptr_nick_speaking; IRC_PROTOCOL_MIN_ARGS(4); + IRC_PROTOCOL_CHECK_HOST; + + local_chghost = (irc_server_strcasecmp (server, nick, server->nick) == 0); length = strlen (argv[2]) + 1 + strlen (argv[3]) + 1; str_host = malloc (length); @@ -668,22 +672,35 @@ IRC_PROTOCOL_CALLBACK(chghost) ptr_nick = irc_nick_search (server, ptr_channel, nick); if (ptr_nick) { - weechat_printf_date_tags ( - irc_msgbuffer_get_target_buffer ( - server, NULL, command, NULL, ptr_channel->buffer), - date, - irc_protocol_tags (command, NULL, nick, address), - _("%s%s%s%s (%s%s%s)%s has changed host to %s%s"), - weechat_prefix ("network"), - irc_nick_color_for_msg (server, 1, ptr_nick, nick), - nick, - IRC_COLOR_CHAT_DELIMITERS, - IRC_COLOR_CHAT_HOST, - address, - IRC_COLOR_CHAT_DELIMITERS, - IRC_COLOR_MESSAGE_CHGHOST, - IRC_COLOR_CHAT_HOST, - str_host); + if (!ignored) + { + ptr_nick_speaking = ((weechat_config_boolean (irc_config_look_smart_filter)) + && (weechat_config_boolean (irc_config_look_smart_filter_chghost))) ? + irc_channel_nick_speaking_time_search (server, ptr_channel, nick, 1) : NULL; + smart_filter = (!local_chghost + && weechat_config_boolean (irc_config_look_smart_filter) + && weechat_config_boolean (irc_config_look_smart_filter_chghost) + && !ptr_nick_speaking); + + weechat_printf_date_tags ( + irc_msgbuffer_get_target_buffer ( + server, NULL, command, NULL, ptr_channel->buffer), + date, + irc_protocol_tags (command, + smart_filter ? "irc_smart_filter" : NULL, + nick, address), + _("%s%s%s%s (%s%s%s)%s has changed host to %s%s"), + weechat_prefix ("network"), + irc_nick_color_for_msg (server, 1, ptr_nick, nick), + nick, + IRC_COLOR_CHAT_DELIMITERS, + IRC_COLOR_CHAT_HOST, + address, + IRC_COLOR_CHAT_DELIMITERS, + IRC_COLOR_MESSAGE_CHGHOST, + IRC_COLOR_CHAT_HOST, + str_host); + } if (ptr_nick->host) free (ptr_nick->host); From 8420abe8bbbbba71b80d777f5faac81b4efc1816 Mon Sep 17 00:00:00 2001 From: Simmo Saan Date: Sun, 5 Nov 2017 13:36:45 +0200 Subject: [PATCH 4/4] irc: add chghost capability to help and completion --- src/plugins/irc/irc-command.c | 2 +- src/plugins/irc/irc-command.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/irc/irc-command.c b/src/plugins/irc/irc-command.c index b8c43fef8..2b96d2550 100644 --- a/src/plugins/irc/irc-command.c +++ b/src/plugins/irc/irc-command.c @@ -6300,7 +6300,7 @@ irc_command_init () "Without argument, \"ls\" and \"list\" are sent.\n" "\n" "Capabilities supported by WeeChat are: " - "account-notify, away-notify, cap-notify, extended-join, " + "account-notify, away-notify, cap-notify, chghost, extended-join, " "multi-prefix, server-time, userhost-in-names.\n" "\n" "The capabilities to automatically enable on servers can be set " diff --git a/src/plugins/irc/irc-command.h b/src/plugins/irc/irc-command.h index 4fdcf862f..b3b2a7e6f 100644 --- a/src/plugins/irc/irc-command.h +++ b/src/plugins/irc/irc-command.h @@ -51,7 +51,7 @@ struct t_irc_channel; /* list of supported capabilities (for completion in command /cap) */ #define IRC_COMMAND_CAP_SUPPORTED_COMPLETION \ - "account-notify|away-notify|cap-notify|extended-join|" \ + "account-notify|away-notify|cap-notify|chghost|extended-join|" \ "multi-prefix|server-time|userhost-in-names|%*" /* list of supported CTCPs (for completion in command /ctcp) */