apply chat flood prevention in games next to rooms (#4387)
* apply chat flood prevention in games next to rooms * add limit to private messages as well
This commit is contained in:
parent
a65ce8694c
commit
0280fea3e6
5 changed files with 46 additions and 23 deletions
|
@ -38,6 +38,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int getLastCommandTime() const = 0;
|
virtual int getLastCommandTime() const = 0;
|
||||||
|
virtual bool addSaidMessageSize(int size) = 0;
|
||||||
|
|
||||||
void playerRemovedFromGame(Server_Game *game);
|
void playerRemovedFromGame(Server_Game *game);
|
||||||
void playerAddedToGame(int gameId, int roomId, int playerId);
|
void playerAddedToGame(int gameId, int roomId, int playerId);
|
||||||
|
|
|
@ -945,6 +945,9 @@ Server_Player::cmdGameSay(const Command_GameSay &cmd, ResponseContainer & /*rc*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!userInterface->addSaidMessageSize(cmd.message().size())) {
|
||||||
|
return Response::RespChatFlood;
|
||||||
|
}
|
||||||
Event_GameSay event;
|
Event_GameSay event;
|
||||||
event.set_message(cmd.message());
|
event.set_message(cmd.message());
|
||||||
ges.enqueueGameEvent(event, playerId);
|
ges.enqueueGameEvent(event, playerId);
|
||||||
|
|
|
@ -555,10 +555,15 @@ Response::ResponseCode Server_ProtocolHandler::cmdMessage(const Command_Message
|
||||||
|
|
||||||
QString receiver = QString::fromStdString(cmd.user_name());
|
QString receiver = QString::fromStdString(cmd.user_name());
|
||||||
Server_AbstractUserInterface *userInterface = server->findUser(receiver);
|
Server_AbstractUserInterface *userInterface = server->findUser(receiver);
|
||||||
if (!userInterface)
|
if (!userInterface) {
|
||||||
return Response::RespNameNotFound;
|
return Response::RespNameNotFound;
|
||||||
if (databaseInterface->isInIgnoreList(receiver, QString::fromStdString(userInfo->name())))
|
}
|
||||||
|
if (databaseInterface->isInIgnoreList(receiver, QString::fromStdString(userInfo->name()))) {
|
||||||
return Response::RespInIgnoreList;
|
return Response::RespInIgnoreList;
|
||||||
|
}
|
||||||
|
if (!addSaidMessageSize(cmd.message().size())) {
|
||||||
|
return Response::RespChatFlood;
|
||||||
|
}
|
||||||
|
|
||||||
Event_UserMessage event;
|
Event_UserMessage event;
|
||||||
event.set_sender_name(userInfo->name());
|
event.set_sender_name(userInfo->name());
|
||||||
|
@ -719,32 +724,41 @@ Server_ProtocolHandler::cmdLeaveRoom(const Command_LeaveRoom & /*cmd*/, Server_R
|
||||||
return Response::RespOk;
|
return Response::RespOk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Server_ProtocolHandler::addSaidMessageSize(int size)
|
||||||
|
{
|
||||||
|
if (server->getMessageCountingInterval() <= 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int totalSize = 0, totalCount = 0;
|
||||||
|
if (messageSizeOverTime.isEmpty()) {
|
||||||
|
messageSizeOverTime.prepend(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
messageSizeOverTime[0] += size;
|
||||||
|
for (int messageSize : messageSizeOverTime) {
|
||||||
|
totalSize += messageSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (messageCountOverTime.isEmpty()) {
|
||||||
|
messageCountOverTime.prepend(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
messageCountOverTime[0] += 1;
|
||||||
|
for (int messageCount : messageCountOverTime) {
|
||||||
|
totalCount += messageCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
return totalSize <= server->getMaxMessageSizePerInterval() && totalCount <= server->getMaxMessageCountPerInterval();
|
||||||
|
}
|
||||||
|
|
||||||
Response::ResponseCode
|
Response::ResponseCode
|
||||||
Server_ProtocolHandler::cmdRoomSay(const Command_RoomSay &cmd, Server_Room *room, ResponseContainer & /*rc*/)
|
Server_ProtocolHandler::cmdRoomSay(const Command_RoomSay &cmd, Server_Room *room, ResponseContainer & /*rc*/)
|
||||||
{
|
{
|
||||||
QString msg = QString::fromStdString(cmd.message());
|
QString msg = QString::fromStdString(cmd.message());
|
||||||
|
|
||||||
if (server->getMessageCountingInterval() > 0) {
|
if (!addSaidMessageSize(msg.size())) {
|
||||||
int totalSize = 0, totalCount = 0;
|
return Response::RespChatFlood;
|
||||||
if (messageSizeOverTime.isEmpty())
|
|
||||||
messageSizeOverTime.prepend(0);
|
|
||||||
messageSizeOverTime[0] += msg.size();
|
|
||||||
for (int i = 0; i < messageSizeOverTime.size(); ++i)
|
|
||||||
totalSize += messageSizeOverTime[i];
|
|
||||||
|
|
||||||
if (messageCountOverTime.isEmpty())
|
|
||||||
messageCountOverTime.prepend(0);
|
|
||||||
++messageCountOverTime[0];
|
|
||||||
for (int i = 0; i < messageCountOverTime.size(); ++i) {
|
|
||||||
totalCount += messageCountOverTime[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
int maxMessageSizePerInterval = server->getMaxMessageSizePerInterval();
|
|
||||||
int maxMessageCountPerInterval = server->getMaxMessageCountPerInterval();
|
|
||||||
if ((maxMessageSizePerInterval > 0 && totalSize > maxMessageSizePerInterval) ||
|
|
||||||
(maxMessageCountPerInterval > 0 && totalCount > maxMessageCountPerInterval)) {
|
|
||||||
return Response::RespChatFlood;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
msg.replace(QChar('\n'), QChar(' '));
|
msg.replace(QChar('\n'), QChar(' '));
|
||||||
|
|
||||||
|
|
|
@ -129,6 +129,7 @@ public:
|
||||||
{
|
{
|
||||||
return timeRunning - lastDataReceived;
|
return timeRunning - lastDataReceived;
|
||||||
}
|
}
|
||||||
|
bool addSaidMessageSize(int size);
|
||||||
void processCommandContainer(const CommandContainer &cont);
|
void processCommandContainer(const CommandContainer &cont);
|
||||||
|
|
||||||
void sendProtocolItem(const Response &item);
|
void sendProtocolItem(const Response &item);
|
||||||
|
|
|
@ -15,6 +15,10 @@ public:
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
bool addSaidMessageSize(int /*size*/)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void sendProtocolItem(const Response &item);
|
void sendProtocolItem(const Response &item);
|
||||||
void sendProtocolItem(const SessionEvent &item);
|
void sendProtocolItem(const SessionEvent &item);
|
||||||
|
|
Loading…
Reference in a new issue