diff options
author | Sebastien Helleu <flashcode@flashtux.org> | 2009-02-23 11:01:11 +0100 |
---|---|---|
committer | Sebastien Helleu <flashcode@flashtux.org> | 2009-02-23 11:01:11 +0100 |
commit | 70cfce2d2c728842a43f1a2777a08571885b8001 (patch) | |
tree | a07f4f3d0a4f75fbb27974251c3642857a5cbf29 | |
parent | 351a27c8be8603d30092d59e5b1c5b28f1648f72 (diff) | |
download | weechat-70cfce2d2c728842a43f1a2777a08571885b8001.zip |
Fix irc excess flood caused by mode command sent when a mode is received: send mode only when channel modes are updated (bug #25651)
-rw-r--r-- | src/plugins/irc/irc-mode.c | 24 | ||||
-rw-r--r-- | src/plugins/irc/irc-mode.h | 6 | ||||
-rw-r--r-- | src/plugins/irc/irc-protocol.c | 4 |
3 files changed, 23 insertions, 11 deletions
diff --git a/src/plugins/irc/irc-mode.c b/src/plugins/irc/irc-mode.c index e7c513977..a8e39a911 100644 --- a/src/plugins/irc/irc-mode.c +++ b/src/plugins/irc/irc-mode.c @@ -72,17 +72,22 @@ irc_mode_channel_get_flag (const char *string, const char *pos) /* * irc_mode_channel_set: set channel modes + * return: 1 if channel modes are updated + * 0 if channel modes are NOT updated + * (no update or on nicks only) */ -void +int irc_mode_channel_set (struct t_irc_server *server, struct t_irc_channel *channel, const char *modes) { char *pos_args, *str_modes, set_flag, **argv, *pos, *ptr_arg; - int argc, current_arg; + int channel_modes_updated, argc, current_arg; if (!server || !channel || !modes) - return; + return 0; + + channel_modes_updated = 0; argc = 0; argv = NULL; @@ -92,7 +97,7 @@ irc_mode_channel_set (struct t_irc_server *server, { str_modes = weechat_strndup (modes, pos_args - modes); if (!str_modes) - return; + return 0; pos_args++; while (pos_args[0] == ' ') pos_args++; @@ -104,7 +109,7 @@ irc_mode_channel_set (struct t_irc_server *server, { str_modes = strdup (modes); if (!str_modes) - return; + return 0; } if (str_modes && str_modes[0]) @@ -155,6 +160,7 @@ irc_mode_channel_set (struct t_irc_server *server, if (ptr_arg) channel->key = strdup (ptr_arg); } + channel_modes_updated = 1; break; case 'l': /* channel limit */ if (set_flag == '-') @@ -166,6 +172,7 @@ irc_mode_channel_set (struct t_irc_server *server, if (ptr_arg) channel->limit = atoi (ptr_arg); } + channel_modes_updated = 1; break; case 'o': /* op */ ptr_arg = ((argc > 0) && (current_arg >= 0)) ? @@ -195,19 +202,24 @@ irc_mode_channel_set (struct t_irc_server *server, irc_mode_channel_set_nick (channel, ptr_arg, set_flag, IRC_NICK_VOICE); break; + default: + channel_modes_updated = 1; + break; } break; } pos--; } } - + if (str_modes) free (str_modes); if (argv) weechat_string_free_exploded (argv); weechat_bar_item_update ("buffer_name"); + + return channel_modes_updated; } /* diff --git a/src/plugins/irc/irc-mode.h b/src/plugins/irc/irc-mode.h index 26e97479a..1eab8b868 100644 --- a/src/plugins/irc/irc-mode.h +++ b/src/plugins/irc/irc-mode.h @@ -23,9 +23,9 @@ struct t_irc_server; struct t_irc_channel; -extern void irc_mode_channel_set (struct t_irc_server *server, - struct t_irc_channel *channel, - const char *modes); +extern int irc_mode_channel_set (struct t_irc_server *server, + struct t_irc_channel *channel, + const char *modes); extern void irc_mode_user_set (struct t_irc_server *server, const char *modes); extern int irc_mode_nick_prefix_allowed (struct t_irc_server *server, char prefix); diff --git a/src/plugins/irc/irc-protocol.c b/src/plugins/irc/irc-protocol.c index 909cfa42c..1fd892477 100644 --- a/src/plugins/irc/irc-protocol.c +++ b/src/plugins/irc/irc-protocol.c @@ -576,8 +576,8 @@ irc_protocol_cmd_mode (struct t_irc_server *server, const char *command, ptr_channel = irc_channel_search (server, argv[2]); if (ptr_channel) { - irc_mode_channel_set (server, ptr_channel, pos_modes); - irc_server_sendf (server, "MODE %s", ptr_channel->name); + if (irc_mode_channel_set (server, ptr_channel, pos_modes)) + irc_server_sendf (server, "MODE %s", ptr_channel->name); } ptr_nick = irc_nick_search (ptr_channel, nick); if (!irc_ignore_check (server, ptr_channel, nick, host)) |