forked from Sokomine/yl_speak_up
		
	add or revoke read or write access to a variable - formspec interface part
This commit is contained in:
		
							parent
							
								
									8367a60c0f
								
							
						
					
					
						commit
						30d14ed999
					
				
							
								
								
									
										201
									
								
								quest_api.lua
									
									
									
									
									
								
							
							
						
						
									
										201
									
								
								quest_api.lua
									
									
									
									
									
								
							@ -165,9 +165,10 @@ yl_speak_up.input_fs_manage_variables = function(player, formname, fields)
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	-- leave this formspec
 | 
			
		||||
	if(fields and (fields.quit or fields.exit)) then
 | 
			
		||||
	if(fields and (fields.quit or fields.exit or fields.back)) then
 | 
			
		||||
		local last_fs = yl_speak_up.speak_to[pname][ "working_at" ]
 | 
			
		||||
		yl_speak_up.show_fs(player, last_fs)
 | 
			
		||||
		return
 | 
			
		||||
	-- add a new variable?
 | 
			
		||||
	elseif(fields and fields.add_variable) then
 | 
			
		||||
		local error_msg = ""
 | 
			
		||||
@ -221,13 +222,15 @@ yl_speak_up.input_fs_manage_variables = function(player, formname, fields)
 | 
			
		||||
					false)
 | 
			
		||||
		})
 | 
			
		||||
		return
 | 
			
		||||
	-- TODO: delete variable
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	-- which variable is currently selected?
 | 
			
		||||
	local var_list = yl_speak_up.get_quest_variables(pname, true)
 | 
			
		||||
	-- make names of own variables shorter
 | 
			
		||||
	yl_speak_up.strip_pname_from_varlist(var_list, pname)
 | 
			
		||||
	table.sort(var_list)
 | 
			
		||||
	-- a var name was selected in the dropdown list
 | 
			
		||||
	elseif(fields and fields.list_var_names and fields.list_var_names ~= "") then
 | 
			
		||||
		local var_list = yl_speak_up.get_quest_variables(pname, true)
 | 
			
		||||
		-- make names of own variables shorter
 | 
			
		||||
		yl_speak_up.strip_pname_from_varlist(var_list, pname)
 | 
			
		||||
		table.sort(var_list)
 | 
			
		||||
	if(fields and fields.list_var_names and fields.list_var_names ~= "") then
 | 
			
		||||
		local index = table.indexof(var_list, fields.list_var_names)
 | 
			
		||||
		if(fields.list_var_names == "Add variable:") then
 | 
			
		||||
			index = 0
 | 
			
		||||
