1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-30 14:56:39 +02:00

irc: add server option "anti_flood", remove server options "anti_flood_prio_{high|low}" (issue #1039)

The new option is set in milliseconds.
This commit is contained in:
Sébastien Helleu
2023-11-27 21:01:27 +01:00
parent e51152e6a4
commit f7b7e3975a
8 changed files with 318 additions and 269 deletions
+1
View File
@@ -27,6 +27,7 @@ New features::
* core: add number of processes in command `/sys waitpid`
* core, alias, trigger: allow wildcard in commands `/bar`, `/item`, `/proxy`, `/alias` and `/trigger` (issue #1956)
* buflist: jump to previous/next buffer displayed in buflist item with ctrl+wheel up/down on a buflist item (issue #1473)
* irc: add server option "anti_flood" (now in milliseconds), remove server options "anti_flood_prio_{high|low}" (issue #1039)
* irc: add option irc.look.list_buffer
* irc: change default value of server option "tls_priorities" to `NORMAL`
* irc: add support of RGB colors in messages, add option irc.color.term_remap (issue #2025)
+27
View File
@@ -14,6 +14,33 @@ For a complete list of changes, please look at ChangeLog.
[[v4.2.0]]
== Version 4.2.0 (under dev)
[[v4.2.0_irc_anti_flood]]
=== IRC anti-flood
The anti-flood mechanism in IRC plugin has been improved and is now configured
in milliseconds instead of seconds. +
It is done with a single option `irc.server_default.anti_flood` (and same option
in servers), which replaces both options `anti_flood_prio_high` and
`anti_flood_prio_low`.
The default value is 2000 (2 seconds), and for example if you want to set
a delay of 0.5 seconds between your messages sent:
----
/set irc.server_default.anti_flood 500
----
When upgrading from an old WeeChat version, you'll see such messages, which are
perfectly normal (they're displayed to warn you about unknown options, and then
you have to set the new option if needed):
----
=!= | Warning: /home/user/.config/weechat/irc.conf, line 131: ignoring unknown option for section "server_default": anti_flood_prio_high = 2
=!= | Warning: /home/user/.config/weechat/irc.conf, line 132: ignoring unknown option for section "server_default": anti_flood_prio_low = 2
=!= | Warning: /home/user/.config/weechat/irc.conf, line 212: ignoring invalid value for option in section "server": libera.anti_flood_prio_high
=!= | Warning: //home/user/.config/weechat/irc.conf, line 213: ignoring invalid value for option in section "server": libera.anti_flood_prio_low
----
[[v4.2.0_search_commands_history]]
=== Search in commands history
+14 -21
View File
@@ -2366,11 +2366,13 @@ irc_command_quit_server (struct t_irc_server *server, const char *arguments)
if (ptr_arg && ptr_arg[0])
{
msg = irc_server_get_default_msg (ptr_arg, server, NULL, NULL);
irc_server_sendf (server, 0, NULL, "QUIT :%s", msg);
irc_server_sendf (server, IRC_SERVER_SEND_OUTQ_PRIO_IMMEDIATE, NULL,
"QUIT :%s", msg);
}
else
{
irc_server_sendf (server, 0, NULL, "QUIT");
irc_server_sendf (server, IRC_SERVER_SEND_OUTQ_PRIO_IMMEDIATE, NULL,
"QUIT");
}
if (msg)
@@ -5495,26 +5497,16 @@ irc_command_display_server (struct t_irc_server *server, int with_detail)
IRC_COLOR_CHAT_VALUE,
weechat_config_integer (server->options[IRC_SERVER_OPTION_CONNECTION_TIMEOUT]),
NG_("second", "seconds", weechat_config_integer (server->options[IRC_SERVER_OPTION_CONNECTION_TIMEOUT])));
/* anti_flood_prio_high */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_HIGH]))
weechat_printf (NULL, " anti_flood_prio_high : (%d %s)",
IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_HIGH),
NG_("second", "seconds", IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_HIGH)));
/* anti_flood */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_ANTI_FLOOD]))
weechat_printf (NULL, " anti_flood . . . . . : (%d %s)",
IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_ANTI_FLOOD),
NG_("second", "seconds", IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_ANTI_FLOOD)));
else
weechat_printf (NULL, " anti_flood_prio_high : %s%d %s",
weechat_printf (NULL, " anti_flood . . . . . : %s%d %s",
IRC_COLOR_CHAT_VALUE,
weechat_config_integer (server->options[IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_HIGH]),
NG_("second", "seconds", weechat_config_integer (server->options[IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_HIGH])));
/* anti_flood_prio_low */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_LOW]))
weechat_printf (NULL, " anti_flood_prio_low. : (%d %s)",
IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_LOW),
NG_("second", "seconds", IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_LOW)));
else
weechat_printf (NULL, " anti_flood_prio_low. : %s%d %s",
IRC_COLOR_CHAT_VALUE,
weechat_config_integer (server->options[IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_LOW]),
NG_("second", "seconds", weechat_config_integer (server->options[IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_LOW])));
weechat_config_integer (server->options[IRC_SERVER_OPTION_ANTI_FLOOD]),
NG_("second", "seconds", weechat_config_integer (server->options[IRC_SERVER_OPTION_ANTI_FLOOD])));
/* away_check */
if (weechat_config_option_is_null (server->options[IRC_SERVER_OPTION_AWAY_CHECK]))
weechat_printf (NULL, " away_check . . . . . : (%d %s)",
@@ -6176,7 +6168,8 @@ IRC_COMMAND_CALLBACK(squit)
WEECHAT_COMMAND_MIN_ARGS(2, "");
irc_server_sendf (ptr_server, 0, NULL, "SQUIT %s", argv_eol[1]);
irc_server_sendf (ptr_server, IRC_SERVER_SEND_OUTQ_PRIO_IMMEDIATE, NULL,
"SQUIT %s", argv_eol[1]);
return WEECHAT_RC_OK;
}
+32 -29
View File
@@ -179,12 +179,7 @@ struct t_config_option *irc_config_network_whois_double_nick = NULL;
/* IRC config, server section */
struct t_config_option *irc_config_server_default[IRC_SERVER_NUM_OPTIONS] = {
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
};
struct t_config_option *irc_config_server_default[IRC_SERVER_NUM_OPTIONS];
struct t_hook *irc_config_hook_config_nick_color_options = NULL;
struct t_hook *irc_config_hook_config_chat_nick_colors = NULL;
struct t_hashtable *irc_config_hashtable_display_join_message = NULL;
@@ -1102,6 +1097,13 @@ irc_config_server_default_change_cb (const void *pointer, void *data,
irc_server_set_nicks (ptr_server,
weechat_config_string (option));
break;
case IRC_SERVER_OPTION_ANTI_FLOOD:
if (ptr_server->hook_timer_anti_flood)
{
irc_server_outqueue_timer_remove (ptr_server);
irc_server_outqueue_timer_add (ptr_server);
}
break;
case IRC_SERVER_OPTION_AWAY_CHECK:
case IRC_SERVER_OPTION_AWAY_CHECK_MAX_NICKS:
if (IRC_SERVER_OPTION_INTEGER(
@@ -1401,6 +1403,13 @@ irc_config_server_change_cb (const void *pointer, void *data,
IRC_SERVER_OPTION_STRING(ptr_server,
IRC_SERVER_OPTION_NICKS));
break;
case IRC_SERVER_OPTION_ANTI_FLOOD:
if (ptr_server->hook_timer_anti_flood)
{
irc_server_outqueue_timer_remove (ptr_server);
irc_server_outqueue_timer_add (ptr_server);
}
break;
case IRC_SERVER_OPTION_AWAY_CHECK:
case IRC_SERVER_OPTION_AWAY_CHECK_MAX_NICKS:
if (IRC_SERVER_OPTION_INTEGER(ptr_server, IRC_SERVER_OPTION_AWAY_CHECK) > 0)
@@ -2503,32 +2512,19 @@ irc_config_server_new_option (struct t_config_file *config_file,
callback_change_data,
NULL, NULL, NULL);
break;
case IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_HIGH:
case IRC_SERVER_OPTION_ANTI_FLOOD:
new_option = weechat_config_new_option (
config_file, section,
option_name, "integer",
N_("anti-flood for high priority queue: number of seconds "
"between two user messages or commands sent to IRC server "
"(0 = no anti-flood)"),
NULL, 0, 60,
default_value, value,
null_value_allowed,
callback_check_value,
callback_check_value_pointer,
callback_check_value_data,
callback_change,
callback_change_pointer,
callback_change_data,
NULL, NULL, NULL);
break;
case IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_LOW:
new_option = weechat_config_new_option (
config_file, section,
option_name, "integer",
N_("anti-flood for low priority queue: number of seconds "
"between two messages sent to IRC server (messages like "
"automatic CTCP replies) (0 = no anti-flood)"),
NULL, 0, 60,
N_("delay in milliseconds between two messages sent to server "
"(anti-flood); 0 = disable anti-flood and always send "
"all messages immediately (not recommended as you can be "
"quickly killed by the server); "
"internally there are queues with different priorities: "
"when connecting to the server all messages are sent "
"immediately and your messages have higher priority than "
"some automatic messages that are sent in background"),
NULL, 0, 60000,
default_value, value,
null_value_allowed,
callback_check_value,
@@ -3010,6 +3006,8 @@ irc_config_update_cb (const void *pointer, void *data,
int
irc_config_init ()
{
int i;
irc_config_hashtable_display_join_message = weechat_hashtable_new (
32,
WEECHAT_HASHTABLE_STRING,
@@ -3031,6 +3029,11 @@ irc_config_init ()
WEECHAT_HASHTABLE_STRING,
NULL, NULL);
for (i = 0; i < IRC_SERVER_NUM_OPTIONS; i++)
{
irc_config_server_default[i] = NULL;
}
irc_config_file = weechat_config_new (IRC_CONFIG_PRIO_NAME,
&irc_config_reload, NULL, NULL);
if (!irc_config_file)
+5 -4
View File
@@ -2965,7 +2965,8 @@ IRC_PROTOCOL_CALLBACK(ping)
str_params = irc_protocol_string_params (ctxt->params, 0, ctxt->num_params - 1);
irc_server_sendf (ctxt->server, 0, NULL, "PONG :%s", str_params);
irc_server_sendf (ctxt->server, IRC_SERVER_SEND_OUTQ_PRIO_IMMEDIATE, NULL,
"PONG :%s", str_params);
if (str_params)
free (str_params);
@@ -7060,7 +7061,7 @@ IRC_PROTOCOL_CALLBACK(432)
irc_server_set_nick (ctxt->server, alternate_nick);
irc_server_sendf (
ctxt->server, 0, NULL,
ctxt->server, IRC_SERVER_SEND_OUTQ_PRIO_IMMEDIATE, NULL,
"NICK %s%s",
(ctxt->server->nick && strchr (ctxt->server->nick, ':')) ? ":" : "",
ctxt->server->nick);
@@ -7111,7 +7112,7 @@ IRC_PROTOCOL_CALLBACK(433)
irc_server_set_nick (ctxt->server, alternate_nick);
irc_server_sendf (
ctxt->server, 0, NULL,
ctxt->server, IRC_SERVER_SEND_OUTQ_PRIO_IMMEDIATE, NULL,
"NICK %s%s",
(ctxt->server->nick && strchr (ctxt->server->nick, ':')) ? ":" : "",
ctxt->server->nick);
@@ -7168,7 +7169,7 @@ IRC_PROTOCOL_CALLBACK(437)
irc_server_set_nick (ctxt->server, alternate_nick);
irc_server_sendf (
ctxt->server, 0, NULL,
ctxt->server, IRC_SERVER_SEND_OUTQ_PRIO_IMMEDIATE, NULL,
"NICK %s%s",
(ctxt->server->nick && strchr (ctxt->server->nick, ':')) ? ":" : "",
ctxt->server->nick);
+235 -211
View File
@@ -116,8 +116,7 @@ char *irc_server_options[IRC_SERVER_NUM_OPTIONS][2] =
{ "autorejoin", "off" },
{ "autorejoin_delay", "30" },
{ "connection_timeout", "60" },
{ "anti_flood_prio_high", "2" },
{ "anti_flood_prio_low", "2" },
{ "anti_flood", "2000" },
{ "away_check", "0" },
{ "away_check_max_nicks", "25" },
{ "msg_kick", "" },
@@ -153,6 +152,7 @@ int irc_fingerprint_digest_algos_size[IRC_FINGERPRINT_NUM_ALGOS] =
{ 160, 256, 512 };
void irc_server_outqueue_send (struct t_irc_server *server);
void irc_server_reconnect (struct t_irc_server *server);
void irc_server_free_data (struct t_irc_server *server);
void irc_server_autojoin_create_buffers (struct t_irc_server *server);
@@ -1697,6 +1697,7 @@ irc_server_alloc (const char *name)
new_server->hook_fd = NULL;
new_server->hook_timer_connection = NULL;
new_server->hook_timer_sasl = NULL;
new_server->hook_timer_anti_flood = NULL;
new_server->sasl_scram_client_first = NULL;
new_server->sasl_scram_salted_pwd = NULL;
new_server->sasl_scram_salted_pwd_size = 0;
@@ -1768,7 +1769,6 @@ irc_server_alloc (const char *name)
new_server->lag_last_refresh = 0;
new_server->cmd_list_regexp = NULL;
new_server->list = irc_list_alloc (new_server);
new_server->last_user_message = 0;
new_server->last_away_check = 0;
new_server->last_data_purge = 0;
for (i = 0; i < IRC_SERVER_NUM_OUTQUEUES_PRIO; i++)
@@ -2323,6 +2323,8 @@ irc_server_free_data (struct t_irc_server *server)
weechat_unhook (server->hook_timer_connection);
if (server->hook_timer_sasl)
weechat_unhook (server->hook_timer_sasl);
if (server->hook_timer_anti_flood)
weechat_unhook (server->hook_timer_anti_flood);
irc_server_free_sasl_data (server);
if (server->unterminated_message)
free (server->unterminated_message);
@@ -2798,101 +2800,188 @@ irc_server_get_tags_to_send (const char *tags)
}
/*
* Sends a message from out queue.
* Checks if all out queues are empty.
*
* Returns:
* 1: all out queues are empty
* 0: at least one out queue contains a message
*/
int
irc_server_outqueue_all_empty (struct t_irc_server *server)
{
int priority;
for (priority = 0; priority < IRC_SERVER_NUM_OUTQUEUES_PRIO; priority++)
{
if (server->outqueue[priority])
return 0;
}
return 1;
}
/*
* Timer called to send out queue (anti-flood).
*/
int
irc_server_outqueue_timer_cb (const void *pointer, void *data, int remaining_calls)
{
struct t_irc_server *server;
/* make C compiler happy */
(void) data;
(void) remaining_calls;
server = (struct t_irc_server *)pointer;
irc_server_outqueue_send (server);
return WEECHAT_RC_OK;
}
/*
* Removes anti-flood timer form a server (if set).
*/
void
irc_server_outqueue_timer_remove (struct t_irc_server *server)
{
if (!server)
return;
if (server->hook_timer_anti_flood)
{
weechat_unhook (server->hook_timer_anti_flood);
server->hook_timer_anti_flood = NULL;
}
}
/*
* Adds anti-flood timer in a server (removes it first if already set).
*/
void
irc_server_outqueue_timer_add (struct t_irc_server *server)
{
if (!server)
return;
if (server->hook_timer_anti_flood)
irc_server_outqueue_timer_remove (server);
server->hook_timer_anti_flood = weechat_hook_timer (
IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_ANTI_FLOOD),
0, 0,
&irc_server_outqueue_timer_cb,
server, NULL);
}
/*
* Sends one message from out queue.
*/
void
irc_server_outqueue_send_one_msg (struct t_irc_server *server,
struct t_irc_outqueue *message)
{
char *pos, *tags_to_send;
if (!server || !message)
return;
if (message->message_before_mod)
{
pos = strchr (message->message_before_mod, '\r');
if (pos)
pos[0] = '\0';
irc_raw_print (server, IRC_RAW_FLAG_SEND, message->message_before_mod);
if (pos)
pos[0] = '\r';
}
if (message->message_after_mod)
{
pos = strchr (message->message_after_mod, '\r');
if (pos)
pos[0] = '\0';
irc_raw_print (
server,
IRC_RAW_FLAG_SEND | ((message->modified) ? IRC_RAW_FLAG_MODIFIED : 0),
message->message_after_mod);
/* send signal with command that will be sent to server */
(void) irc_server_send_signal (
server,
"irc_out",
message->command,
message->message_after_mod,
NULL);
tags_to_send = irc_server_get_tags_to_send (message->tags);
(void) irc_server_send_signal (
server,
"irc_outtags",
message->command,
message->message_after_mod,
(tags_to_send) ? tags_to_send : "");
if (tags_to_send)
free (tags_to_send);
if (pos)
pos[0] = '\r';
/* send command */
irc_server_send (server,
message->message_after_mod,
strlen (message->message_after_mod));
/* start redirection if redirect is set */
if (message->redirect)
{
irc_redirect_init_command (message->redirect,
message->message_after_mod);
}
}
}
/*
* Sends one or multiple message from out queues, by order of priority
* (immediate/high/low), then from oldest message to newest in queue.
*/
void
irc_server_outqueue_send (struct t_irc_server *server)
{
time_t time_now;
char *pos, *tags_to_send;
int priority, anti_flood;
time_now = time (NULL);
if (irc_server_outqueue_all_empty (server))
{
irc_server_outqueue_timer_remove (server);
return;
}
/* detect if system clock has been changed (now lower than before) */
if (server->last_user_message > time_now)
server->last_user_message = time_now;
anti_flood = IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_ANTI_FLOOD);
for (priority = 0; priority < IRC_SERVER_NUM_OUTQUEUES_PRIO; priority++)
{
switch (priority)
{
case 0: /* immediate send */
anti_flood = 0;
break;
case 1: /* high priority */
anti_flood = IRC_SERVER_OPTION_INTEGER(
server, IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_HIGH);
break;
default: /* low priority */
anti_flood = IRC_SERVER_OPTION_INTEGER(
server, IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_LOW);
break;
}
if (server->outqueue[priority]
&& (time_now >= server->last_user_message + anti_flood))
{
if (server->outqueue[priority]->message_before_mod)
{
pos = strchr (server->outqueue[priority]->message_before_mod,
'\r');
if (pos)
pos[0] = '\0';
irc_raw_print (server, IRC_RAW_FLAG_SEND,
server->outqueue[priority]->message_before_mod);
if (pos)
pos[0] = '\r';
}
if (server->outqueue[priority]->message_after_mod)
{
pos = strchr (server->outqueue[priority]->message_after_mod,
'\r');
if (pos)
pos[0] = '\0';
if (!server->outqueue[priority])
continue;
irc_raw_print (server, IRC_RAW_FLAG_SEND |
((server->outqueue[priority]->modified) ? IRC_RAW_FLAG_MODIFIED : 0),
server->outqueue[priority]->message_after_mod);
irc_server_outqueue_send_one_msg (server, server->outqueue[priority]);
irc_server_outqueue_free (server, priority, server->outqueue[priority]);
/* send signal with command that will be sent to server */
(void) irc_server_send_signal (
server, "irc_out",
server->outqueue[priority]->command,
server->outqueue[priority]->message_after_mod,
NULL);
tags_to_send = irc_server_get_tags_to_send (
server->outqueue[priority]->tags);
(void) irc_server_send_signal (
server, "irc_outtags",
server->outqueue[priority]->command,
server->outqueue[priority]->message_after_mod,
(tags_to_send) ? tags_to_send : "");
if (tags_to_send)
free (tags_to_send);
if (pos)
pos[0] = '\r';
/* send command */
irc_server_send (
server, server->outqueue[priority]->message_after_mod,
strlen (server->outqueue[priority]->message_after_mod));
server->last_user_message = time_now;
/* start redirection if redirect is set */
if (server->outqueue[priority]->redirect)
{
irc_redirect_init_command (
server->outqueue[priority]->redirect,
server->outqueue[priority]->message_after_mod);
}
}
irc_server_outqueue_free (server, priority,
server->outqueue[priority]);
/*
* continue to send for immediate priority (= 0),
* exit loop now for high/low priorities (> 0) if anti flood is enabled
*/
if ((priority > 0) && (anti_flood > 0))
break;
}
}
/* schedule next send if anti-flood is enabled */
if ((anti_flood > 0) && !server->hook_timer_anti_flood)
irc_server_outqueue_timer_add (server);
}
/*
@@ -2903,13 +2992,9 @@ irc_server_outqueue_send (struct t_irc_server *server)
* queue_msg is priority:
* 1 = higher priority, for user messages
* 2 = lower priority, for other messages (like auto reply to CTCP queries)
*
* Returns:
* 1: OK
* 0: error
*/
int
void
irc_server_send_one_msg (struct t_irc_server *server, int flags,
const char *message, const char *nick,
const char *command, const char *channel,
@@ -2919,13 +3004,9 @@ irc_server_send_one_msg (struct t_irc_server *server, int flags,
const char *ptr_msg, *ptr_chan_nick;
char *new_msg, *pos, *tags_to_send, *msg_encoded;
char str_modifier[128], modifier_data[1024];
int rc, queue_msg, add_to_queue, first_message, anti_flood;
int pos_channel, pos_text, pos_encode;
time_t time_now;
int first_message, queue_msg, pos_channel, pos_text, pos_encode;
struct t_irc_redirect *ptr_redirect;
rc = 1;
/* run modifier "irc_out_xxx" */
snprintf (str_modifier, sizeof (str_modifier),
"irc_out_%s",
@@ -3017,7 +3098,7 @@ irc_server_send_one_msg (struct t_irc_server *server, int flags,
if (msg_encoded)
ptr_msg = msg_encoded;
while (rc && ptr_msg && ptr_msg[0])
while (ptr_msg && ptr_msg[0])
{
pos = strchr (ptr_msg, '\n');
if (pos)
@@ -3025,101 +3106,41 @@ irc_server_send_one_msg (struct t_irc_server *server, int flags,
snprintf (buffer, sizeof (buffer), "%s\r\n", ptr_msg);
/* anti-flood: look whether we should queue outgoing message or not */
time_now = time (NULL);
/* detect if system clock has been changed (now lower than before) */
if (server->last_user_message > time_now)
server->last_user_message = time_now;
/* get queue from flags */
queue_msg = 0;
if (flags & IRC_SERVER_SEND_OUTQ_PRIO_IMMEDIATE)
queue_msg = 1;
queue_msg = 0;
else if (flags & IRC_SERVER_SEND_OUTQ_PRIO_HIGH)
queue_msg = 2;
queue_msg = 1;
else if (flags & IRC_SERVER_SEND_OUTQ_PRIO_LOW)
queue_msg = 3;
switch (queue_msg - 1)
queue_msg = 2;
else
{
case 0:
anti_flood = 0;
break;
case 1:
anti_flood = IRC_SERVER_OPTION_INTEGER(
server, IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_HIGH);
break;
default:
anti_flood = IRC_SERVER_OPTION_INTEGER(
server, IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_LOW);
break;
}
add_to_queue = 0;
if ((queue_msg > 0)
&& (server->outqueue[queue_msg - 1]
|| ((anti_flood > 0)
&& (time_now - server->last_user_message < anti_flood))))
{
add_to_queue = queue_msg;
/*
* if connected to server (message 001 received), consider
* it's low priority (otherwise send immediately)
*/
queue_msg = (server->is_connected) ? 2 : 0;
}
tags_to_send = irc_server_get_tags_to_send (tags);
ptr_redirect = irc_redirect_search_available (server);
if (add_to_queue > 0)
{
/* queue message (do not send anything now) */
irc_server_outqueue_add (server, add_to_queue - 1, command,
(new_msg && first_message) ? message : NULL,
buffer,
(new_msg) ? 1 : 0,
tags_to_send,
ptr_redirect);
/* mark redirect as "used" */
if (ptr_redirect)
ptr_redirect->assigned_to_command = 1;
}
else
{
if (first_message)
{
irc_raw_print (server, IRC_RAW_FLAG_SEND, message);
}
if (new_msg)
{
irc_raw_print (server,
IRC_RAW_FLAG_SEND | IRC_RAW_FLAG_MODIFIED,
ptr_msg);
}
/* queue message (do not send anything now) */
irc_server_outqueue_add (server,
queue_msg,
command,
(new_msg && first_message) ? message : NULL,
buffer,
(new_msg) ? 1 : 0,
tags_to_send,
ptr_redirect);
/* send signal with command that will be sent to server */
(void) irc_server_send_signal (
server, "irc_out",
(command) ? command : "unknown",
ptr_msg,
NULL);
(void) irc_server_send_signal (
server, "irc_outtags",
(command) ? command : "unknown",
ptr_msg,
(tags_to_send) ? tags_to_send : "");
if (irc_server_send (server, buffer, strlen (buffer)) <= 0)
rc = 0;
else
{
if (queue_msg > 0)
server->last_user_message = time_now;
}
if (ptr_redirect)
irc_redirect_init_command (ptr_redirect, buffer);
}
/* mark redirect as "used" */
if (ptr_redirect)
ptr_redirect->assigned_to_command = 1;
if (tags_to_send)
free (tags_to_send);
free (tags_to_send);
if (pos)
{
@@ -3142,8 +3163,6 @@ irc_server_send_one_msg (struct t_irc_server *server, int flags,
if (new_msg)
free (new_msg);
return rc;
}
/*
@@ -3293,9 +3312,8 @@ irc_server_sendf (struct t_irc_server *server, int flags, const char *tags,
str_message = weechat_hashtable_get (hashtable, hash_key);
if (!str_message)
break;
if (!irc_server_send_one_msg (server, flags, str_message,
nick, command, channel, tags))
break;
irc_server_send_one_msg (server, flags, str_message,
nick, command, channel, tags);
if (!multiline && list_messages)
{
snprintf (hash_key, sizeof (hash_key), "args%d", number);
@@ -3319,6 +3337,17 @@ irc_server_sendf (struct t_irc_server *server, int flags, const char *tags,
free (new_msg);
free (vbuffer);
/* send all messages with "immediate" priority */
while (server->outqueue[0])
{
irc_server_outqueue_send_one_msg (server, server->outqueue[0]);
irc_server_outqueue_free (server, 0, server->outqueue[0]);
}
/* send any other messages, if any, possibly with anti-flood */
if (!server->hook_timer_anti_flood)
irc_server_outqueue_send (server);
return list_messages;
}
@@ -4008,15 +4037,15 @@ irc_server_timer_cb (const void *pointer, void *data, int remaining_calls)
if (!ptr_server->is_connected)
continue;
/* send queued messages */
irc_server_outqueue_send (ptr_server);
/* check for lag */
if ((weechat_config_integer (irc_config_network_lag_check) > 0)
&& (ptr_server->lag_check_time.tv_sec == 0)
&& (current_time >= ptr_server->lag_next_check))
{
irc_server_sendf (ptr_server, 0, NULL, "PING %s",
irc_server_sendf (ptr_server,
IRC_SERVER_SEND_OUTQ_PRIO_IMMEDIATE,
NULL, /* tags */
"PING %s",
(ptr_server->current_address) ?
ptr_server->current_address : "weechat");
gettimeofday (&(ptr_server->lag_check_time), NULL);
@@ -4202,6 +4231,12 @@ irc_server_close_connection (struct t_irc_server *server)
}
irc_server_free_sasl_data (server);
if (server->hook_timer_anti_flood)
{
weechat_unhook (server->hook_timer_anti_flood);
server->hook_timer_anti_flood = NULL;
}
if (server->hook_fd)
{
weechat_unhook (server->hook_fd);
@@ -4364,7 +4399,7 @@ irc_server_login (struct t_irc_server *server)
if (password && password[0])
{
irc_server_sendf (
server, 0, NULL,
server, IRC_SERVER_SEND_OUTQ_PRIO_IMMEDIATE, NULL,
"PASS %s%s",
((password[0] == ':') || (strchr (password, ' '))) ? ":" : "",
password);
@@ -4384,18 +4419,19 @@ irc_server_login (struct t_irc_server *server)
if (irc_server_sasl_enabled (server) || (capabilities && capabilities[0]))
{
irc_server_sendf (server, 0, NULL, "CAP LS " IRC_SERVER_VERSION_CAP);
irc_server_sendf (server, IRC_SERVER_SEND_OUTQ_PRIO_IMMEDIATE, NULL,
"CAP LS " IRC_SERVER_VERSION_CAP);
}
username2 = (username && username[0]) ?
weechat_string_replace (username, " ", "_") : strdup ("weechat");
irc_server_sendf (
server, 0, NULL,
server, IRC_SERVER_SEND_OUTQ_PRIO_IMMEDIATE, NULL,
"NICK %s%s",
(server->nick && strchr (server->nick, ':')) ? ":" : "",
server->nick);
irc_server_sendf (
server, 0, NULL,
server, IRC_SERVER_SEND_OUTQ_PRIO_IMMEDIATE, NULL,
"USER %s 0 * :%s",
(username2) ? username2 : "weechat",
(realname && realname[0]) ? realname : ((username2) ? username2 : "weechat"));
@@ -6482,6 +6518,7 @@ irc_server_hdata_server_cb (const void *pointer, void *data,
WEECHAT_HDATA_VAR(struct t_irc_server, hook_fd, POINTER, 0, NULL, "hook");
WEECHAT_HDATA_VAR(struct t_irc_server, hook_timer_connection, POINTER, 0, NULL, "hook");
WEECHAT_HDATA_VAR(struct t_irc_server, hook_timer_sasl, POINTER, 0, NULL, "hook");
WEECHAT_HDATA_VAR(struct t_irc_server, hook_timer_anti_flood, POINTER, 0, NULL, "hook");
WEECHAT_HDATA_VAR(struct t_irc_server, sasl_scram_client_first, STRING, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, sasl_scram_salted_pwd, OTHER, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, sasl_scram_salted_pwd_size, INTEGER, 0, NULL, NULL);
@@ -6542,7 +6579,6 @@ irc_server_hdata_server_cb (const void *pointer, void *data,
WEECHAT_HDATA_VAR(struct t_irc_server, lag_last_refresh, TIME, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, cmd_list_regexp, POINTER, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, list, POINTER, 0, NULL, "irc_list");
WEECHAT_HDATA_VAR(struct t_irc_server, last_user_message, TIME, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, last_away_check, TIME, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, last_data_purge, TIME, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, outqueue, POINTER, 0, NULL, NULL);
@@ -6711,11 +6747,8 @@ irc_server_add_to_infolist (struct t_infolist *infolist,
if (!weechat_infolist_new_var_integer (ptr_item, "connection_timeout",
IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_CONNECTION_TIMEOUT)))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "anti_flood_prio_high",
IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_HIGH)))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "anti_flood_prio_low",
IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_LOW)))
if (!weechat_infolist_new_var_integer (ptr_item, "anti_flood",
IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_ANTI_FLOOD)))
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "away_check",
IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_AWAY_CHECK)))
@@ -6920,8 +6953,6 @@ irc_server_add_to_infolist (struct t_infolist *infolist,
return 0;
if (!weechat_infolist_new_var_integer (ptr_item, "disable_autojoin", server->disable_autojoin))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "last_user_message", server->last_user_message))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "last_away_check", server->last_away_check))
return 0;
if (!weechat_infolist_new_var_time (ptr_item, "last_data_purge", server->last_data_purge))
@@ -7185,20 +7216,13 @@ irc_server_print_log ()
else
weechat_log_printf (" connection_timeout. . . . : %d",
weechat_config_integer (ptr_server->options[IRC_SERVER_OPTION_CONNECTION_TIMEOUT]));
/* anti_flood_prio_high */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_HIGH]))
weechat_log_printf (" anti_flood_prio_high. . . : null (%d)",
IRC_SERVER_OPTION_INTEGER(ptr_server, IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_HIGH));
/* anti_flood */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_ANTI_FLOOD]))
weechat_log_printf (" anti_flood. . . . . . . . : null (%d)",
IRC_SERVER_OPTION_INTEGER(ptr_server, IRC_SERVER_OPTION_ANTI_FLOOD));
else
weechat_log_printf (" anti_flood_prio_high. . . : %d",
weechat_config_integer (ptr_server->options[IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_HIGH]));
/* anti_flood_prio_low */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_LOW]))
weechat_log_printf (" anti_flood_prio_low . . . : null (%d)",
IRC_SERVER_OPTION_INTEGER(ptr_server, IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_LOW));
else
weechat_log_printf (" anti_flood_prio_low . . . : %d",
weechat_config_integer (ptr_server->options[IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_LOW]));
weechat_log_printf (" anti_flood. . . . . . . . : %d",
weechat_config_integer (ptr_server->options[IRC_SERVER_OPTION_ANTI_FLOOD]));
/* away_check */
if (weechat_config_option_is_null (ptr_server->options[IRC_SERVER_OPTION_AWAY_CHECK]))
weechat_log_printf (" away_check. . . . . . . . : null (%d)",
@@ -7254,6 +7278,7 @@ irc_server_print_log ()
weechat_log_printf (" hook_fd . . . . . . . . . : 0x%lx", ptr_server->hook_fd);
weechat_log_printf (" hook_timer_connection . . : 0x%lx", ptr_server->hook_timer_connection);
weechat_log_printf (" hook_timer_sasl . . . . . : 0x%lx", ptr_server->hook_timer_sasl);
weechat_log_printf (" hook_timer_anti_flood . . : 0x%lx", ptr_server->hook_timer_anti_flood);
weechat_log_printf (" sasl_scram_client_first . : '%s'", ptr_server->sasl_scram_client_first);
weechat_log_printf (" sasl_scram_salted_pwd . . : (hidden)");
weechat_log_printf (" sasl_scram_salted_pwd_size: %d", ptr_server->sasl_scram_salted_pwd_size);
@@ -7331,7 +7356,6 @@ irc_server_print_log ()
weechat_log_printf (" channels. . . . . . . . : 0x%lx", ptr_server->list->channels);
weechat_log_printf (" filter_channels . . . . : 0x%lx", ptr_server->list->filter_channels);
}
weechat_log_printf (" last_user_message . . . . : %lld", (long long)ptr_server->last_user_message);
weechat_log_printf (" last_away_check . . . . . : %lld", (long long)ptr_server->last_away_check);
weechat_log_printf (" last_data_purge . . . . . : %lld", (long long)ptr_server->last_data_purge);
for (i = 0; i < IRC_SERVER_NUM_OUTQUEUES_PRIO; i++)
+4 -3
View File
@@ -83,8 +83,7 @@ enum t_irc_server_option
IRC_SERVER_OPTION_AUTOREJOIN, /* auto rejoin channels when kicked */
IRC_SERVER_OPTION_AUTOREJOIN_DELAY, /* delay before auto rejoin */
IRC_SERVER_OPTION_CONNECTION_TIMEOUT, /* timeout for connection */
IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_HIGH, /* anti-flood (high priority) */
IRC_SERVER_OPTION_ANTI_FLOOD_PRIO_LOW, /* anti-flood (low priority) */
IRC_SERVER_OPTION_ANTI_FLOOD, /* anti-flood (in ms) */
IRC_SERVER_OPTION_AWAY_CHECK, /* delay between away checks */
IRC_SERVER_OPTION_AWAY_CHECK_MAX_NICKS, /* max nicks for away check */
IRC_SERVER_OPTION_MSG_KICK, /* default kick message */
@@ -217,6 +216,7 @@ struct t_irc_server
struct t_hook *hook_fd; /* hook for server socket */
struct t_hook *hook_timer_connection; /* timer for connection */
struct t_hook *hook_timer_sasl; /* timer for SASL authentication */
struct t_hook *hook_timer_anti_flood; /* anti-flood timer */
char *sasl_scram_client_first; /* first message sent for SASL SCRAM */
char *sasl_scram_salted_pwd; /* salted password for SASL SCRAM */
int sasl_scram_salted_pwd_size; /* size of salted password for SASL SCRAM*/
@@ -282,7 +282,6 @@ struct t_irc_server
time_t lag_last_refresh; /* last refresh of lag item */
regex_t *cmd_list_regexp; /* compiled Regular Expression for /list */
struct t_irc_list *list; /* /list buffer management */
time_t last_user_message; /* time of last user message (anti flood)*/
time_t last_away_check; /* time of last away check on server */
time_t last_data_purge; /* time of last purge (some hashtables) */
struct t_irc_outqueue *outqueue[IRC_SERVER_NUM_OUTQUEUES_PRIO];
@@ -413,6 +412,8 @@ extern int irc_server_send_signal (struct t_irc_server *server,
const char *full_message,
const char *tags);
extern void irc_server_set_send_default_tags (const char *tags);
extern void irc_server_outqueue_timer_remove (struct t_irc_server *server);
extern void irc_server_outqueue_timer_add (struct t_irc_server *server);
extern struct t_arraylist *irc_server_sendf (struct t_irc_server *server,
int flags,
const char *tags,
-1
View File
@@ -663,7 +663,6 @@ irc_upgrade_read_cb (const void *pointer, void *data,
memcpy (&(irc_upgrade_current_server->lag_check_time), buf, size);
irc_upgrade_current_server->lag_next_check = weechat_infolist_time (infolist, "lag_next_check");
irc_upgrade_current_server->lag_last_refresh = weechat_infolist_time (infolist, "lag_last_refresh");
irc_upgrade_current_server->last_user_message = weechat_infolist_time (infolist, "last_user_message");
irc_upgrade_current_server->last_away_check = weechat_infolist_time (infolist, "last_away_check");
irc_upgrade_current_server->last_data_purge = weechat_infolist_time (infolist, "last_data_purge");
}