mirror of
https://github.com/Chatterino/chatterino2.git
synced 2024-11-21 22:24:07 +01:00
Fixed #501
This commit is contained in:
parent
532737d358
commit
47198a5489
2 changed files with 63 additions and 51 deletions
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
// using namespace Communi;
|
// using namespace Communi;
|
||||||
using namespace chatterino::singletons;
|
using namespace chatterino::singletons;
|
||||||
|
using namespace std::chrono_literals;
|
||||||
|
|
||||||
namespace chatterino {
|
namespace chatterino {
|
||||||
namespace providers {
|
namespace providers {
|
||||||
|
@ -71,53 +72,8 @@ std::shared_ptr<Channel> TwitchServer::createChannel(const QString &channelName)
|
||||||
{
|
{
|
||||||
TwitchChannel *channel = new TwitchChannel(channelName, this->getReadConnection());
|
TwitchChannel *channel = new TwitchChannel(channelName, this->getReadConnection());
|
||||||
|
|
||||||
channel->sendMessageSignal.connect([this, channel](auto chan, auto msg, bool &sent) {
|
channel->sendMessageSignal.connect([this, channel](auto &chan, auto &msg, bool &sent) {
|
||||||
{
|
this->onMessageSendRequested(channel, msg, sent);
|
||||||
std::lock_guard<std::mutex> guard(this->lastMessageMutex);
|
|
||||||
|
|
||||||
std::queue<QTime> &lastMessage =
|
|
||||||
channel->hasModRights() ? this->lastMessageMod : this->lastMessagePleb;
|
|
||||||
size_t maxMessageCount = channel->hasModRights() ? 99 : 19;
|
|
||||||
|
|
||||||
QTime now = QTime::currentTime();
|
|
||||||
|
|
||||||
// check if you are sending messages too fast
|
|
||||||
if (lastMessage.size() > 0 &&
|
|
||||||
lastMessage.back().addMSecs(channel->hasModRights() ? 100 : 1100) > now) {
|
|
||||||
if (lastErrorTimeSpeed.addSecs(30) < now) {
|
|
||||||
auto errorMessage =
|
|
||||||
messages::Message::createSystemMessage("sending messages too fast");
|
|
||||||
|
|
||||||
channel->addMessage(errorMessage);
|
|
||||||
|
|
||||||
lastErrorTimeSpeed = now;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// remove messages older than 30 seconds
|
|
||||||
while (lastMessage.size() > 0 && lastMessage.front().addSecs(32) < now) {
|
|
||||||
lastMessage.pop();
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if you are sending too many messages
|
|
||||||
if (lastMessage.size() >= maxMessageCount) {
|
|
||||||
if (lastErrorTimeAmount.addSecs(30) < now) {
|
|
||||||
auto errorMessage =
|
|
||||||
messages::Message::createSystemMessage("sending too many messages");
|
|
||||||
|
|
||||||
channel->addMessage(errorMessage);
|
|
||||||
|
|
||||||
lastErrorTimeAmount = now;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
lastMessage.push(now);
|
|
||||||
}
|
|
||||||
|
|
||||||
this->sendMessage(chan, msg);
|
|
||||||
sent = true;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return std::shared_ptr<Channel>(channel);
|
return std::shared_ptr<Channel>(channel);
|
||||||
|
@ -222,6 +178,59 @@ QString TwitchServer::cleanChannelName(const QString &dirtyChannelName)
|
||||||
return dirtyChannelName.toLower();
|
return dirtyChannelName.toLower();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TwitchServer::onMessageSendRequested(TwitchChannel *channel, const QString &message,
|
||||||
|
bool &sent)
|
||||||
|
{
|
||||||
|
sent = false;
|
||||||
|
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> guard(this->lastMessageMutex);
|
||||||
|
|
||||||
|
// std::queue<std::chrono::steady_clock::time_point>
|
||||||
|
auto &lastMessage = channel->hasModRights() ? this->lastMessageMod : this->lastMessagePleb;
|
||||||
|
size_t maxMessageCount = channel->hasModRights() ? 99 : 19;
|
||||||
|
auto minMessageOffset = (channel->hasModRights() ? 100ms : 1100ms);
|
||||||
|
|
||||||
|
auto now = std::chrono::steady_clock::now();
|
||||||
|
|
||||||
|
// check if you are sending messages too fast
|
||||||
|
if (!lastMessage.empty() && lastMessage.back() + minMessageOffset > now) {
|
||||||
|
if (lastErrorTimeSpeed + 30s < now) {
|
||||||
|
auto errorMessage =
|
||||||
|
messages::Message::createSystemMessage("sending messages too fast");
|
||||||
|
|
||||||
|
channel->addMessage(errorMessage);
|
||||||
|
|
||||||
|
lastErrorTimeSpeed = now;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove messages older than 30 seconds
|
||||||
|
while (!lastMessage.empty() && lastMessage.front() + 32s < now) {
|
||||||
|
lastMessage.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if you are sending too many messages
|
||||||
|
if (lastMessage.size() >= maxMessageCount) {
|
||||||
|
if (lastErrorTimeAmount + 30s < now) {
|
||||||
|
auto errorMessage =
|
||||||
|
messages::Message::createSystemMessage("sending too many messages");
|
||||||
|
|
||||||
|
channel->addMessage(errorMessage);
|
||||||
|
|
||||||
|
lastErrorTimeAmount = now;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
lastMessage.push(now);
|
||||||
|
}
|
||||||
|
|
||||||
|
this->sendMessage(channel->name, message);
|
||||||
|
sent = true;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace twitch
|
} // namespace twitch
|
||||||
} // namespace providers
|
} // namespace providers
|
||||||
} // namespace chatterino
|
} // namespace chatterino
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include "providers/twitch/twitchchannel.hpp"
|
#include "providers/twitch/twitchchannel.hpp"
|
||||||
#include "util/mutexvalue.hpp"
|
#include "util/mutexvalue.hpp"
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
|
|
||||||
|
@ -45,10 +46,12 @@ protected:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::mutex lastMessageMutex;
|
std::mutex lastMessageMutex;
|
||||||
std::queue<QTime> lastMessagePleb;
|
std::queue<std::chrono::steady_clock::time_point> lastMessagePleb;
|
||||||
std::queue<QTime> lastMessageMod;
|
std::queue<std::chrono::steady_clock::time_point> lastMessageMod;
|
||||||
QTime lastErrorTimeSpeed;
|
std::chrono::steady_clock::time_point lastErrorTimeSpeed;
|
||||||
QTime lastErrorTimeAmount;
|
std::chrono::steady_clock::time_point lastErrorTimeAmount;
|
||||||
|
|
||||||
|
void onMessageSendRequested(TwitchChannel *channel, const QString &message, bool &sent);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace twitch
|
} // namespace twitch
|
||||||
|
|
Loading…
Reference in a new issue