@ -235,6 +238,128 @@ yl_speak_up.input_fs_manage_variables = function(player, formname, fields)
 | 
			
		||||
		if(index and index > -1) then
 | 
			
		||||
			yl_speak_up.speak_to[pname].tmp_index_variable = index + 1
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
	local var_name = var_list[ yl_speak_up.speak_to[pname].tmp_index_variable ]
 | 
			
		||||
 | 
			
		||||
	-- revoke read or write access to a variable
 | 
			
		||||
	if(fields
 | 
			
		||||
	  and ((fields.revoke_player_var_read_access  and fields.revoke_player_var_read_access ~= "")
 | 
			
		||||
	    or (fields.revoke_player_var_write_access and fields.revoke_player_var_write_access ~= ""))
 | 
			
		||||
	  and var_name) then
 | 
			
		||||
		local right = "read"
 | 
			
		||||
		if(fields.revoke_player_var_write_access and fields.revoke_player_var_write_access ~= "") then
 | 
			
		||||
			right = "write"
 | 
			
		||||
		end
 | 
			
		||||
		-- which player are we talking about?
 | 
			
		||||
		local selected = yl_speak_up.speak_to[pname]["tmp_index_var_"..right.."_access"]
 | 
			
		||||
		local pl_with_access = yl_speak_up.get_access_list_for_var(var_name, pname, right.."_access")
 | 
			
		||||
		local tmp_list = {}
 | 
			
		||||
		for k, v in pairs(pl_with_access) do
 | 
			
		||||
			table.insert(tmp_list, k)
 | 
			
		||||
		end
 | 
			
		||||
		table.sort(tmp_list)
 | 
			
		||||
		local grant_to = ""
 | 
			
		||||
		if(selected > 1) then
 | 
			
		||||
			grant_to = tmp_list[ selected-1 ]
 | 
			
		||||
		end
 | 
			
		||||
		local error_msg = ""
 | 
			
		||||
		local pl_with_access = yl_speak_up.get_access_list_for_var(var_name, pname, right.."_access")
 | 
			
		||||
		if(not(grant_to) or grant_to == "") then
 | 
			
		||||
			error_msg = "For which player do you want to revoke "..right.." access?"
 | 
			
		||||
		elseif(pname ~= yl_speak_up.npc_owner[ n_id ]
 | 
			
		||||
		  and not(minetest.check_player_privs(pname, {npc_talk_master=true}))) then
 | 
			
		||||
			error_msg = "Only the owner of the NPC or players with\n"..
 | 
			
		||||
				    "the npc_talk_master priv can change this."
 | 
			
		||||
		elseif(not(pl_with_access[ grant_to ])) then
 | 
			
		||||
			error_msg = minetest.formspec_escape(grant_to).." doesn't have "..right..
 | 
			
		||||
				    " access\nto this variable. Nothing changed."
 | 
			
		||||
		-- try to revoke access
 | 
			
		||||
		elseif(not(yl_speak_up.manage_access_to_quest_variable(var_name, pname, grant_to,
 | 
			
		||||
									right.."_access", nil))) then
 | 
			
		||||
			error_msg = "An internal error occoured."
 | 
			
		||||
		else
 | 
			
		||||
			-- not really an error message here...rather a success message
 | 
			
		||||
			error_msg = "Revoked "..right.." access to variable\n\""..
 | 
			
		||||
				minetest.formspec_escape(var_name)..
 | 
			
		||||
				"\"\nfor player "..minetest.formspec_escape(grant_to)..".\n"..
 | 
			
		||||
				"Note: This will *not* affect existing preconditions/effects!"
 | 
			
		||||
		end
 | 
			
		||||
		yl_speak_up.show_fs(player, "msg", {
 | 
			
		||||
			input_to = "yl_speak_up:manage_variables",
 | 
			
		||||
			formspec = "size[6,2]"..
 | 
			
		||||
				"label[0.2,0.0;"..error_msg.."]"..
 | 
			
		||||
				"button[1.5,1.5;2,0.9;back_from_msg;Back]"})
 | 
			
		||||
		return
 | 
			
		||||
 | 
			
		||||
	-- grant read or write access to a variable
 | 
			
		||||
	elseif(fields
 | 
			
		||||
	  and ((fields.grant_player_var_read_access  and fields.grant_player_var_read_access ~= "")
 | 
			
		||||
	    or (fields.grant_player_var_write_access and fields.grant_player_var_write_access ~= ""))
 | 
			
		||||
	  and var_name) then
 | 
			
		||||
		local right = "read"
 | 
			
		||||
		if(fields.grant_player_var_write_access and fields.grant_player_var_write_access ~= "") then
 | 
			
		||||
			right = "write"
 | 
			
		||||
		end
 | 
			
		||||
		local grant_to = fields[ "grant_player_var_"..right.."_access"]
 | 
			
		||||
		local error_msg = ""
 | 
			
		||||
		local pl_with_access = yl_speak_up.get_access_list_for_var(var_name, pname, right.."_access")
 | 
			
		||||
		if(pname ~= yl_speak_up.npc_owner[ n_id ]
 | 
			
		||||
		  and not(minetest.check_player_privs(pname, {npc_talk_master=true}))) then
 | 
			
		||||
			error_msg = "Only the owner of the NPC or players with\n"..
 | 
			
		||||
				    "the npc_talk_master priv can change this."
 | 
			
		||||
		elseif(grant_to == pname) then
 | 
			
		||||
                        error_msg = "You already have "..right.." access to this variable."
 | 
			
		||||
		elseif(pl_with_access[ grant_to ]) then
 | 
			
		||||
			error_msg = minetest.formspec_escape(grant_to).." already has "..right..
 | 
			
		||||
				    " access\nto this variable."
 | 
			
		||||
		elseif(not(minetest.check_player_privs(grant_to, {interact=true}))) then
 | 
			
		||||
			error_msg = "Player \""..minetest.formspec_escape(grant_to).."\" not found."
 | 
			
		||||
		-- try to grant access
 | 
			
		||||
		elseif(not(yl_speak_up.manage_access_to_quest_variable(var_name, pname, grant_to,
 | 
			
		||||
									right.."_access", true))) then
 | 
			
		||||
			error_msg = "An internal error occoured."
 | 
			
		||||
		else
 | 
			
		||||
			-- not really an error message here...rather a success message
 | 
			
		||||
			error_msg = "Granted "..right.." access to variable\n\""..
 | 
			
		||||
				minetest.formspec_escape(var_name)..
 | 
			
		||||
				"\"\nto player "..minetest.formspec_escape(grant_to).."."
 | 
			
		||||
		end
 | 
			
		||||
		yl_speak_up.show_fs(player, "msg", {
 | 
			
		||||
			input_to = "yl_speak_up:manage_variables",
 | 
			
		||||
			formspec = "size[6,2]"..
 | 
			
		||||
				"label[0.2,0.0;"..error_msg.."]"..
 | 
			
		||||
				"button[1.5,1.5;2,0.9;back_from_msg;Back]"})
 | 
			
		||||
		return
 | 
			
		||||
 | 
			
		||||
	-- the player clicked on a name in the list of players with read or write access
 | 
			
		||||
	elseif(fields
 | 
			
		||||
	  and ((fields.list_var_read_access  and fields.list_var_read_access ~= "")
 | 
			
		||||
	    or (fields.list_var_write_access and fields.list_var_write_access ~= ""))
 | 
			
		||||
	  and var_name) then
 | 
			
		||||
		local right = "read"
 | 
			
		||||
		if(fields.list_var_write_access and fields.list_var_write_access ~= "") then
 | 
			
		||||
			right = "write"
 | 
			
		||||
		end
 | 
			
		||||
		local selected = fields[ "list_var_"..right.."_access"]
 | 
			
		||||
		local pl_with_access = yl_speak_up.get_access_list_for_var(var_name, pname, right.."_access")
 | 
			
		||||
		local tmp_list = {}
 | 
			
		||||
		for k, v in pairs(pl_with_access) do
 | 
			
		||||
			table.insert(tmp_list, k)
 | 
			
		||||
		end
 | 
			
		||||
		table.sort(tmp_list)
 | 
			
		||||
		local index = table.indexof(tmp_list, selected)
 | 
			
		||||
		if(selected == "Add player:") then
 | 
			
		||||
			index = 0
 | 
			
		||||
		end
 | 
			
		||||
		if(index and index > -1) then
 | 
			
		||||
			yl_speak_up.speak_to[pname]["tmp_index_var_"..right.."_access"] = index + 1
 | 
			
		||||
		end
 | 
			
		||||
		yl_speak_up.show_fs(player, "manage_variables")
 | 
			
		||||
		return
 | 
			
		||||
 | 
			
		||||
	-- TODO: delete variable
 | 
			
		||||
	-- a var name was selected in the dropdown list
 | 
			
		||||
	elseif(fields and fields.list_var_names and fields.list_var_names ~= "") then
 | 
			
		||||
		-- show the same formspec again, with a diffrent variable selected
 | 
			
		||||
		yl_speak_up.show_fs(player, "manage_variables")
 | 
			
		||||
		return
 | 
			
		||||
