Skip to content
Permalink
Browse files

[CSM] Implement minetest.get_csm_restrictions()

fixes #8068
  • Loading branch information
sfan5 committed Nov 9, 2019
1 parent 3f27156 commit 2c4cf508a9b94a76ce2ca7c7317258471a41c51d
@@ -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()
@@ -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(...)`
@@ -410,6 +410,11 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
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;
@@ -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);
}
@@ -96,6 +96,9 @@ class ModApiClient : public ModApiBase
// 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);
};

0 comments on commit 2c4cf50

Please sign in to comment.
You can’t perform that action at this time.