summary refs log tree commit diff
path: root/client.c
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-05-11 18:05:41 -0400
committerJune McEnroe <june@causal.agency>2020-05-11 18:16:19 -0400
commit548c4a3a86a37cf74aac5ef91f84b9a762dc1023 (patch)
tree810cdf6ea4d26421f4b2a36f3a35bda745fec628 /client.c
parentPass -1 as backlog to listen(2) (diff)
downloadpounce-548c4a3a86a37cf74aac5ef91f84b9a762dc1023.tar.gz
pounce-548c4a3a86a37cf74aac5ef91f84b9a762dc1023.zip
Add server send queueing with time interval
This addresses pounce getting killed with "Excess flood" when it sends
NAMES commands for too many channels when a client connects. These
commands, as well as automatic AWAY commands, are by default throttled
to 5 per second.

Tested on freenode with 36 channels and 200ms interval.
Diffstat (limited to '')
-rw-r--r--client.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/client.c b/client.c
index 25707a8..e260bc7 100644
--- a/client.c
+++ b/client.c
@@ -69,7 +69,7 @@ struct Client *clientAlloc(struct tls *tls) {
 void clientFree(struct Client *client) {
 	if (!client->need) {
 		if (!(client->caps & CapPassive) && !--active) {
-			serverFormat("AWAY :%s\r\n", clientAway);
+			serverEnqueue("AWAY :%s\r\n", clientAway);
 		}
 	}
 	tls_close(client->tls);
@@ -122,7 +122,7 @@ static void maybeSync(struct Client *client) {
 		stateSync(client);
 		if (client->setPos) ringSet(client->consumer, client->setPos);
 		if (!(client->caps & CapPassive) && !active++) {
-			serverFormat("AWAY\r\n");
+			serverEnqueue("AWAY\r\n");
 		}
 	}
 }