mirror of
https://github.com/luanti-org/luanti.git
synced 2025-08-11 17:51:04 +00:00
Chat: new settings to prevent spam
Added the following chat coreside features * Chat messages length limit * Message rate limiting * Message rate kicking Note: * handleChat now takes RemotePlayer pointer instead of u16 to remove useless lookups
This commit is contained in:
parent
1079aeaa13
commit
d4c76258e3
8 changed files with 125 additions and 11 deletions
|
@ -358,6 +358,7 @@ Server::Server(
|
|||
add_legacy_abms(m_env, m_nodedef);
|
||||
|
||||
m_liquid_transform_every = g_settings->getFloat("liquid_update");
|
||||
m_max_chatmessage_length = g_settings->getU16("chat_message_max_size");
|
||||
}
|
||||
|
||||
Server::~Server()
|
||||
|
@ -2734,8 +2735,7 @@ void Server::handleChatInterfaceEvent(ChatEvent *evt)
|
|||
}
|
||||
|
||||
std::wstring Server::handleChat(const std::string &name, const std::wstring &wname,
|
||||
const std::wstring &wmessage, bool check_shout_priv,
|
||||
u16 peer_id_to_avoid_sending)
|
||||
const std::wstring &wmessage, bool check_shout_priv, RemotePlayer *player)
|
||||
{
|
||||
// If something goes wrong, this player is to blame
|
||||
RollbackScopeActor rollback_scope(m_rollback,
|
||||
|
@ -2753,6 +2753,26 @@ std::wstring Server::handleChat(const std::string &name, const std::wstring &wna
|
|||
if (ate)
|
||||
return L"";
|
||||
|
||||
switch (player->canSendChatMessage()) {
|
||||
case RPLAYER_CHATRESULT_FLOODING: {
|
||||
std::wstringstream ws;
|
||||
ws << L"You cannot send more messages. You are limited to "
|
||||
<< g_settings->getFloat("chat_message_limit_per_10sec")
|
||||
<< " messages per 10 seconds.";
|
||||
return ws.str();
|
||||
}
|
||||
case RPLAYER_CHATRESULT_KICK:
|
||||
DenyAccess_Legacy(player->peer_id, L"You have been kicked due to message flooding.");
|
||||
return L"";
|
||||
case RPLAYER_CHATRESULT_OK: break;
|
||||
default: FATAL_ERROR("Unhandled chat filtering result found.");
|
||||
}
|
||||
|
||||
if (m_max_chatmessage_length > 0 && wmessage.length() > m_max_chatmessage_length) {
|
||||
return L"Your message exceed the maximum chat message limit set on the server. "
|
||||
"It was refused. Send a shorter message";
|
||||
}
|
||||
|
||||
// Commands are implemented in Lua, so only catch invalid
|
||||
// commands that were not "eaten" and send an error back
|
||||
if (wmessage[0] == L'/') {
|
||||
|
@ -2787,6 +2807,7 @@ std::wstring Server::handleChat(const std::string &name, const std::wstring &wna
|
|||
|
||||
std::vector<u16> clients = m_clients.getClientIDs();
|
||||
|
||||
u16 peer_id_to_avoid_sending = (player ? player->peer_id : PEER_ID_INEXISTENT);
|
||||
for (u16 i = 0; i < clients.size(); i++) {
|
||||
u16 cid = clients[i];
|
||||
if (cid != peer_id_to_avoid_sending)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue