mirror of
https://github.com/Chatterino/chatterino2.git
synced 2024-11-13 19:49:51 +01:00
46 lines
817 B
C++
46 lines
817 B
C++
|
#include "RatelimitBucket.hpp"
|
||
|
|
||
|
#include <QTimer>
|
||
|
|
||
|
namespace chatterino {
|
||
|
|
||
|
RatelimitBucket::RatelimitBucket(int budget, int cooldown,
|
||
|
std::function<void(QString)> callback,
|
||
|
QObject *parent)
|
||
|
: QObject(parent)
|
||
|
, budget_(budget)
|
||
|
, cooldown_(cooldown)
|
||
|
, callback_(callback)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void RatelimitBucket::send(QString channel)
|
||
|
{
|
||
|
this->queue_.append(channel);
|
||
|
|
||
|
if (this->budget_ > 0)
|
||
|
{
|
||
|
this->handleOne();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void RatelimitBucket::handleOne()
|
||
|
{
|
||
|
if (queue_.isEmpty())
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
auto item = queue_.takeFirst();
|
||
|
|
||
|
this->budget_--;
|
||
|
callback_(item);
|
||
|
|
||
|
QTimer::singleShot(cooldown_, this, [this] {
|
||
|
this->budget_++;
|
||
|
this->handleOne();
|
||
|
});
|
||
|
}
|
||
|
|
||
|
} // namespace chatterino
|