diff --git a/API.md b/API.md index a5f6a73..ed26fbb 100644 --- a/API.md +++ b/API.md @@ -14,7 +14,12 @@ You can implement a new chat mode by calling The mode definition must include the following table fields: * `help` - * brief summary of the options + * a string -- brief summary of the options +* `can_register(playername, params_array)` + * optional + * checks whether the player can switch to the mode, given the parameters + * does not register the player - simply performs the check and returns a boolean + * returns `true` if the registration would normally succeed * `register(playername, params_array)` * a handler function that is called any time a user switches chat modes. It is expected that the handler will register the player as having activated the mode, according to its parameters. * `deregister(playername)` diff --git a/api.lua b/api.lua index e3c8ab3..c6fe923 100644 --- a/api.lua +++ b/api.lua @@ -1,5 +1,4 @@ -- TODO --- Implement support for custom privs -- Implement @-pings - play a sound to target player if @playername is mentioned @@ -63,6 +62,11 @@ local function chatmodeswitch(playername, argsarray) return end + if newmodedef.can_register and not newmodedef.can_register(playername, argsarray) then + minetest.chat_send_player(playername, "You cannot switch to that mode with those settings.") + return + end + -- ==== if oldmodedef.deregister then @@ -156,6 +160,8 @@ minetest.register_on_chat_message(function(playername, message) for _,theplayer in pairs(valid_players.players) do chat_modes.chatsend(theplayer:get_player_name(), message) end + + return true end) @@ -163,12 +169,18 @@ end) -- ================================ -- Player management -minetest.register_on_playerleave(function(player) -- FIXME verify - playermodes[player:get_player_name()] = nil +minetest.register_on_leaveplayer(function(player, timedout) + -- Do not discard pref for a timed out player + if not timedout then + playermodes[player:get_player_name()] = nil + end end) -minetest.register_on_playerjoin(function(player) -- FIXME verify - playermodes[player:get_player_name()] = defaultmode +minetest.register_on_joinplayer(function(player) + -- Do not reinitialize after a player timeout + if not playermodes[player:get_player_name()] then + playermodes[player:get_player_name()] = defaultmode + end end)