pidgin/pidgin

Use the leaky bucket algorithm to rate limit irc messages.
release-2.x.y
2022-04-23, Gary Kramlich
c49dcf00bee6
Use the leaky bucket algorithm to rate limit irc messages.

The default values were suggested by an operator of libera.

We don't rate limit the login process, nor parts and quits. However, if you
paste a bunch of text and then part a channel, you will be spammed with a
bunch of "no such nick/channel" error dialogs. I tried to work around this,
but the alternative just makes irc unresponsive until all the pasted messages
are sent. That said, other messages are still delayed while these errors
dialogs are slowly popping up.

Testing Done:
Lots

Bugs closed: PIDGIN-11089

Reviewed at https://reviews.imfreedom.org/r/524/
{
X oddness 1
Memcheck:Param
write(buf)
fun:__write_nocancel
fun:_X11TransWrite
obj:/usr/X11R6/lib/libX11.so.6.2
fun:_XReply
}
{
NSS
Memcheck:Cond
obj:/usr/lib/libsoftokn3.so
obj:/usr/lib/libsoftokn3.so
obj:/usr/lib/libsoftokn3.so
obj:/usr/lib/libsoftokn3.so
}
{
X oddness 2
Memcheck:Param
writev(vector[...])
fun:writev
obj:/usr/X11R6/lib/libX11.so.6.2
fun:_X11TransWritev
fun:_XSend
}
{
X oddness 3
Memcheck:Cond
fun:XcursorImageHash
fun:XcursorNoticePutBitmap
fun:_XNoticePutBitmap
fun:XPutImage
}
{
X oddness 4
Memcheck:Param
write(buf)
fun:__write_nocancel
fun:_X11TransWrite
obj:/usr/X11R6/lib/libX11.so.6.2
fun:XFlush
}
{
X oddness 5
Memcheck:Param
write(buf)
fun:__write_nocancel
fun:_X11TransWrite
obj:/usr/X11R6/lib/libX11.so.6.2
fun:XDrawLine
}
{
X oddness 6
Memcheck:Param
write(buf)
fun:__write_nocancel
fun:_X11TransWrite
obj:/usr/X11R6/lib/libX11.so.6.2
fun:_XEventsQueued
}
{
File selector
Memcheck:Value4
fun:_itoa_word
fun:_IO_vfprintf_internal
fun:_IO_vsprintf_internal
fun:_IO_sprintf
}
{
File selector 2
Memcheck:Param
write(buf)
fun:__write_nocancel
fun:_X11TransWrite
obj:/usr/X11R6/lib/libX11.so.6.2
fun:XRenderComposite
}
{
TCL leak
Memcheck:Leak
fun:malloc
fun:TclpAlloc
fun:Tcl_Alloc
fun:Tcl_StaticPackage
}
{
FontConfig Maybe
Memcheck:Leak
fun:malloc
fun:FcStrCopy
fun:FcStrSetAdd
fun:FcLangSetCopy
}
{
File selector 3
Memcheck:Param
write(buf)
fun:__write_nocancel
fun:_X11TransWrite
obj:/usr/X11R6/lib/libX11.so.6.2
fun:_XFlushGCCache
}
{
File selector 4
Memcheck:Param
write(buf)
fun:__write_nocancel
fun:_X11TransWrite
obj:/usr/X11R6/lib/libX11.so.6.2
fun:XCreateGC
}
{
Something else
Memcheck:Param
write(buf)
fun:__write_nocancel
fun:_X11TransWrite
obj:/usr/X11R6/lib/libX11.so.6.2
fun:_XSetClipRectangles
}
{
New conversation windows
Memcheck:Cond
obj:/usr/lib/libgtk-x11-2.0.so.0.400.14
obj:/usr/lib/libgtk-x11-2.0.so.0.400.14
obj:/usr/lib/libgtk-x11-2.0.so.0.400.14
obj:/usr/lib/libgtk-x11-2.0.so.0.400.14
}
{
New conversation windows 2
Memcheck:Cond
obj:/usr/lib/libgtk-x11-2.0.so.0.400.14
obj:/usr/lib/libgtk-x11-2.0.so.0.400.14
obj:/usr/lib/libgtk-x11-2.0.so.0.400.14
obj:/usr/lib/libgobject-2.0.so.0.400.8
}
{
NSS Init
Memcheck:Leak
fun:malloc
fun:PR_Malloc
fun:PR_CreateStack
fun:_PR_InitFdCache
fun:_PR_InitIO
fun:_PR_ImplicitInitialization
fun:PR_Init
fun:rsa_nss_init
fun:GE_plugin_load
fun:purple_plugin_load
fun:purple_plugins_load_saved
fun:main
}