summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/irc/irc-channel.c8
-rw-r--r--src/plugins/irc/irc-config.c8
-rw-r--r--src/plugins/irc/irc-config.h1
-rw-r--r--src/plugins/irc/irc-protocol.c51
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);