From 88853df080e4c3eb8607514d084020934c18f2ec Mon Sep 17 00:00:00 2001 From: Sebastien Helleu Date: Mon, 29 Mar 2010 12:25:28 +0200 Subject: [PATCH] Fix check of IRC ignore when channel is specified in ignore (problem with PRIVMSG queries) --- src/plugins/irc/irc-ignore.c | 14 +++++++++++--- src/plugins/irc/irc-ignore.h | 4 ++-- src/plugins/irc/irc-protocol.c | 9 ++++++--- src/plugins/irc/irc-server.c | 13 +++++++++---- 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/plugins/irc/irc-ignore.c b/src/plugins/irc/irc-ignore.c index d30032826..46bbcbe9e 100644 --- a/src/plugins/irc/irc-ignore.c +++ b/src/plugins/irc/irc-ignore.c @@ -182,7 +182,7 @@ irc_ignore_new (const char *mask, const char *server, const char *channel) */ int -irc_ignore_check (struct t_irc_server *server, struct t_irc_channel *channel, +irc_ignore_check (struct t_irc_server *server, const char *channel, const char *nick, const char *host) { struct t_irc_ignore *ptr_ignore; @@ -215,8 +215,16 @@ irc_ignore_check (struct t_irc_server *server, struct t_irc_channel *channel, channel_match = 1; else { - channel_match = (weechat_strcasecmp (ptr_ignore->channel, - channel->name) == 0); + if (irc_channel_is_channel (channel)) + { + channel_match = (weechat_strcasecmp (ptr_ignore->channel, + channel) == 0); + } + else if (nick) + { + channel_match = (weechat_strcasecmp (ptr_ignore->channel, + nick) == 0); + } } if (server_match && channel_match) diff --git a/src/plugins/irc/irc-ignore.h b/src/plugins/irc/irc-ignore.h index db8370b1c..db6c96d47 100644 --- a/src/plugins/irc/irc-ignore.h +++ b/src/plugins/irc/irc-ignore.h @@ -47,8 +47,8 @@ extern struct t_irc_ignore *irc_ignore_new (const char *mask, const char *server, const char *channel); extern int irc_ignore_check (struct t_irc_server *server, - struct t_irc_channel *channel, - const char *nick, const char *host); + const char *channel, const char *nick, + const char *host); extern void irc_ignore_free (struct t_irc_ignore *ignore); extern void irc_ignore_free_all (); extern int irc_ignore_add_to_infolist (struct t_infolist *infolist, diff --git a/src/plugins/irc/irc-protocol.c b/src/plugins/irc/irc-protocol.c index 5c3120bbb..929e65e0d 100644 --- a/src/plugins/irc/irc-protocol.c +++ b/src/plugins/irc/irc-protocol.c @@ -934,7 +934,8 @@ IRC_PROTOCOL_CALLBACK(nick) } else { - if (!irc_ignore_check (server, ptr_channel, nick, host)) + if (!irc_ignore_check (server, ptr_channel->name, + nick, host)) { weechat_printf_tags (ptr_channel->buffer, irc_protocol_tags (command, NULL), @@ -1489,7 +1490,7 @@ IRC_PROTOCOL_CALLBACK(quit) if (ptr_nick || (weechat_strcasecmp (ptr_channel->name, nick) == 0)) { /* display quit message */ - if (!irc_ignore_check (server, ptr_channel, nick, host)) + if (!irc_ignore_check (server, ptr_channel->name, nick, host)) { local_quit = (strcmp (nick, server->nick) == 0); ptr_nick_speaking = NULL; @@ -3977,7 +3978,9 @@ irc_protocol_recv_command (struct t_irc_server *server, ptr_channel = NULL; if (msg_channel) ptr_channel = irc_channel_search (server, msg_channel); - message_ignored = irc_ignore_check (server, ptr_channel, nick, host); + message_ignored = irc_ignore_check (server, + (ptr_channel) ? ptr_channel->name : msg_channel, + nick, host); /* send signal with received command, even if command is ignored */ irc_server_send_signal (server, "irc_raw_in", msg_command, irc_message); diff --git a/src/plugins/irc/irc-server.c b/src/plugins/irc/irc-server.c index de3101177..4d269fc89 100644 --- a/src/plugins/irc/irc-server.c +++ b/src/plugins/irc/irc-server.c @@ -1082,7 +1082,7 @@ void irc_server_parse_message (const char *message, char **nick, char **host, char **command, char **channel, char **arguments) { - const char *pos, *pos2, *pos3, *pos4; + const char *pos, *pos2, *pos3, *pos4, *pos5; if (nick) *nick = NULL; @@ -1170,6 +1170,7 @@ irc_server_parse_message (const char *message, char **nick, char **host, } if (pos3) { + pos4 = pos3; pos3++; while (pos3[0] == ' ') { @@ -1177,15 +1178,19 @@ irc_server_parse_message (const char *message, char **nick, char **host, } if (irc_channel_is_channel (pos3)) { - pos4 = strchr (pos3, ' '); + pos5 = strchr (pos3, ' '); if (channel) { - if (pos4) - *channel = weechat_strndup (pos3, pos4 - pos3); + if (pos5) + *channel = weechat_strndup (pos3, pos5 - pos3); else *channel = strdup (pos3); } } + else if (channel && !*channel) + { + *channel = weechat_strndup (pos2, pos4 - pos2); + } } } }