support setting jobs as a wiki owner or editor

This commit is contained in:
Elkien3 2021-02-24 14:49:49 -06:00
parent 723bab9f35
commit fdf91bf414
3 changed files with 38 additions and 6 deletions

View File

@ -28,6 +28,19 @@ jobs.save = function()
jobs.storage:set_string("list", minetest.serialize(jobs.list))
end
jobs.permissionstring = function(name, str)
if not str then return end
local tbl = jobs.split(str, ":")
if not tbl or #tbl ~= 2 then return end
local jobname = tbl[1]
local jobrank = tbl[2]
local rank = jobs.getrank(name, jobname)
local coc = jobs.chainofcommand
if not jobs.list[jobname] or not coc[jobrank] then return end
if rank and coc[rank] >= coc[jobrank] then return true end
return false
end
minetest.register_chatcommand("jobs", {
privs = {
interact = true,

View File

@ -20,3 +20,23 @@ wikilib.split = function(inputstr, sep)
end
return t
end
wikilib.permission = function(pagename, playername, ownercheck)
if minetest.check_player_privs(playername, {wiki_admin=true}) then return true end
if not minetest.check_player_privs(playername, {wiki=true}) then return false end
local owner = wikilib.owners[pagename]
if not owner then return true end
if owner == playername then return true end
if jobs and jobs.permissionstring(playername, owner) then return true end
if ownercheck then return false end
if owner == ":public:" then return true end
if wikilib.editors[pagename] then
if wikilib.editors[pagename][playername] or wikilib.editors[pagename][":public:"] then return true end
if jobs then
for name, val in pairs(wikilib.editors[pagename]) do
if jobs.permissionstring(playername, name) then return true end
end
end
end
return false
end

View File

@ -73,9 +73,8 @@ local function get_page_path(name, player) --> path, is_file, allow_save
else
path = "pages/"..name_to_filename(name)
end
if wikilib.owners and wikilib.owners[name] and wikilib.owners[name] ~= player and wikilib.owners[name] ~= ":public:"
and (not wikilib.editors[name] or (not wikilib.editors[name][player] and not wikilib.editors[name][":public:"]))
and not minetest.check_player_privs(player, {wiki_admin=true}) then
if wikilib.permission and not wikilib.permission(name, player) then
allow_save = false
end
@ -179,7 +178,7 @@ function wikilib.get_wiki_page_formspec(player, name)
end
end
end
if (wikilib.owners[name] and wikilib.owners[name] == player) or minetest.check_player_privs(player, {wiki_admin=true}) then
if wikilib.permission(name, player, true) then
owner = "field[3,9.5;2,1;owner;Owner;"..minetest.formspec_escape((wikilib.owners[name]) or "").."]field_close_on_enter[owner;false]"
editors = "field[5,9.5;3,1;editors;Editors;"..minetest.formspec_escape((editorstring or "")).."]field_close_on_enter[editors;false]"
else
@ -258,9 +257,9 @@ function wikilib.handle_formspec(player, formname, fields)
elseif fields.go then
wikilib.show_wiki_page(plname, fields.page)
return true
elseif fields.key_enter_field and (not wikilib.owners[fields.page] or wikilib.owners[fields.page] == plname or minetest.check_player_privs(plname, {wiki_admin=true})) then
elseif fields.key_enter_field and wikilib.permission(fields.page, plname, true) then
if fields.key_enter_field == "owner" then
if (minetest.player_exists(fields.owner) or fields.owner == ":public:") then
if minetest.player_exists(fields.owner) or fields.owner == ":public:" or (not jobs or jobs.permissionstring(plname, fields.owner) ~= nil) then
wikilib.owners[fields.page] = fields.owner
wikilib.owners_save()
wikilib.show_wiki_page(plname, fields.page)