summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastien Helleu <flashcode@flashtux.org>2009-02-23 11:01:11 +0100
committerSebastien Helleu <flashcode@flashtux.org>2009-02-23 11:01:11 +0100
commit70cfce2d2c728842a43f1a2777a08571885b8001 (patch)
treea07f4f3d0a4f75fbb27974251c3642857a5cbf29
parent351a27c8be8603d30092d59e5b1c5b28f1648f72 (diff)
downloadweechat-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.c24
-rw-r--r--src/plugins/irc/irc-mode.h6
-rw-r--r--src/plugins/irc/irc-protocol.c4
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))