
New flood control method

A server usually disconnects you for sending too much
data to it in a certain period of time, *or* if you
try to send it data when it hasn't finished processing
your previous data. Usually a server has a buffer for
your commands of between 512 and 1024 bytes (varies
with each server).

mIRC therefore counts the number of bytes you've sent
to a server and if this exceeds a certain number, mIRC
sends a PING to the server and waits for a PONG. Once
it has recieved a PONG, it continues sending the data.

All data to be sent is buffered until the PONG reply
is received. Once the pong is received, mIRC continues
to send the buffered data. Each line of data also stores
with it the nick and address of the user to which it is
being sent.

mIRC also lets you specify the maximum number of buffered
messages, so it will store up to a maximum of say 15
messages, and will discard any others.

mIRC will also let you specify the maximum number of
messages for an individual user. So you can tell it
to buffer a maximum of 3 messages for any single user,
and any new ones are discarded.

mIRC goes one step further: it tries to perform intelligent
buffering in an attempt to satisfy the maximum number of
users possible as quickly as possible.

This is best illustrated with an example.

TWO messages are queued for MADGOAT:
PRIVMSG madgoat :hi there whats up?
PRIVMSG madgoat :I just heard about this new feature

ONE message is queued for KREJT:
PRIVMSG madgoat :hi there whats up?
PRIVMSG krejt   :Hallooo there
PRIVMSG madgoat :I just heard about this new feature

ONE message is queued for MADGOAT:
PRIVMSG madgoat :hi there whats up?
PRIVMSG krejt   :Hallooo there
PRIVMSG madgoat :I just heard about this new feature
PRIVMSG madgoat :so tell me about it!

THREE messages are queued for KREJT:
PRIVMSG madgoat :hi there whats up?
PRIVMSG krejt   :Hallooo there
PRIVMSG madgoat :I just heard about this new feature
PRIVMSG krejt   :Hmmm, is anyone there?
PRIVMSG madgoat :so tell me about it!
PRIVMSG krejt   :okay, I give up!
PRIVMSG krejt   :See you later...

ONE message is queued for NEEP
PRIVMSG madgoat :hi there whats up?
PRIVMSG krejt   :Hallooo there
PRIVMSG neep    :neep neep!
PRIVMSG madgoat :I just heard about this new feature
PRIVMSG krejt   :Hmmm, is anyone there?
PRIVMSG madgoat :so tell me about it!
PRIVMSG krejt   :okay, I give up!
PRIVMSG krejt   :See you later...

mIRC spreads the messages so that no single user can
hog the queue.

If the queue reaches the maximum number of lines, then
users who already have more than one line in the queue
will have one of their lines removed in order to
accomodate new users.

There are a few other quirks to the way the flood
protection works but in general the above is a good
description.

You can change the settings with the /flood command.

/flood [on|off|clear] <triggerbytes> <maxqueuesize> <maxusermessages> <ignoretime>

triggerbytes - the number of bytes at which mIRC should
check if it might be flooding the server or not. Setting
this greater than 500 bytes isn't too helpful since that
might be the maximum amount a server allows. The lower
the number, the more sensitive mIRC will be, and the slower
it will reply. Default 400.

maxqueuesize - maximum number of lines mIRC will buffer.

maxusermessages - maximum number of lines a user can have
have in the buffer.

ignoretime - how long to ignore user. If zero, no ignore is done.

Typing /flood with no parameters gives you the current status.

For example:

/flood 200 10 2 30

mIRC will check for flooding if it has sent 200 or more
characters to the server.

mIRC will buffer a maximum of 10 lines and ignore the rest.

mIRC will only allow each user 2 buffered lines.

mIRC will ignore user for 30 seconds.

Other Comments.

It probably needs tweaking etc. beta-testing required.

This flood control method *only* works for messages
being sent from remote definitions (ie. triggered by
other users). So you can still flood *yourself* off the
server. It works in the background so you can't see it
turn on and off like the old flood protection method.