@ -268,6 +393,9 @@ yl_speak_up.get_fs_manage_variables = function(player, param)
 | 
			
		||||
			"tooltip[add_variable;Create a new varialbe with the name\n"..
 | 
			
		||||
				"you entered in the field to the left.]"
 | 
			
		||||
	else
 | 
			
		||||
		local k = var_list[ yl_speak_up.speak_to[pname].tmp_index_variable ]
 | 
			
		||||
		local pl_with_read_access = yl_speak_up.get_access_list_for_var(k, pname, "read_access")
 | 
			
		||||
		local pl_with_write_access = yl_speak_up.get_access_list_for_var(k, pname, "write_access")
 | 
			
		||||
		local add_read_button = ""
 | 
			
		||||
		local add_write_button = ""
 | 
			
		||||
		if(not(yl_speak_up.speak_to[pname].tmp_index_var_read_access)
 | 
			
		||||
@ -291,7 +419,8 @@ yl_speak_up.get_fs_manage_variables = function(player, param)
 | 
			
		||||
			-- offer a dropdown list and a text input field for new varialbe names for adding
 | 
			
		||||
			"label[0.2,3.05;Players with read access to this variable:]"..
 | 
			
		||||
			yl_speak_up.create_dropdown_playerlist(player, pname,
 | 
			
		||||
				{}, yl_speak_up.speak_to[pname].tmp_index_var_read_access, -- TODO
 | 
			
		||||
				pl_with_read_access,
 | 
			
		||||
				yl_speak_up.speak_to[pname].tmp_index_var_read_access,
 | 
			
		||||
				5.5, 2.9, 0.0, "list_var_read_access", "player", "Remove player from list",
 | 
			
		||||
				"grant_player_var_read_access",
 | 
			
		||||
					"Enter the name of the player that shall\n"..
 | 
			
		||||
@ -303,7 +432,8 @@ yl_speak_up.get_fs_manage_variables = function(player, param)
 | 
			
		||||
			)..add_read_button..
 | 
			
		||||
			"label[0.2,4.05;Players with *write* access to this variable:]"..
 | 
			
		||||
			yl_speak_up.create_dropdown_playerlist(player, pname,
 | 
			
		||||
				{}, yl_speak_up.speak_to[pname].tmp_index_var_write_access, -- TODO
 | 
			
		||||
				pl_with_write_access,
 | 
			
		||||
				yl_speak_up.speak_to[pname].tmp_index_var_write_access,
 | 
			
		||||
				5.5, 3.9, 0.0, "list_var_write_access", "player", "Remove player from list",
 | 
			
		||||
				"grant_player_var_write_access",
 | 
			
		||||
					"Enter the name of the player that shall\n"..
 | 
			
		||||
@ -404,6 +534,59 @@ yl_speak_up.get_pname_for_n_id = function(n_id)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- add or revoke read or write access to a variable
 | 
			
		||||
--
 | 
			
		||||
-- k:              name of the variable
 | 
			
		||||
-- pname:          the name of the player trying to grant or revoke the right
 | 
			
		||||
-- grant_to_pname: the name of the player who shall have that access right
 | 
			
		||||
-- grant_write_access:
 | 
			
		||||
-- 	if false: grant read access
 | 
			
		||||
-- 	if true:  grant write access
 | 
			
		||||
-- do_grant:
 | 
			
		||||
-- 	if false: revoke acces
 | 
			
		||||
-- 	if true:  grant access
 | 
			
		||||
-- returns true if the variable was found
 | 
			
		||||
yl_speak_up.manage_access_to_quest_variable = function(k, pname, grant_to_pname, what_to_grant, do_grant)
 | 
			
		||||
	k = yl_speak_up.add_pname_to_var(k, pname)
 | 
			
		||||
	-- grant or revoke priv
 | 
			
		||||
	if(not(do_grant)) then
 | 
			
		||||
		do_grant = nil
 | 
			
		||||
	end
 | 
			
		||||
	-- only read and write access can be granted
 | 
			
		||||
	if(not(what_to_grant) or (what_to_grant ~= "read_access" and what_to_grant ~= "write_access")) then
 | 
			
		||||
		return false
 | 
			
		||||
	end
 | 
			
		||||
	-- the variable needs to exist
 | 
			
		||||
	if(not(yl_speak_up.player_vars[ k ])) then
 | 
			
		||||
		return false
 | 
			
		||||
	end
 | 
			
		||||
	-- make sure all the necessary tables exist
 | 
			
		||||
	if(not(yl_speak_up.player_vars[ k ][ "$META$" ])) then
 | 
			
		||||
		yl_speak_up.player_vars[ k ][ "$META$"] = { what_to_grant = {} }
 | 
			
		||||
	end
 | 
			
		||||
	if(not(yl_speak_up.player_vars[ k ][ "$META$" ][ what_to_grant ])) then
 | 
			
		||||
		yl_speak_up.player_vars[ k ][ "$META$" ][ what_to_grant ] = {}
 | 
			
		||||
	end
 | 
			
		||||
	yl_speak_up.player_vars[ k ][ "$META$"][ what_to_grant ][ grant_to_pname ] = do_grant
 | 
			
		||||
	yl_speak_up.save_quest_variables(true)
 | 
			
		||||
	return true
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- get a list of all players who have read or write access to variable k (belonging to pname)
 | 
			
		||||
-- (technically a table and not a list)
 | 
			
		||||
yl_speak_up.get_access_list_for_var = function(k, pname, access_what)
 | 
			
		||||
	k = yl_speak_up.add_pname_to_var(k, pname)
 | 
			
		||||
	if(not(k)
 | 
			
		||||
	  or not(yl_speak_up.player_vars[ k ])
 | 
			
		||||
	  or not(yl_speak_up.player_vars[ k ][ "$META$"])
 | 
			
		||||
	  or not(yl_speak_up.player_vars[ k ][ "$META$"][ access_what ])) then
 | 
			
		||||
		return {}
 | 
			
		||||
	end
 | 
			
		||||
	return yl_speak_up.player_vars[ k ][ "$META$"][ access_what ]
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- the dialog data of an NPC is saved - use this to save some statistical data
 | 
			
		||||
-- plus store which variables are used by this NPC
 | 
			
		||||
-- TODO: show this data in a formspec to admins for maintenance
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user