Server user limit configuration option
authorPerttu Ahola <celeron55@gmail.com>
Mon, 26 Sep 2011 08:57:51 +0000 (11:57 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Mon, 26 Sep 2011 08:57:51 +0000 (11:57 +0300)
src/defaultsettings.cpp
src/server.cpp

index 1e17f2f3ac36922abc2b6d0e2937a38e9d0ebd4a..698389121ef40525202ea1731d54c5243596d8bc 100644 (file)
@@ -77,6 +77,7 @@ void set_default_settings()
 
        // Server stuff
        g_settings.setDefault("motd", "");
+       g_settings.setDefault("max_users", "20");
        g_settings.setDefault("enable_experimental", "false");
        g_settings.setDefault("creative_mode", "false");
        g_settings.setDefault("enable_damage", "true");
index 304eb8920d19631fdda462cf864f5d170b0f817b..bf74737fcdae2cca6c7878b4eec0fe8e8c9c6271 100644 (file)
@@ -2096,11 +2096,21 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
                                        stringToPrivs(g_settings.get("default_privs")));
                        m_authmanager.save();
                }
+               
+               // Enforce user limit.
+               // Don't enforce for users that have some admin right
+               if(m_clients.size() >= g_settings.getU16("max_users") &&
+                               (m_authmanager.getPrivs(playername)
+                                       & (PRIV_SERVER|PRIV_BAN|PRIV_PRIVS)) == 0 &&
+                               playername != g_settings.get("name"))
+               {
+                       SendAccessDenied(m_con, peer_id, L"Too many users.");
+                       return;
+               }
 
                // Get player
                Player *player = emergePlayer(playername, password, peer_id);
 
-
                /*{
                        // DEBUG: Test serialization
                        std::ostringstream test_os;
@@ -4426,16 +4436,16 @@ void Server::handlePeerChange(PeerChange &c)
                // Collect information about leaving in chat
                std::wstring message;
                {
-                       std::wstring name = L"unknown";
                        Player *player = m_env.getPlayer(c.peer_id);
                        if(player != NULL)
-                               name = narrow_to_wide(player->getName());
-                       
-                       message += L"*** ";
-                       message += name;
-                       message += L" left game";
-                       if(c.timeout)
-                               message += L" (timed out)";
+                       {
+                               std::wstring name = narrow_to_wide(player->getName());
+                               message += L"*** ";
+                               message += name;
+                               message += L" left game";
+                               if(c.timeout)
+                                       message += L" (timed out)";
+                       }
                }
 
                /*// Delete player