From 2c4cf508a9b94a76ce2ca7c7317258471a41c51d Mon Sep 17 00:00:00 2001 From: sfan5 Date: Sat, 9 Nov 2019 11:00:19 +0100 Subject: [PATCH] [CSM] Implement minetest.get_csm_restrictions() fixes #8068 --- clientmods/preview/init.lua | 3 +++ doc/client_lua_api.txt | 5 +++++ src/client/client.h | 5 +++++ src/script/lua_api/l_client.cpp | 35 +++++++++++++++++++++++++++++++++ src/script/lua_api/l_client.h | 3 +++ 5 files changed, 51 insertions(+) diff --git a/clientmods/preview/init.lua b/clientmods/preview/init.lua index dd856217f..2e679b866 100644 --- a/clientmods/preview/init.lua +++ b/clientmods/preview/init.lua @@ -14,6 +14,9 @@ print("Server version: " .. server_info.protocol_version) print("Server ip: " .. server_info.ip) print("Server address: " .. server_info.address) print("Server port: " .. server_info.port) + +print("CSM restrictions: " .. dump(core.get_csm_restrictions())) + mod_channel = core.mod_channel_join("experimental_preview") core.after(4, function() diff --git a/doc/client_lua_api.txt b/doc/client_lua_api.txt index 78cd2ead2..a7e928f56 100644 --- a/doc/client_lua_api.txt +++ b/doc/client_lua_api.txt @@ -649,6 +649,11 @@ Minetest namespace reference * `minetest.sha1(data, [raw])`: returns the sha1 hash of data * `data`: string of data to hash * `raw`: return raw bytes instead of hex digits, default: false +* `minetest.get_csm_restrictions()`: returns a table of `Flags` indicating the + restrictions applied to the current mod. + * If a flag in this table is set to true, the feature is RESTRICTED. + * Possible flags: `load_client_mods`, `chat_messages`, `read_itemdefs`, + `read_nodedefs`, `lookup_nodes`, `read_playerinfo` ### Logging * `minetest.debug(...)` diff --git a/src/client/client.h b/src/client/client.h index 5144af69f..0e0765cae 100644 --- a/src/client/client.h +++ b/src/client/client.h @@ -410,6 +410,11 @@ public: return m_address_name; } + inline u64 getCSMRestrictionFlags() const + { + return m_csm_restriction_flags; + } + inline bool checkCSMRestrictionFlag(CSMRestrictionFlags flag) const { return m_csm_restriction_flags & flag; diff --git a/src/script/lua_api/l_client.cpp b/src/script/lua_api/l_client.cpp index 08976ee11..fa369a360 100644 --- a/src/script/lua_api/l_client.cpp +++ b/src/script/lua_api/l_client.cpp @@ -39,6 +39,27 @@ with this program; if not, write to the Free Software Foundation, Inc., #define checkCSMRestrictionFlag(flag) \ ( getClient(L)->checkCSMRestrictionFlag(CSMRestrictionFlags::flag) ) +// Not the same as FlagDesc, which contains an `u32 flag` +struct CSMFlagDesc { + const char *name; + u64 flag; +}; + +/* + FIXME: This should eventually be moved somewhere else + It also needs to be kept in sync with the definition of CSMRestrictionFlags + in network/networkprotocol.h +*/ +const static CSMFlagDesc flagdesc_csm_restriction[] = { + {"load_client_mods", CSM_RF_LOAD_CLIENT_MODS}, + {"chat_messages", CSM_RF_CHAT_MESSAGES}, + {"read_itemdefs", CSM_RF_READ_ITEMDEFS}, + {"read_nodedefs", CSM_RF_READ_NODEDEFS}, + {"lookup_nodes", CSM_RF_LOOKUP_NODES}, + {"read_playerinfo", CSM_RF_READ_PLAYERINFO}, + {NULL, 0} +}; + // get_current_modname() int ModApiClient::l_get_current_modname(lua_State *L) { @@ -363,6 +384,19 @@ int ModApiClient::l_get_builtin_path(lua_State *L) return 1; } +// get_csm_restrictions() +int ModApiClient::l_get_csm_restrictions(lua_State *L) +{ + u64 flags = getClient(L)->getCSMRestrictionFlags(); + const CSMFlagDesc *flagdesc = flagdesc_csm_restriction; + + lua_newtable(L); + for (int i = 0; flagdesc[i].name; i++) { + setboolfield(L, -1, flagdesc[i].name, !!(flags & flagdesc[i].flag)); + } + return 1; +} + void ModApiClient::Initialize(lua_State *L, int top) { API_FCT(get_current_modname); @@ -389,4 +423,5 @@ void ModApiClient::Initialize(lua_State *L, int top) API_FCT(get_privilege_list); API_FCT(get_builtin_path); API_FCT(get_language); + API_FCT(get_csm_restrictions); } diff --git a/src/script/lua_api/l_client.h b/src/script/lua_api/l_client.h index 0a68eeff0..6d1f70b1d 100644 --- a/src/script/lua_api/l_client.h +++ b/src/script/lua_api/l_client.h @@ -96,6 +96,9 @@ private: // get_builtin_path() static int l_get_builtin_path(lua_State *L); + // get_csm_restrictions() + static int l_get_csm_restrictions(lua_State *L); + public: static void Initialize(lua_State *L, int top); };