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
|
return
|
||||||
end
|
end
|
||||||
-- leave this formspec
|
-- 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" ]
|
local last_fs = yl_speak_up.speak_to[pname][ "working_at" ]
|
||||||
yl_speak_up.show_fs(player, last_fs)
|
yl_speak_up.show_fs(player, last_fs)
|
||||||
|
return
|
||||||
-- add a new variable?
|
-- add a new variable?
|
||||||
elseif(fields and fields.add_variable) then
|
elseif(fields and fields.add_variable) then
|
||||||
local error_msg = ""
|
local error_msg = ""
|
||||||
@ -221,13 +222,15 @@ yl_speak_up.input_fs_manage_variables = function(player, formname, fields)
|
|||||||
false)
|
false)
|
||||||
})
|
})
|
||||||
return
|
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
|
-- a var name was selected in the dropdown list
|
||||||
elseif(fields and fields.list_var_names and fields.list_var_names ~= "") then
|
if(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)
|
|
||||||
local index = table.indexof(var_list, fields.list_var_names)
|
local index = table.indexof(var_list, fields.list_var_names)
|
||||||
if(fields.list_var_names == "Add variable:") then
|
if(fields.list_var_names == "Add variable:") then
|
||||||
index = 0
|
index = 0
|
||||||
@ -235,6 +238,128 @@ yl_speak_up.input_fs_manage_variables = function(player, formname, fields)
|
|||||||
if(index and index > -1) then
|
if(index and index > -1) then
|
||||||
yl_speak_up.speak_to[pname].tmp_index_variable = index + 1
|
yl_speak_up.speak_to[pname].tmp_index_variable = index + 1
|
||||||
end
|
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
|
-- show the same formspec again, with a diffrent variable selected
|
||||||
yl_speak_up.show_fs(player, "manage_variables")
|
yl_speak_up.show_fs(player, "manage_variables")
|
||||||
return
|
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"..
|
"tooltip[add_variable;Create a new varialbe with the name\n"..
|
||||||
"you entered in the field to the left.]"
|
"you entered in the field to the left.]"
|
||||||
else
|
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_read_button = ""
|
||||||
local add_write_button = ""
|
local add_write_button = ""
|
||||||
if(not(yl_speak_up.speak_to[pname].tmp_index_var_read_access)
|
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
|
-- 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:]"..
|
"label[0.2,3.05;Players with read access to this variable:]"..
|
||||||
yl_speak_up.create_dropdown_playerlist(player, pname,
|
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",
|
5.5, 2.9, 0.0, "list_var_read_access", "player", "Remove player from list",
|
||||||
"grant_player_var_read_access",
|
"grant_player_var_read_access",
|
||||||
"Enter the name of the player that shall\n"..
|
"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..
|
)..add_read_button..
|
||||||
"label[0.2,4.05;Players with *write* access to this variable:]"..
|
"label[0.2,4.05;Players with *write* access to this variable:]"..
|
||||||
yl_speak_up.create_dropdown_playerlist(player, pname,
|
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",
|
5.5, 3.9, 0.0, "list_var_write_access", "player", "Remove player from list",
|
||||||
"grant_player_var_write_access",
|
"grant_player_var_write_access",
|
||||||
"Enter the name of the player that shall\n"..
|
"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
|
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
|
-- the dialog data of an NPC is saved - use this to save some statistical data
|
||||||
-- plus store which variables are used by this NPC
|
-- plus store which variables are used by this NPC
|
||||||
-- TODO: show this data in a formspec to admins for maintenance
|
-- TODO: show this data in a formspec to admins for maintenance
|
||||||
|
Loading…
Reference in New Issue
Block a user