diff --git a/GOVERNANCE.md b/DOCS/GOVERNANCE.md similarity index 100% rename from GOVERNANCE.md rename to DOCS/GOVERNANCE.md diff --git a/init.lua b/init.lua index 963fc9b..9a318cd 100644 --- a/init.lua +++ b/init.lua @@ -1,3 +1,31 @@ +modpol = {} + + +-- =================================================================== +--preoverrides: certain things must be predefined in the global table for them to have effect (or cmd line version defualts are used) +-- =================================================================== +-- =================================================================== +-- currently: +-- --get_script_dir: get modpol_minetest's version of directory +-- -- Persistent storage +-- -- -- must implement modpol.load_storage() and modpol.store_data() +-- -- -- defines the path for the lua file + + + +-- get modpol_minetest's version of directory +modpol.get_script_dir = function() + return minetest.get_modpath("modpol") +end + +-- TKTK: Implement minetest settingtypes for this... for now, the default is to use minetest mod storage. +-- However, the default for if modpol.lua is called from the cmd line is to use local storage +-- Any other implementation may with to make their own persistent storage file and declare it befoe calling modpol.lua in a similar manner + +-- works with cmd line: "/storage/storage-local.lua", works with Minetest 5.0 and up: "/storage/storage-mod_storage.lua" + +modpol.storage_file_path = minetest.get_modpath("modpol").."/storage/storage-mod_storage.lua" + -- =================================================================== -- /init.lua -- Modular Politics (modpol) for Minetest @@ -9,156 +37,11 @@ dofile(minetest.get_modpath("modpol") .. "/modpol.lua") --- =================================================================== --- Modular Politics functions --- Overwriting default API functions with platform-specific ones --- =================================================================== -- =================================================================== --- Function: modpol.list_users(org) --- Overwrites function at /users.lua --- Params: --- if nil, lists instance members; if an org name, lists its members --- Output: a table with names of players currently in the game -modpol.list_users = function(org) - local users = {} - if (org == nil) then -- no specified org; all players - for _,player in ipairs(minetest.get_connected_players()) do - local name = player:get_player_name() - table.insert(users,name) - end - else -- if an org is specified - if (modpol.orgs[org] ~= nil) then -- org exists - users = modpol.orgs[org]["members"] - end - end - return users -end - +-- Modular Politics Minetest Specific Code -- =================================================================== --- Function: modpol.binary_poll_user(user, question) --- Overwrites function at /interactions.lua --- presents a yes/no/abstain poll to a user, returns answer -modpol.binary_poll_user = function(user, question) - -- set up formspec - local text = "Poll: " .. question - local formspec = { - "formspec_version[4]", - "size[5,3]", - "label[0.375,0.5;", minetest.formspec_escape(text), "]", - "button[1,1.5;1,0.8;yes;Yes]", - "button[2,1.5;1,0.8;no;No]", - "button[3,1.5;1,0.8;abstain;Abstain]" - --TKTK can we enable text wrapping? - } - local formspec_string = table.concat(formspec, "") - -- present to player - minetest.show_formspec(user, "modpol:binary_poll", formspec_string) -end - --- =================================================================== --- Minetest commands --- =================================================================== - -local chat_table -- MT chat command definitions table -local regchat -- Chat-command registration function - -regchat = minetest.register_chatcommand - --- =================================================================== --- /addorg /add_org --- This code defines a chat command which creates a new --- "org". Presently, the command makes the user the sole member of the --- "org". - -chat_table = { - privs = {} , - func = function (user, param) - local result = modpol.add_org (param, { user }) - return true, result - end -} -regchat ("addorg" , chat_table) -regchat ("add_org" , chat_table) - --- =================================================================== --- /listorg /listorgs /list_org /list_orgs --- In Minetest mode, this code defines a chat command which lists the --- existing "orgs". --- The list shows one "org" per line in the following format: --- org_name (member, member, ...) - -chat_table = { - privs = {} , - func = function (user, param) - return true, "Orgs:\n" .. modpol.list_orgs() - end -} - -regchat ("listorg" , chat_table) -regchat ("listorgs" , chat_table) -regchat ("list_org" , chat_table) -regchat ("list_orgs" , chat_table) - --- =================================================================== --- /listplayers -minetest.register_chatcommand( - "listplayers", { - privs = {}, - func = function(user) - local result = table.concat(modpol.list_users(),", ") - return true, "All players: " .. result - end, -}) - --- =================================================================== --- /joinorg -minetest.register_chatcommand( - "joinorg", { - privs = {}, - func = function(user, param) - local result = modpol.add_member(param, user) - return true, result - end, -}) - - --- =================================================================== --- /pollself [question] --- asks the user a question specified in param -minetest.register_chatcommand( - "pollself", { - privs = {}, - func = function(user, param) - modpol.binary_poll_user(user, param) - return true, result - end, -}) - --- =================================================================== --- Minetest events --- =================================================================== - --- =================================================================== --- Receiving fields -minetest.register_on_player_receive_fields(function (player, formname, fields) - -- modpol:poll - if formname == "modpol:binary_poll" then - local pname = player:get_player_name() - local vote = nil - if fields.yes then vote = fields.yes - elseif fields.no then vote = fields.no - elseif fields.abstain then vote = fields.abstain - end - if vote then - minetest.chat_send_all(pname .. " voted " .. vote) - end - minetest.close_formspec(pname, formname) - return vote - else -- if the form is not a recognized name - return - end -end) +dofile(minetest.get_modpath("modpol") .. "/modpol_minetest/api.lua") -- =================================================================== -- End of file. diff --git a/modpol.lua b/modpol.lua index 4775c54..62246dc 100644 --- a/modpol.lua +++ b/modpol.lua @@ -6,8 +6,7 @@ -- Basic tables -- Main API table -modpol = { -} +if not modpol then modpol = {} end -- Table for modpol data modpol.orgs = { @@ -17,14 +16,21 @@ modpol.orgs = { modpol.ledger = { } + -- =================================================================== -- Locate framework top-level directory. --- This function is intended for use under Linux and/or UNIX only. It +-- This function is intended for use under Linux and/or UNIX only. + +-- It -- returns a relative or absolute path for the framework top-level -- directory without a trailing slash. -local get_script_dir = function() +-- if your application has a different method of getting the script directory, +-- then feel free to overwrite this in an init.lua or other such file by first +-- defining the modpol table and then defining the get_script_dir() function + +local get_script_dir = modpol.get_script_dir or function() local str = debug.getinfo (2, "S").source:sub (2) str = str:match ("(.*/)") or "." str = str:gsub ("/$", "", 1) @@ -40,17 +46,23 @@ print (topdir) -- Load dependencies -- OldCoder utilities -dofile (topdir .. "/ocutil.lua") +dofile (topdir .. "/util/ocutil/ocutil.lua") -- =================================================================== -- Persistent storage -- must implement modpol.load_storage() and modpol.store_data() + -- Select a storage method +-- -- preferably, declare this in the init.lua that calls modpol.lua This is the default. -- Works with CLI: -dofile (topdir .. "/storage-local.lua") +modpol.storage_file_path = modpol.storage_file_path or topdir .. "/storage/storage-local.lua" -- Works with Minetest 5: --- dofile (topdir .. "/storage-mod_storage.lua") +--modpol.storage_file_path = modpol.storage_file_path or topdir .. "/storage/storage-mod_storage.lua") + +--execute the storage file +dofile (modpol.storage_file_path) + -- If available, load persistent storage into active tables modpol.load_storage() @@ -58,11 +70,9 @@ modpol.load_storage() -- =================================================================== -- ModPol core features -dofile (topdir .. "/users.lua") -dofile (topdir .. "/orgs.lua") -dofile (topdir .. "/interactions.lua") --- messaging functions -dofile (topdir .. "/processes.lua") + +dofile (topdir .. "/modpol/api.lua") + -- =================================================================== -- Final checks @@ -72,7 +82,7 @@ if (modpol.orgs["instance"] == nil) then modpol.add_org("instance", modpol.list_users()) end -ocutil.log ("modpol loaded") +modpol.ocutil.log ("modpol loaded") -- =================================================================== -- End of file. diff --git a/modpol/api.lua b/modpol/api.lua new file mode 100644 index 0000000..204eb43 --- /dev/null +++ b/modpol/api.lua @@ -0,0 +1,15 @@ +--call all files in this directory + +local localdir = modpol.get_script_dir() .. "/modpol" + +--Users +dofile (localdir .. "/users/users.lua") + +--orgs +dofile (localdir .. "/orgs/orgs.lua") + +--interactions +dofile (localdir .. "/interactions/interactions.lua") + +-- messaging functions +dofile (localdir .. "/processes/processes.lua") diff --git a/interactions.lua b/modpol/interactions/interactions.lua similarity index 100% rename from interactions.lua rename to modpol/interactions/interactions.lua diff --git a/orgs.lua b/modpol/orgs/orgs.lua similarity index 91% rename from orgs.lua rename to modpol/orgs/orgs.lua index f2a0275..c4596ca 100644 --- a/orgs.lua +++ b/modpol/orgs/orgs.lua @@ -1,7 +1,7 @@ -- =================================================================== -- /orgs.lua -- Org-related functions for Modular Politics --- Called by modpol.lua +-- Called by modpol/modpol/api.lua -- =================================================================== -- Function: modpol.record @@ -47,14 +47,14 @@ end modpol.add_org = function (org_name, members) local str - if ocutil.str_empty (org_name) then + if modpol.ocutil.str_empty (org_name) then return "Error: Org needs a name" end - ocutil.log ("Adding org " .. org_name) + modpol.ocutil.log ("Adding org " .. org_name) if modpol.orgs [org_name] ~= nil then str = "Error: Org " .. org_name .. " already exists" - ocutil.log (str) + modpol.ocutil.log (str) return str end @@ -82,7 +82,7 @@ modpol.list_orgs = function() -- Process next "org" -- Build string version of member list local memcat = org_data ["members"] - if ocutil.str_empty (memcat) then + if modpol.ocutil.str_empty (memcat) then memcat = "(empty)" else memcat = "(" .. table.concat (memcat, ", ") .. ")" @@ -120,10 +120,14 @@ modpol.add_member = function(org, member) if (modpol.orgs[org] == nil) then return "Error: No such org" else - table.insert(modpol.orgs[org]["members"], member) - local message = member .. " added to org " .. org - modpol.record(message, org) - return message + if modpol.is_member(org,member) then + return "Error: " .. member .. " is already a member of " .. org + else + table.insert(modpol.orgs[org]["members"], member) + local message = member .. " added to org " .. org + modpol.record(message, org) + return message + end end end diff --git a/processes.lua b/modpol/processes/processes.lua similarity index 98% rename from processes.lua rename to modpol/processes/processes.lua index dcf3142..729db67 100644 --- a/processes.lua +++ b/modpol/processes/processes.lua @@ -1,5 +1,5 @@ -- =================================================================== --- /prcesses.lua +-- /processes.lua -- Process-related functions for Modular Politics -- Called by modpol.lua diff --git a/users.lua b/modpol/users/users.lua similarity index 100% rename from users.lua rename to modpol/users/users.lua diff --git a/modpol_minetest/api.lua b/modpol_minetest/api.lua new file mode 100644 index 0000000..37d6c5d --- /dev/null +++ b/modpol_minetest/api.lua @@ -0,0 +1,40 @@ +--call all files in this directory + + + +-- =================================================================== +-- Minetest Specific Overrides of modpol functions +-- =================================================================== + + +local localdir = modpol.get_script_dir() .. "/modpol_minetest" + +--Users +dofile (localdir .. "/overrides/users/users.lua") + +--orgs +--dofile (localdir .. "/overrides/orgs/orgs.lua") + +--interactions +dofile (localdir .. "/overrides/interactions/interactions.lua") + +-- messaging functions +-- dofile (localdir .. "/overrides/processes/processes.lua") + + + +-- =================================================================== +-- Minetest Chatcommands +-- =================================================================== +dofile (localdir .. "/chatcommands/chatcommands.lua") + + +-- =================================================================== +-- Minetest Specific code +-- =================================================================== + + +-- orgs +-- =================== + +dofile (localdir .. "/orgs/instance.lua") --add players to the instance when they join. \ No newline at end of file diff --git a/modpol_minetest/chatcommands/chatcommands.lua b/modpol_minetest/chatcommands/chatcommands.lua new file mode 100644 index 0000000..ecfd082 --- /dev/null +++ b/modpol_minetest/chatcommands/chatcommands.lua @@ -0,0 +1,78 @@ +-- =================================================================== +-- Minetest commands +-- =================================================================== + +local chat_table -- MT chat command definitions table +local regchat -- Chat-command registration function + +regchat = minetest.register_chatcommand + +-- =================================================================== +-- /addorg /add_org +-- This code defines a chat command which creates a new +-- "org". Presently, the command makes the user the sole member of the +-- "org". + +chat_table = { + privs = {} , + func = function (user, param) + local result = modpol.add_org (param, { user }) + return true, result + end +} +regchat ("addorg" , chat_table) +regchat ("add_org" , chat_table) + +-- =================================================================== +-- /listorg /listorgs /list_org /list_orgs +-- In Minetest mode, this code defines a chat command which lists the +-- existing "orgs". +-- The list shows one "org" per line in the following format: +-- org_name (member, member, ...) + +chat_table = { + privs = {} , + func = function (user, param) + return true, "Orgs:\n" .. modpol.list_orgs() + end +} + +regchat ("listorg" , chat_table) +regchat ("listorgs" , chat_table) +regchat ("list_org" , chat_table) +regchat ("list_orgs" , chat_table) + +-- =================================================================== +-- /listplayers +minetest.register_chatcommand( + "listplayers", { + privs = {}, + func = function(user) + local result = table.concat(modpol.list_users(),", ") + return true, "All players: " .. result + end, +}) + +-- =================================================================== +-- /joinorg +minetest.register_chatcommand( + "joinorg", { + privs = {}, + func = function(user, param) + local result = modpol.add_member(param, user) + return true, result + end, +}) + + +-- =================================================================== +-- /pollself [question] +-- asks the user a question specified in param +minetest.register_chatcommand( + "pollself", { + privs = {}, + func = function(user, param) + modpol.binary_poll_user(user, param) + return true, result + end, +}) diff --git a/modpol_minetest/orgs/instance.lua b/modpol_minetest/orgs/instance.lua new file mode 100644 index 0000000..8e2ea50 --- /dev/null +++ b/modpol_minetest/orgs/instance.lua @@ -0,0 +1,6 @@ +--add members to the instance, if they are not already there. + +minetest.register_on_joinplayer(function(player) + local p_name = player:get_player_name() + modpol.add_member("instance", p_name) +end) \ No newline at end of file diff --git a/modpol_minetest/overrides/interactions/interactions.lua b/modpol_minetest/overrides/interactions/interactions.lua new file mode 100644 index 0000000..34560fe --- /dev/null +++ b/modpol_minetest/overrides/interactions/interactions.lua @@ -0,0 +1,44 @@ + + +-- =================================================================== +-- Function: modpol.binary_poll_user(user, question) +-- Overwrites function at /interactions.lua +-- presents a yes/no/abstain poll to a user, returns answer +modpol.binary_poll_user = function(user, question) + -- set up formspec + local text = "Poll: " .. question + local formspec = { + "formspec_version[4]", + "size[5,3]", + "label[0.375,0.5;", minetest.formspec_escape(text), "]", + "button[1,1.5;1,0.8;yes;Yes]", + "button[2,1.5;1,0.8;no;No]", + "button[3,1.5;1,0.8;abstain;Abstain]" + --TKTK can we enable text wrapping? + --TKTK we could use scroll boxes to contain the text + } + local formspec_string = table.concat(formspec, "") + -- present to player + minetest.show_formspec(user, "modpol:binary_poll", formspec_string) + end + +--what to do + minetest.register_on_player_receive_fields(function (player, formname, fields) + -- modpol:poll + if formname == "modpol:binary_poll" then + local pname = player:get_player_name() + local vote = nil + if fields.yes then vote = fields.yes + elseif fields.no then vote = fields.no + elseif fields.abstain then vote = fields.abstain + end + if vote then + minetest.chat_send_all(pname .. " voted " .. vote) + --TKTK : we should send the message to all in that org, definately not to all players + end + minetest.close_formspec(pname, formname) + return vote + else -- if the form is not a recognized name + return + end +end) \ No newline at end of file diff --git a/modpol_minetest/overrides/users/users.lua b/modpol_minetest/overrides/users/users.lua new file mode 100644 index 0000000..229ebfb --- /dev/null +++ b/modpol_minetest/overrides/users/users.lua @@ -0,0 +1,21 @@ + +-- =================================================================== +-- Function: modpol.list_users(org) +-- Overwrites function at /users.lua +-- Params: +-- if nil, lists instance members; if an org name, lists its members +-- Output: a table with names of players currently in the game +modpol.list_users = function(org) + local users = {} + if (org == nil) then -- no specified org; all players + for _,player in ipairs(minetest.get_connected_players()) do + local name = player:get_player_name() + table.insert(users,name) + end + else -- if an org is specified + if (modpol.orgs[org] ~= nil) then -- org exists + users = modpol.orgs[org]["members"] + end + end + return users + end \ No newline at end of file diff --git a/storage-local.lua b/storage/storage-local.lua similarity index 65% rename from storage-local.lua rename to storage/storage-local.lua index d1b0999..20f8544 100644 --- a/storage-local.lua +++ b/storage/storage-local.lua @@ -12,47 +12,47 @@ modpol.file_orgs = modpol.datadir .. "/orgs.dat" os.execute ("mkdir -p " .. modpol.datadir) -ocutil.setlogdir (modpol.datadir) -ocutil.setlogname ("modpol.log") +modpol.ocutil.setlogdir (modpol.datadir) +modpol.ocutil.setlogname ("modpol.log") -- =================================================================== -- Set up the Serpent Serializer functions. modpol.serpent = {} -dofile (modpol.topdir .. "/serpent/serpent.lua") +dofile (modpol.topdir .. "/util/serpent/serpent.lua") -- =================================================================== -- This function stores "ledger" data to disk. local store_ledger = function() - local ok = ocutil.file_write (modpol.file_ledger, + local ok = modpol.ocutil.file_write (modpol.file_ledger, modpol.serpent.dump (modpol.ledger)) if ok ~= true then - ocutil.fatal_error ("store_data: ledger") + modpol.ocutil.fatal_error ("store_data: ledger") end - local nn = ocutil.table_length (modpol.ledger) + local nn = modpol.ocutil.table_length (modpol.ledger) local str = "entries" if nn == 1 then str = "entry" end - ocutil.log (nn .. " global ledger entries stored to disk") + modpol.ocutil.log (nn .. " global ledger entries stored to disk") end -- =================================================================== -- This function stores "orgs" data to disk. local store_orgs = function() - local ok = ocutil.file_write (modpol.file_orgs, + local ok = modpol.ocutil.file_write (modpol.file_orgs, modpol.serpent.dump (modpol.orgs)) if ok ~= true then - ocutil.fatal_error ("store_data: orgs") + modpol.ocutil.fatal_error ("store_data: orgs") end - local nn = ocutil.table_length (modpol.orgs) + local nn = modpol.ocutil.table_length (modpol.orgs) local str = "entries" if nn == 1 then str = "entry" end - ocutil.log (nn .. " orgs stored to disk") + modpol.ocutil.log (nn .. " orgs stored to disk") end -- =================================================================== @@ -67,20 +67,20 @@ end -- This function loads "ledger" data from disk. local load_ledger = function() - local obj = ocutil.file_read (modpol.file_ledger ) + local obj = modpol.ocutil.file_read (modpol.file_ledger ) if obj ~= nil then local func, err = load (obj) if err then - ocutil.fatal_error ("load_data: ledger" ) + modpol.ocutil.fatal_error ("load_data: ledger" ) end modpol.ledger = func() - local nn = ocutil.table_length (modpol.ledger) + local nn = modpol.ocutil.table_length (modpol.ledger) local str = "entries" if nn == 1 then str = "entry" end - ocutil.log (nn .. " global ledger entries loaded from disk") + modpol.ocutil.log (nn .. " global ledger entries loaded from disk") else - ocutil.log ("No stored global ledger data found") + modpol.ocutil.log ("No stored global ledger data found") end end @@ -88,20 +88,20 @@ end -- This function loads "orgs" data from disk. local load_orgs = function() - local obj = ocutil.file_read (modpol.file_orgs ) + local obj = modpol.ocutil.file_read (modpol.file_orgs ) if obj ~= nil then local func, err = load (obj) if err then - ocutil.fatal_error ("load_data: orgs" ) + modpol.ocutil.fatal_error ("load_data: orgs" ) end modpol.orgs = func() - local nn = ocutil.table_length (modpol.orgs) + local nn = modpol.ocutil.table_length (modpol.orgs) local str = "entries" if nn == 1 then str = "entry" end - ocutil.log (nn .. " orgs loaded from disk") + modpol.ocutil.log (nn .. " orgs loaded from disk") else - ocutil.log ("No stored orgs data found") + modpol.ocutil.log ("No stored orgs data found") end end diff --git a/storage-mod_storage.lua b/storage/storage-mod_storage.lua similarity index 92% rename from storage-mod_storage.lua rename to storage/storage-mod_storage.lua index 8d57b97..be890eb 100644 --- a/storage-mod_storage.lua +++ b/storage/storage-mod_storage.lua @@ -4,8 +4,15 @@ -- See https://dev.minetest.net/StorageRef -- Loads content of stored orgs and ledger from mod_storage + + +--get modstorageref +local mod_storage = minetest.get_mod_storage() + + + modpol.load_storage = function() - local mod_storage = minetest.get_mod_storage() + -- load orgs local stored_orgs = minetest.deserialize(mod_storage:get_string("orgs")) if (stored_orgs ~= nil) then @@ -20,6 +27,7 @@ end -- Stores content of current orgs and ledger to mod_storage modpol.store_data = function() + -- write to storage mod_storage:set_string("orgs", minetest.serialize(modpol.orgs)) mod_storage:set_string("ledger", minetest.serialize(modpol.ledger)) diff --git a/ocutil.lua b/util/ocutil/ocutil.lua similarity index 79% rename from ocutil.lua rename to util/ocutil/ocutil.lua index 7d4e3f1..f943be4 100644 --- a/ocutil.lua +++ b/util/ocutil/ocutil.lua @@ -1,7 +1,7 @@ -- =================================================================== -- Overview. --- This file is "top/ocutil.lua". +-- This file is "top/modpol.ocutil.lua". -- This file provides a collection of largely portable Lua utility -- functions. The collection is descended from one assembled by Old- @@ -9,15 +9,15 @@ -- =================================================================== -ocutil = {} +modpol.ocutil = {} -ocutil.log_console = true -- Flag: Copy log to console -ocutil.logdir = nil -- Absolute path for log-file direc- +modpol.ocutil.log_console = true -- Flag: Copy log to console +modpol.ocutil.logdir = nil -- Absolute path for log-file direc- -- tory (or nil) -- =================================================================== --- Function: ocutil.fixnil +-- Function: modpol.ocutil.fixnil -- Params: string s -- Outputs: -- @@ -30,7 +30,7 @@ ocutil.logdir = nil -- Absolute path for log-file direc- -- =================================================================== -ocutil.fixnil = function (s) +modpol.ocutil.fixnil = function (s) if s == nil then s = "(nil)" elseif s == "" then s = "(empty)" end @@ -39,46 +39,46 @@ end -- =================================================================== --- Function: ocutil.setlogdir +-- Function: modpol.ocutil.setlogdir -- Params: string path -- Outputs: -- -- The input string should be the absolute path for a writable direc- --- tory that already exists. This function tells "ocutil.log" to put +-- tory that already exists. This function tells "modpol.ocutil.log" to put -- log files in that directory. -- =================================================================== -ocutil.setlogdir = function (path) +modpol.ocutil.setlogdir = function (path) if path ~= nil and path ~= "" then - ocutil.logdir = path + modpol.ocutil.logdir = path end end -- =================================================================== --- Function: ocutil.setlogname +-- Function: modpol.ocutil.setlogname -- Params: string name -- Outputs: -- -- The input string should be a filename without a path component. --- This function tells "ocutil.log" to use the specified filename for +-- This function tells "modpol.ocutil.log" to use the specified filename for -- the main log file. -- --- "ocutil.setlogdir" must be called separately to set the log-file +-- "modpol.ocutil.setlogdir" must be called separately to set the log-file -- directory. -- =================================================================== -ocutil.setlogname = function (name) +modpol.ocutil.setlogname = function (name) if name ~= nil and name ~= "" then - ocutil.logname = name + modpol.ocutil.logname = name end end -- =================================================================== --- Function: ocutil.log +-- Function: modpol.ocutil.log -- Params: string s -- Outputs: -- @@ -87,26 +87,26 @@ end -- =================================================================== -ocutil.log = function (s) - s = ocutil.fixnil (s) +modpol.ocutil.log = function (s) + s = modpol.ocutil.fixnil (s) s = s:gsub ("\n$", "", 1) -- Remove trailing newline initially - if ocutil.log_console then + if modpol.ocutil.log_console then print (s) end - if ocutil.logdir ~= nil and - ocutil.logname ~= nil then + if modpol.ocutil.logdir ~= nil and + modpol.ocutil.logname ~= nil then s = s .. "\n" -- Add trailing newline - local logpath = ocutil.logdir .. "/" .. ocutil.logname - ocutil.file_append (logpath, s) + local logpath = modpol.ocutil.logdir .. "/" .. modpol.ocutil.logname + modpol.ocutil.file_append (logpath, s) end end -- =================================================================== --- Function: ocutil.fatal_error +-- Function: modpol.ocutil.fatal_error -- Params: string s -- Outputs: -- @@ -115,15 +115,15 @@ end -- =================================================================== -ocutil.fatal_error = function (s) - ocutil.log ("Fatal Error: " .. s) +modpol.ocutil.fatal_error = function (s) + modpol.ocutil.log ("Fatal Error: " .. s) os.exit (1) return nil -- Shouldn't be reached end -- =================================================================== --- Function: ocutil.panic +-- Function: modpol.ocutil.panic -- Params: string s -- Outputs: -- @@ -132,15 +132,15 @@ end -- =================================================================== -ocutil.panic = function (s) - ocutil.log ("Internal Error: " .. s) +modpol.ocutil.panic = function (s) + modpol.ocutil.log ("Internal Error: " .. s) os.exit (1) return nil -- Shouldn't be reached end -- =================================================================== --- Function: ocutil.str_empty +-- Function: modpol.ocutil.str_empty -- Params: string x -- Outputs: -- @@ -149,7 +149,7 @@ end -- =================================================================== -ocutil.str_empty = function (x) +modpol.ocutil.str_empty = function (x) if x == nil or x == "" then return true else @@ -159,7 +159,7 @@ end -- =================================================================== --- Function: ocutil.str_nonempty +-- Function: modpol.ocutil.str_nonempty -- Params: string x -- Outputs: -- @@ -168,7 +168,7 @@ end -- =================================================================== -ocutil.str_nonempty = function (x) +modpol.ocutil.str_nonempty = function (x) if x == nil or x == "" then return false else @@ -178,7 +178,7 @@ end -- =================================================================== --- Function: ocutil.table_empty +-- Function: modpol.ocutil.table_empty -- Params: table tab -- Outputs: -- @@ -187,7 +187,7 @@ end -- =================================================================== -ocutil.table_empty = function (tab) +modpol.ocutil.table_empty = function (tab) local next = next if next (tab) == nil then return true end return false @@ -195,7 +195,7 @@ end -- =================================================================== --- Function: ocutil.table_nonempty +-- Function: modpol.ocutil.table_nonempty -- Params: table tab -- Outputs: -- @@ -204,14 +204,14 @@ end -- =================================================================== -ocutil.table_nonempty = function (tab) - if ocutil.table_empty (tab) then return false end +modpol.ocutil.table_nonempty = function (tab) + if modpol.ocutil.table_empty (tab) then return false end return true end -- =================================================================== --- Function: ocutil.string_contains +-- Function: modpol.ocutil.string_contains -- Params: strings a, b -- Outputs: -- @@ -220,7 +220,7 @@ end -- =================================================================== -ocutil.str_contains = function (a, b) +modpol.ocutil.str_contains = function (a, b) if string.match (a, b) then return true else @@ -230,7 +230,7 @@ end -- =================================================================== --- Function: ocutil.str_false +-- Function: modpol.ocutil.str_false -- Params: string x -- Outputs: -- @@ -240,7 +240,7 @@ end -- =================================================================== -ocutil.str_false = function (x) +modpol.ocutil.str_false = function (x) if x == "false" or x == "no" or x == "off" or x == "0" or x == false or x == 0 then @@ -252,7 +252,7 @@ end -- =================================================================== --- Function: ocutil.str_true +-- Function: modpol.ocutil.str_true -- Params: string x -- Outputs: -- @@ -262,7 +262,7 @@ end -- =================================================================== -ocutil.str_true = function (x) +modpol.ocutil.str_true = function (x) if x == "true" or x == "yes" or x == "on" or x == "1" or x == true or x == 1 then @@ -274,7 +274,7 @@ end -- =================================================================== --- Function: ocutil.starts_with +-- Function: modpol.ocutil.starts_with -- Params: strings String, Start -- Outputs: -- @@ -283,7 +283,7 @@ end -- =================================================================== -ocutil.starts_with = function (String, Start) +modpol.ocutil.starts_with = function (String, Start) if string.sub (String, 1, string.len (Start)) == Start then return true else @@ -293,7 +293,7 @@ end -- =================================================================== --- Function: ocutil.not_starts_with +-- Function: modpol.ocutil.not_starts_with -- Params: strings String, Start -- Outputs: -- @@ -302,7 +302,7 @@ end -- =================================================================== -ocutil.not_starts_with = function (String, Start) +modpol.ocutil.not_starts_with = function (String, Start) if string.sub (String, 1, string.len (Start)) == Start then return false else @@ -312,7 +312,7 @@ end -- =================================================================== --- Function: ocutil.ends_with +-- Function: modpol.ocutil.ends_with -- Params: strings String, End -- Outputs: -- @@ -322,14 +322,14 @@ end -- =================================================================== -ocutil.ends_with = function (String, End) +modpol.ocutil.ends_with = function (String, End) return End == '' or string.sub (String, -string.len (End)) == End end -- =================================================================== --- Function: ocutil.not_ends_with +-- Function: modpol.ocutil.not_ends_with -- Params: strings String, End -- Outputs: -- Returns false if the 1st string ends with the 2nd one @@ -338,8 +338,8 @@ end -- =================================================================== -ocutil.not_ends_with = function (String, End) - if ocutil.ends_with (String, End) then +modpol.ocutil.not_ends_with = function (String, End) + if modpol.ocutil.ends_with (String, End) then return false else return true @@ -348,33 +348,33 @@ end -- =================================================================== --- Function: ocutil.firstch +-- Function: modpol.ocutil.firstch -- Params: string str -- Outputs: -- Returns the 1st character of the string -- =================================================================== -ocutil.firstch = function (str) +modpol.ocutil.firstch = function (str) return string.sub (str, 1, 1) end -- =================================================================== --- Function: ocutil.first_to_upper +-- Function: modpol.ocutil.first_to_upper -- Params: string str -- Outputs: -- Returns the 1st character of the string in upper case -- =================================================================== -ocutil.first_to_upper = function (str) +modpol.ocutil.first_to_upper = function (str) return (str:gsub ("^%l", string.upper)) end -- =================================================================== --- Function: ocutil.all_first_to_upper +-- Function: modpol.ocutil.all_first_to_upper -- Params: string str, flag cvtspace -- Outputs: -- @@ -385,13 +385,13 @@ end -- =================================================================== -ocutil.all_first_to_upper = function (str, cvtspace) +modpol.ocutil.all_first_to_upper = function (str, cvtspace) str = str:gsub ("^%l", string.upper) str = str:gsub ("[_ ]%l", function (a) return string.upper (a) end) - if ocutil.str_true (cvtspace) then + if modpol.ocutil.str_true (cvtspace) then str = str:gsub ("_", " ") end @@ -400,7 +400,7 @@ end -- =================================================================== --- Function: ocutil.strtok +-- Function: modpol.ocutil.strtok -- Params: strings source, delimitch -- Outputs: -- @@ -413,7 +413,7 @@ end -- =================================================================== -ocutil.strtok = function (source, delimitch) +modpol.ocutil.strtok = function (source, delimitch) if delimitch == nil or delimitch == "" then delimitch = " " end @@ -432,7 +432,7 @@ end -- =================================================================== --- Function: ocutil.swap_key_value +-- Function: modpol.ocutil.swap_key_value -- Params: table itable -- Outputs: -- Turns keys into values and vice versa and returns the resulting @@ -440,7 +440,7 @@ end -- =================================================================== -ocutil.swap_key_value = function (itable) +modpol.ocutil.swap_key_value = function (itable) if itable == nil then return nil end local otable = {} for key, value in pairs (itable) do otable [value] = key end @@ -449,7 +449,7 @@ end -- =================================================================== --- Function: ocutil.ktable_to_vtable +-- Function: modpol.ocutil.ktable_to_vtable -- Params: table ktable -- Outputs: -- @@ -476,7 +476,7 @@ end -- print (ii .. ") " .. tabby [ii]) -- end -- --- tabby = ocutil.ktable_to_vtable (tabby) +-- tabby = modpol.ocutil.ktable_to_vtable (tabby) -- -- print ("\nOutput table:") -- for ii, value in ipairs (tabby) do @@ -485,7 +485,7 @@ end -- =================================================================== -ocutil.ktable_to_vtable = function (ktable) +modpol.ocutil.ktable_to_vtable = function (ktable) local vtable = {} if ktable == nil then return vtable end @@ -499,7 +499,7 @@ end -- =================================================================== --- Function: ocutil.vtable_to_ktable +-- Function: modpol.ocutil.vtable_to_ktable -- Params: table vtable, scalar set_to -- Outputs: -- @@ -524,7 +524,7 @@ end -- print (ii .. ") " .. tabby [ii]) -- end -- --- tabby = ocutil.vtable_to_ktable (tabby, 42) +-- tabby = modpol.ocutil.vtable_to_ktable (tabby, 42) -- -- print ("\nOutput table:") -- for ii, value in pairs (tabby) do @@ -533,7 +533,7 @@ end -- =================================================================== -ocutil.vtable_to_ktable = function (vtable, set_to) +modpol.ocutil.vtable_to_ktable = function (vtable, set_to) local ktable = {} if vtable == nil then return ktable end @@ -548,7 +548,7 @@ end -- =================================================================== --- Function: ocutil.make_set +-- Function: modpol.ocutil.make_set -- Params: array harry -- Outputs: -- @@ -559,12 +559,12 @@ end -- Here's a complete code fragment which demonstrates operation of -- this function: -- --- local color_set = ocutil.make_set { "red", "green", "blue" } +-- local color_set = modpol.ocutil.make_set { "red", "green", "blue" } -- if color_set ["red"] ~= nil then print ("Supported color") end -- =================================================================== -ocutil.make_set = function (list) +modpol.ocutil.make_set = function (list) local set = {} for _, l in ipairs (list) do set [l] = true end return set @@ -572,7 +572,7 @@ end -- =================================================================== --- Function: ocutil.pos_to_str +-- Function: modpol.ocutil.pos_to_str -- Params: position-table pos -- Outputs: -- @@ -583,13 +583,13 @@ end -- =================================================================== -ocutil.pos_to_str = function (pos) +modpol.ocutil.pos_to_str = function (pos) return pos.x .. "," .. pos.y .. "," .. pos.z end -- =================================================================== --- Function: ocutil.table_length +-- Function: modpol.ocutil.table_length -- Params: table tabby -- Outputs: Returns number of entries in table -- @@ -598,7 +598,7 @@ end -- =================================================================== -ocutil.table_length = function (tabby) +modpol.ocutil.table_length = function (tabby) local count = 0 for _ in pairs (tabby) do count = count+1 end return count @@ -606,7 +606,7 @@ end -- =================================================================== --- Function: ocutil.clone_table +-- Function: modpol.ocutil.clone_table -- Params: table tabby -- Outputs: -- @@ -614,25 +614,25 @@ end -- should work correctly for most cases, but special cases that re- -- quire additional work may exist. -- --- This function may also be called as "ocutil.table_clone". +-- This function may also be called as "modpol.ocutil.table_clone". -- =================================================================== -ocutil.clone_table = function (tabby) +modpol.ocutil.clone_table = function (tabby) if tabby == nil then return nil end local copy = {} for k, v in pairs (tabby) do - if type (v) == 'table' then v = ocutil.clone_table (v) end + if type (v) == 'table' then v = modpol.ocutil.clone_table (v) end copy [k] = v end return copy end -ocutil.table_clone = ocutil.clone_table +modpol.ocutil.table_clone = modpol.ocutil.clone_table -- =================================================================== --- Function: ocutil.file_exists +-- Function: modpol.ocutil.file_exists -- Params: string path -- Outputs: -- @@ -642,7 +642,7 @@ ocutil.table_clone = ocutil.clone_table -- =================================================================== -ocutil.file_exists = function (path) +modpol.ocutil.file_exists = function (path) local file, err file, err = io.open (path, "rb") if err then return false end @@ -652,7 +652,7 @@ end -- =================================================================== --- Function: ocutil.file_missing +-- Function: modpol.ocutil.file_missing -- Params: string path -- Outputs: -- @@ -662,14 +662,14 @@ end -- =================================================================== -ocutil.file_missing = function (path) - if ocutil.file_exists (path) then return false end +modpol.ocutil.file_missing = function (path) + if modpol.ocutil.file_exists (path) then return false end return true end -- =================================================================== --- Function: ocutil.file_read +-- Function: modpol.ocutil.file_read -- Params: string path -- Outputs: -- @@ -681,7 +681,7 @@ end -- =================================================================== -ocutil.file_read = function (path) +modpol.ocutil.file_read = function (path) local file, err file, err = io.open (path, "rb") if err then return nil end @@ -692,7 +692,7 @@ end -- =================================================================== --- Function: ocutil.file_write +-- Function: modpol.ocutil.file_write -- Params: strings path, data -- Outputs: -- @@ -707,7 +707,7 @@ end -- =================================================================== -ocutil.file_write = function (path, data) +modpol.ocutil.file_write = function (path, data) local file, err file, err = io.open (path, "wb") if err then return false end @@ -719,17 +719,17 @@ end -- =================================================================== --- Function: ocutil.file_append +-- Function: modpol.ocutil.file_append -- Params: strings path, data -- Outputs: -- --- This function is identical to "ocutil.file_write" except for one +-- This function is identical to "modpol.ocutil.file_write" except for one -- difference: It appends to existing files as opposed to overwrites -- them. -- =================================================================== -ocutil.file_append = function (path, data) +modpol.ocutil.file_append = function (path, data) local file, err file, err = io.open (path, "ab") if err then return false end diff --git a/serpent/LICENSE.txt b/util/serpent/LICENSE.txt similarity index 100% rename from serpent/LICENSE.txt rename to util/serpent/LICENSE.txt diff --git a/serpent/README.md b/util/serpent/README.md similarity index 100% rename from serpent/README.md rename to util/serpent/README.md diff --git a/serpent/serpent-git.tar.bz2 b/util/serpent/serpent-git.tar.bz2 similarity index 100% rename from serpent/serpent-git.tar.bz2 rename to util/serpent/serpent-git.tar.bz2 diff --git a/serpent/serpent.lua b/util/serpent/serpent.lua similarity index 100% rename from serpent/serpent.lua rename to util/serpent/serpent.lua