Added 'shout' player privilege
authorCiaran Gultnieks <ciaran@ciarang.com>
Mon, 23 May 2011 19:40:25 +0000 (20:40 +0100)
committerCiaran Gultnieks <ciaran@ciarang.com>
Mon, 23 May 2011 19:40:25 +0000 (20:40 +0100)
src/player.cpp
src/player.h
src/server.cpp

index 12f18de75861eca11f4342abd6a6d79e52afff79..147b6c97acd3f96c390ee761795b1c49c1133f0b 100644 (file)
@@ -36,6 +36,8 @@ std::wstring privsToString(u64 privs)
                os<<L"settime,";
        if(privs & PRIV_PRIVS)
                os<<L"privs,";
+       if(privs & PRIV_SHOUT)
+               os<<L"shout,";
        if(os.tellp())
        {
                // Drop the trailing comma. (Why on earth can't
@@ -65,6 +67,8 @@ u64 stringToPrivs(std::wstring str)
                        privs |= PRIV_SETTIME;
                else if(*i == L"privs")
                        privs |= PRIV_PRIVS;
+               else if(*i == L"shout")
+                       privs |= PRIV_SHOUT;
                else
                        return PRIV_INVALID;
        }
index 925252e49d6a48f361ff01c44179587f5d78270e..4b776a03fe6a62427a5510157f467c9c2ba7f8ae 100644 (file)
@@ -34,14 +34,19 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 // of the player, and define things they're allowed to do. See also
 // the static methods Player::privsToString and stringToPrivs that
 // convert these to human-readable form.
-const u64 PRIV_BUILD = 1;      // Can build - i.e. modify the world
-                               //  (not enforced yet)
-const u64 PRIV_TELEPORT = 2;   // Can teleport
-const u64 PRIV_SETTIME = 4;    // Can set the time
-const u64 PRIV_PRIVS = 8;      // Can grant and revoke privileges
-const u64 PRIV_SERVER = 16;    // Can manage the server (e.g. shutodwn ,settings)
-
-const u64 PRIV_DEFAULT = PRIV_BUILD;
+const u64 PRIV_BUILD = 1;            // Can build - i.e. modify the world
+const u64 PRIV_TELEPORT = 2;         // Can teleport
+const u64 PRIV_SETTIME = 4;          // Can set the time
+const u64 PRIV_PRIVS = 8;            // Can grant and revoke privileges
+const u64 PRIV_SERVER = 16;          // Can manage the server (e.g. shutodwn
+                                     // ,settings)
+const u64 PRIV_SHOUT = 32;           // Can broadcast chat messages to all
+                                     // players
+
+// Default privileges - these can be overriden for new players using the
+// config option "default_privs" - however, this value still applies for
+// players that existed before the privileges system was added.
+const u64 PRIV_DEFAULT = PRIV_BUILD|PRIV_SHOUT;
 const u64 PRIV_ALL = 0x7FFFFFFFFFFFFFFFULL;
 const u64 PRIV_INVALID = 0x8000000000000000ULL;
 
index 9b4ee1fad00143c2bbbca82b15bc3adc0900447e..6a4fe3c0267a1bf6e27c58632d94c22cc597a056 100644 (file)
@@ -2908,6 +2908,12 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
                // Whether to send to other players
                bool send_to_others = false;
                
+               // Local player gets all privileges regardless of
+               // what's set on their account.
+               u64 privs = player->privs;
+               if(g_settings.get("name") == player->getName())
+                       privs = PRIV_ALL;
+
                // Parse commands
                std::wstring commandprefix = L"/#";
                if(message.substr(0, commandprefix.size()) == commandprefix)
@@ -2916,12 +2922,6 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
 
                        message = message.substr(commandprefix.size());
 
-                       // Local player gets all privileges regardless of
-                       // what's set on their account.
-                       u64 privs = player->privs;
-                       if(g_settings.get("name") == player->getName())
-                               privs = PRIV_ALL;
-
                        ServerCommandContext *ctx = new ServerCommandContext(
                                str_split(message, L' '),
                                this,
@@ -2937,13 +2937,19 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
                }
                else
                {
-                       line += L"<";
-                       /*if(is_operator)
-                               line += L"@";*/
-                       line += name;
-                       line += L"> ";
-                       line += message;
-                       send_to_others = true;
+                       if(privs & PRIV_SHOUT)
+                       {
+                               line += L"<";
+                               line += name;
+                               line += L"> ";
+                               line += message;
+                               send_to_others = true;
+                       }
+                       else
+                       {
+                               line += L"Server: You are not allowed to shout";
+                               send_to_sender = true;
+                       }
                }
                
                if(line != L"")